Générateur de mickey

Description

petite tête de mickey qui tourne...
4 sphere une lumiere et beaucoup de calcul pour une tete de mickey.

Source / Exemple :


Comment#
   Asmik.Asm 
   94/95
Comment#
;Jumps
.586P
;.387
;Locals @@
Vrais  Equ 0
Faux   Equ 255

Vector  Struc  ;           12 Octets de Vecteur;
        Vector_1   DD ? ;
        Vector_2   DD ? ;
        Vector_3   DD ? ;
Vector EndS

Matrice Struc  ;           48 Octets de Matrice
        Matrice1_1 DD ?
        Matrice1_2 DD ?
        Matrice1_3 DD ?
        Matrice2_1 DD ?
        Matrice2_2 DD ?
        Matrice2_3 DD ?
        Matrice3_1 DD ?
        Matrice3_2 DD ?
        Matrice3_3 DD ?
Matrice EndS

; Quelque Structure Lourde
V3t Struc      ;           definition d'une coordonnee 12 Octets
    X   DD 0
    Y   DD 0
    Z   DD 0
V3t Ends
;               ; Definition d'un Pigment
Ct  Struc       ; 12 Octets de pigment;
    R   DD 0    ; 0.0 -> 1.0
    G   DD 0
    B   DD 0
Ct  Ends

RayT Struc      ; Definition d'un rayon 24 Octets
     RP  V3t <0,0,0>
     RN  V3t <0,0,0>
RayT EndS

SphereT Struc   ; definition d'une sphere
     M    V3t <0,0,0> ; coordonnee centre
     Sqrr DD 0  ; Rayon Single
SphereT EndS

; Definition d'une Surface
SurfT Struc
      SOd      Ct <0,0,0>
      SOe      DD  0 ; Single
      SN       DD  0 ; Single
      SRefl    Dw  0 ; Boolean ; reflection
      STrans   Dw  0 ; Boolean ; Transparence
      SSpecC   Ct <0,0,0>;
      STransC  Ct <0,0,0>;
      SColProc DW  0 ; Offset Procedure de Couleur
      STypProc DW  0 ; Offset Procedure de Typage
SurfT Ends

StartC Segment Para Public Use16 'CODE'
Assume CS:StartC,DS:StartC,SS:StartC
Org 100h
StartHere:
Jmp Demarre
Db ' Pov2Com V1.0 '
Db ' B.Y.O 1995 Pigment '
;Include Pigment.asm    ; Liste des Pigments de pov pr?traduite
;  Pigment
Gray05                  Dd 03D4CCCCDh,03D4CCCCDh,03D4CCCCDh;
Gray10                  Dd 03DCCCCCDh,03DCCCCCDh,03DCCCCCDh;
Gray15                  Dd 03E19999Ah,03E19999Ah,03E19999Ah;
Gray20                  Dd 03E4CCCCDh,03E4CCCCDh,03E4CCCCDh;
Gray25                  Dd 03E800000h,03E800000h,03E800000h;
Gray30                  Dd 03E99999Ah,03E99999Ah,03E99999Ah;
Gray35                  Dd 03EB33333h,03EB33333h,03EB33333h;
Gray40                  Dd 03ECCCCCDh,03ECCCCCDh,03ECCCCCDh;
Gray45                  Dd 03EE66666h,03EE66666h,03EE66666h;
Gray50                  Dd 03F000000h,03F000000h,03F000000h;
Gray55                  Dd 03F0CCCCDh,03F0CCCCDh,03F0CCCCDh;
Gray60                  Dd 03F19999Ah,03F19999Ah,03F19999Ah;
Gray65                  Dd 03F266666h,03F266666h,03F266666h;
Gray70                  Dd 03F333333h,03F333333h,03F333333h;
Gray75                  Dd 03F400000h,03F400000h,03F400000h;
Gray80                  Dd 03F4CCCCDh,03F4CCCCDh,03F4CCCCDh;
Gray85                  Dd 03F59999Ah,03F59999Ah,03F59999Ah;
Gray90                  Dd 03F666666h,03F666666h,03F666666h;
Gray95                  Dd 03F733333h,03F733333h,03F733333h;
DimGray                 Dd 03EA8A8B1h,03EA8A8B1h,03EA8A8B1h;
DimGrey                 Dd 03EA8A8B1h,03EA8A8B1h,03EA8A8B1h;
Gray                    Dd 03F40C0BEh,03F40C0BEh,03F40C0BEh;
Grey                    Dd 03F40C0BEh,03F40C0BEh,03F40C0BEh;
LightGray               Dd 03F28A8B1h,03F28A8B1h,03F28A8B1h;
LightGrey               Dd 03F28A8B1h,03F28A8B1h,03F28A8B1h;
VLightGrey              Dd 03F4CCCCDh,03F4CCCCDh,03F4CCCCDh;
White                   Dd 03F800000h,03F800000h,03F800000h;
Red                     Dd 03F800000h,000000000h,000000000h;
Green                   Dd 000000000h,03F800000h,000000000h;
Blue                    Dd 000000000h,000000000h,03F800000h;
Yellow                  Dd 03F800000h,03F800000h,000000000h;
Cyan                    Dd 000000000h,03F800000h,03F800000h;
Magenta                 Dd 03F800000h,03F800000h,03F800000h;
Black                   Dd 000000000h,000000000h,000000000h;
Aquamarine              Dd 03EE0E0EBh,03F5BDBE4h,03F13939Ah;
BlueViolet              Dd 03F1F9F02h,03EBEBEBEh,03F1F9F99h;
Brown                   Dd 03F25A5A9h,03E28A8B1h,03E28A8B1h;
CadetBlue               Dd 03EBEBEBEh,03F1F9F99h,03F1F9F99h;
Coral                   Dd 03F800000h,03EFEFEF8h,000000000h;
CornflowerBlue          Dd 03E848494h,03E848494h,03EDEDEDBh;
DarkGreen               Dd 03E3CBCCFh,03E9E9EA1h,03E3CBCCFh;
DarkOliveGreen          Dd 03E9E9EA1h,03E9E9EA1h,03E3CBCCFh;
DarkOrchid              Dd 03F19999Ah,03E48C8ACh,03F4CCCCDh;
DarkSlateBlue           Dd 03ED6D6DCh,03E0C8C93h,03F0E8E93h;
DarkSlateGray           Dd 03E3CBCCFh,03E9E9EA1h,03E9E9EA1h;
DarkSlateGrey           Dd 03E3CBCCFh,03E9E9EA1h,03E9E9EA1h;
DarkTurquoise           Dd 03EE0E0EBh,03F13939Ah,03F5BDBE4h;
Firebrick               Dd 03F0E8E93h,03E0C8C93h,03E0C8C93h;
ForestGreen             Dd 03E0C8C93h,03F0E8E93h,03E0C8C93h;
Gold                    Dd 03F4CCCCDh,03EFEFEF8h,03E48C8ACh;
Goldenrod               Dd 03F5BDBE4h,03F5BDBE4h,03EE0E0EBh;
GreenYellow             Dd 03F13939Ah,03F5BDBE4h,03EE0E0EBh;
IndianRed               Dd 03E9E9EA1h,03E3CBCCFh,03E3CBCCFh;
Khaki                   Dd 03F1F9F99h,03F1F9F99h,03EBEBEBEh;
LightBlue               Dd 03F3FBFC6h,03F58D8DCh,03F58D8DCh;
LightSteelBlue          Dd 03F0F8F8Ah,03F0F8F8Ah,03F3CBCBEh;
LimeGreen               Dd 03E48C8ACh,03F4CCCCDh,03E48C8ACh;
Maroon                  Dd 03F0E8E93h,03E0C8C93h,03ED6D6DCh;
MediumAquamarine        Dd 03E48C8ACh,03F4CCCCDh,03F19999Ah;
MediumBlue              Dd 03E48C8ACh,03E48C8ACh,03F4CCCCDh;
MediumForestGreen       Dd 03ED6D6DCh,03F0E8E93h,03E0C8C93h;
MediumGoldenrod         Dd 03F6AEAEAh,03F6AEAEAh,03F2DADA7h;
MediumOrchid            Dd 03F13939Ah,03EE0E0EBh,03F5BDBE4h;
MediumSeaGreen          Dd 03E848494h,03EDEDEDBh,03E848494h;
MediumSlateBlue         Dd 03EFEFEF8h,03F800000h,000000000h;
MediumSpringGreen       Dd 03EFEFEF8h,03F800000h,000000000h;
MediumTurquoise         Dd 03EE0E0EBh,03F5BDBE4h,03F5BDBE4h;
MediumVioletRed         Dd 03F5BDBE4h,03EE0E0EBh,03F13939Ah;
MidnightBlue            Dd 03E3CBCCFh,03E3CBCCFh,03E9E9EA1h;
Navy                    Dd 03E0C8C93h,03E0C8C93h,03F0E8E93h;
NavyBlue                Dd 03E0C8C93h,03E0C8C93h,03F0E8E93h;
Orange                  Dd 03F800000h,03F000000h,000000000h;
OrangeRed               Dd 03F800000h,03EFEFEF8h,000000000h;
Orchid                  Dd 03F5BDBE4h,03EE0E0EBh,03F5BDBE4h;
PaleGreen               Dd 03F0F8F8Ah,03F3CBCBEh,03F0F8F8Ah;
Pink                    Dd 03F3CBCBEh,03F0F8F8Ah,03F0F8F8Ah;
Plum                    Dd 03F6AEAEAh,03F2DADA7h,03F6AEAEAh;
Salmon                  Dd 03EDEDEDBh,03E848494h,03E848494h;
SeaGreen                Dd 03E0C8C93h,03F0E8E93h,03ED6D6DCh;
Sienna                  Dd 03F0E8E93h,03ED6D6DCh,03E0C8C93h;
SkyBlue                 Dd 03E48C8ACh,03F19999Ah,03F4CCCCDh;
SlateBlue               Dd 000000000h,03EFEFEF8h,03F800000h;
SpringGreen             Dd 000000000h,03F800000h,03EFEFEF8h;
SteelBlue               Dd 03E0C8C93h,03ED6D6DCh,03F0E8E93h;
Tan                     Dd 03F5BDBE4h,03F13939Ah,03EE0E0EBh;
Thistle                 Dd 03F58D8DCh,03F3FBFC6h,03F58D8DCh;
Turquoise               Dd 03F2DADA7h,03F6AEAEAh,03F6AEAEAh;
Violet                  Dd 03E9E9EA1h,03E3CBCCFh,03E9E9EA1h;
VioletRed               Dd 03F4CCCCDh,03E48C8ACh,03F19999Ah;
Wheat                   Dd 03F58D8DCh,03F58D8DCh,03F3FBFC6h;
YellowGreen             Dd 03F19999Ah,03F4CCCCDh,03E48C8ACh;
SummerSky               Dd 03E6147AEh,03F30A3D7h,03F5EB852h;
RichBlue                Dd 03EB33333h,03EB33333h,03F2B851Fh;
Brass                   Dd 03F35C28Fh,03F266666h,03E851EB8h;
Copper                  Dd 03F3851ECh,03EE66666h,03E4CCCCDh;
Bronze                  Dd 03F0CCCCDh,03EF0A3D7h,03E0F5C29h;
Bronze2                 Dd 03F266666h,03EFAE148h,03E75C28Fh;
Silver                  Dd 03F666666h,03F68F5C3h,03F7AE148h;
BrightGold              Dd 03F59999Ah,03F59999Ah,03DCCCCCDh;
OldGold                 Dd 03F4F5C29h,03F35C28Fh,03E6B851Fh;
Feldspar                Dd 03F51EB85h,03F11EB85h,03EEB851Fh;
Quartz                  Dd 03F59999Ah,03F59999Ah,03F733333h;
NeonPink                Dd 03F800000h,03EDC28F6h,03F47AE14h;
DarkPurple              Dd 03F07AE14h,03DF5C28Fh,03EF0A3D7h;
NeonBlue                Dd 03E99999Ah,03E99999Ah,03F800000h;
CoolCopper              Dd 03F59999Ah,03F07AE14h,03DCCCCCDh;
MandarinOrange          Dd 03F63D70Ah,03EF0A3D7h,03E4CCCCDh;
LightWood               Dd 03F68F5C3h,03F428F5Ch,03F266666h;
MediumWood              Dd 03F266666h,03F000000h,03EC7AE14h;
DarkWood                Dd 03F051EB8h,03EBD70A4h,03E851EB8h;
SpicyPink               Dd 03F800000h,03DE147AEh,03F2E147Bh;
SemiSweetChoc           Dd 03ED70A3Dh,03E851EB8h,03E19999Ah;
BakersChoc              Dd 03EB851ECh,03E4CCCCDh,03DB851ECh;
Flesh                   Dd 03F75C28Fh,03F4CCCCDh,03F30A3D7h;
NewTan                  Dd 03F6B851Fh,03F47AE14h,03F1EB852h;
NewMidnightBlue         Dd 000000000h,000000000h,03F1C28F6h;
VeryDarkBrown           Dd 03EB33333h,03E23D70Ah,03E0F5C29h;
DarkBrown               Dd 03EB851ECh,03E800000h,03E4CCCCDh;
DarkTan                 Dd 03F170A3Dh,03ED1EB85h,03E9EB852h;
GreenCopper             Dd 03EA3D70Ah,03EFAE148h,03EEB851Fh;
DkGreenCopper           Dd 03E947AE1h,03EEB851Fh,03EDC28F6h;
DustyRose               Dd 03F051EB8h,03EC7AE14h,03EC7AE14h;
HuntersGreen            Dd 03E051EB8h,03EBD70A4h,03E9EB852h;
Scarlet                 Dd 03F0CCCCDh,03DB851ECh,03DB851ECh;

;  Nom Associe au pigment
_Gray05                  Db   'Gray05',0
_Gray10                  Db   'Gray10',0
_Gray15                  Db   'Gray15',0
_Gray20                  Db   'Gray20',0
_Gray25                  Db   'Gray25',0
_Gray30                  Db   'Gray30',0
_Gray35                  Db   'Gray35',0
_Gray40                  Db   'Gray40',0
_Gray45                  Db   'Gray45',0
_Gray50                  Db   'Gray50',0
_Gray55                  Db   'Gray55',0
_Gray60                  Db   'Gray60',0
_Gray65                  Db   'Gray65',0
_Gray70                  Db   'Gray70',0
_Gray75                  Db   'Gray75',0
_Gray80                  Db   'Gray80',0
_Gray85                  Db   'Gray85',0
_Gray90                  Db   'Gray90',0
_Gray95                  Db   'Gray95',0
_DimGray                 Db   'DimGray',0
_DimGrey                 Db   'DimGrey',0
_Gray                    Db   'Gray',0
_Grey                    Db   'Grey',0
_LightGray               Db   'LightGray',0
_LightGrey               Db   'LightGrey',0
_VLightGrey              Db   'VLightGrey',0
_White                   Db   'White',0
_Red                     Db   'Red',0
_Green                   Db   'Green',0
_Blue                    Db   'Blue',0
_Yellow                  Db   'Yellow',0
_Cyan                    Db   'Cyan',0
_Magenta                 Db   'Magenta',0
_Black                   Db   'Black',0
_Aquamarine              Db   'Aquamarine',0
_BlueViolet              Db   'BlueViolet',0
_Brown                   Db   'Brown',0
_CadetBlue               Db   'CadetBlue',0
_Coral                   Db   'Coral',0
_CornflowerBlue          Db   'CornflowerBlue',0
_DarkGreen               Db   'DarkGreen',0
_DarkOliveGreen          Db   'DarkOliveGreen',0
_DarkOrchid              Db   'DarkOrchid',0
_DarkSlateBlue           Db   'DarkSlateBlue',0
_DarkSlateGray           Db   'DarkSlateGray',0
_DarkSlateGrey           Db   'DarkSlateGrey',0
_DarkTurquoise           Db   'DarkTurquoise',0
_Firebrick               Db   'Firebrick',0
_ForestGreen             Db   'ForestGreen',0
_Gold                    Db   'Gold',0
_Goldenrod               Db   'Goldenrod',0
_GreenYellow             Db   'GreenYellow',0
_IndianRed               Db   'IndianRed',0
_Khaki                   Db   'Khaki',0
_LightBlue               Db   'LightBlue',0
_LightSteelBlue          Db   'LightSteelBlue',0
_LimeGreen               Db   'LimeGreen',0
_Maroon                  Db   'Maroon',0
_MediumAquamarine        Db   'MediumAquamarine',0
_MediumBlue              Db   'MediumBlue',0
_MediumForestGreen       Db   'MediumForestGreen',0
_MediumGoldenrod         Db   'MediumGoldenrod',0
_MediumOrchid            Db   'MediumOrchid',0
_MediumSeaGreen          Db   'MediumSeaGreen',0
_MediumSlateBlue         Db   'MediumSlateBlue',0
_MediumSpringGreen       Db   'MediumSpringGreen',0
_MediumTurquoise         Db   'MediumTurquoise',0
_MediumVioletRed         Db   'MediumVioletRed',0
_MidnightBlue            Db   'MidnightBlue',0
_Navy                    Db   'Navy',0
_NavyBlue                Db   'NavyBlue',0
_Orange                  Db   'Orange',0
_OrangeRed               Db   'OrangeRed',0
_Orchid                  Db   'Orchid',0
_PaleGreen               Db   'PaleGreen',0
_Pink                    Db   'Pink',0
_Plum                    Db   'Plum',0
_Salmon                  Db   'Salmon',0
_SeaGreen                Db   'SeaGreen',0
_Sienna                  Db   'Sienna',0
_SkyBlue                 Db   'SkyBlue',0
_SlateBlue               Db   'SlateBlue',0
_SpringGreen             Db   'SpringGreen',0
_SteelBlue               Db   'SteelBlue',0
_Tan                     Db   'Tan',0
_Thistle                 Db   'Thistle',0
_Turquoise               Db   'Turquoise',0
_Violet                  Db   'Violet',0
_VioletRed               Db   'VioletRed',0
_Wheat                   Db   'Wheat',0
_YellowGreen             Db   'YellowGreen',0
_SummerSky               Db   'SummerSky',0
_RichBlue                Db   'RichBlue',0
_Brass                   Db   'Brass',0
_Copper                  Db   'Copper',0
_Bronze                  Db   'Bronze',0
_Bronze2                 Db   'Bronze2',0
_Silver                  Db   'Silver',0
_BrightGold              Db   'BrightGold',0
_OldGold                 Db   'OldGold',0
_Feldspar                Db   'Feldspar',0
_Quartz                  Db   'Quartz',0
_NeonPink                Db   'NeonPink',0
_DarkPurple              Db   'DarkPurple',0
_NeonBlue                Db   'NeonBlue',0
_CoolCopper              Db   'CoolCopper',0
_MandarinOrange          Db   'MandarinOrange',0
_LightWood               Db   'LightWood',0
_MediumWood              Db   'MediumWood',0
_DarkWood                Db   'DarkWood',0
_SpicyPink               Db   'SpicyPink',0
_SemiSweetChoc           Db   'SemiSweetChoc',0
_BakersChoc              Db   'BakersChoc',0
_Flesh                   Db   'Flesh',0
_NewTan                  Db   'NewTan',0
_NewMidnightBlue         Db   'NewMidnightBlue',0
_VeryDarkBrown           Db   'VeryDarkBrown',0
_DarkBrown               Db   'DarkBrown',0
_DarkTan                 Db   'DarkTan',0
_GreenCopper             Db   'GreenCopper',0
_DkGreenCopper           Db   'DkGreenCopper',0
_DustyRose               Db   'DustyRose',0
_HuntersGreen            Db   'HuntersGreen',0
_Scarlet                 Db   'Scarlet',0

;  Table des Couleurs
PigmentTab:
Dw  Offset Gray05           ,       Offset _Gray05
Dw  Offset Gray10           ,       Offset _Gray10
Dw  Offset Gray15           ,       Offset _Gray15
Dw  Offset Gray20           ,       Offset _Gray20
Dw  Offset Gray25           ,       Offset _Gray25
Dw  Offset Gray30           ,       Offset _Gray30
Dw  Offset Gray35           ,       Offset _Gray35
Dw  Offset Gray40           ,       Offset _Gray40
Dw  Offset Gray45           ,       Offset _Gray45
Dw  Offset Gray50           ,       Offset _Gray50
Dw  Offset Gray55           ,       Offset _Gray55
Dw  Offset Gray60           ,       Offset _Gray60
Dw  Offset Gray65           ,       Offset _Gray65
Dw  Offset Gray70           ,       Offset _Gray70
Dw  Offset Gray75           ,       Offset _Gray75
Dw  Offset Gray80           ,       Offset _Gray80
Dw  Offset Gray85           ,       Offset _Gray85
Dw  Offset Gray90           ,       Offset _Gray90
Dw  Offset Gray95           ,       Offset _Gray95
Dw  Offset DimGray          ,       Offset _DimGray
Dw  Offset DimGrey          ,       Offset _DimGrey
Dw  Offset Gray             ,       Offset _Gray
Dw  Offset Grey             ,       Offset _Grey
Dw  Offset LightGray        ,       Offset _LightGray
Dw  Offset LightGrey        ,       Offset _LightGrey
Dw  Offset VLightGrey       ,       Offset _VLightGrey
Dw  Offset White            ,       Offset _White
Dw  Offset Red              ,       Offset _Red
Dw  Offset Green            ,       Offset _Green
Dw  Offset Blue             ,       Offset _Blue
Dw  Offset Yellow           ,       Offset _Yellow
Dw  Offset Cyan             ,       Offset _Cyan
Dw  Offset Magenta          ,       Offset _Magenta
Dw  Offset Black            ,       Offset _Black
Dw  Offset Aquamarine       ,       Offset _Aquamarine
Dw  Offset BlueViolet       ,       Offset _BlueViolet
Dw  Offset Brown            ,       Offset _Brown
Dw  Offset CadetBlue        ,       Offset _CadetBlue
Dw  Offset Coral            ,       Offset _Coral
Dw  Offset CornflowerBlue   ,       Offset _CornflowerBlue
Dw  Offset DarkGreen        ,       Offset _DarkGreen
Dw  Offset DarkOliveGreen   ,       Offset _DarkOliveGreen
Dw  Offset DarkOrchid       ,       Offset _DarkOrchid
Dw  Offset DarkSlateBlue    ,       Offset _DarkSlateBlue
Dw  Offset DarkSlateGray    ,       Offset _DarkSlateGray
Dw  Offset DarkSlateGrey    ,       Offset _DarkSlateGrey
Dw  Offset DarkTurquoise    ,       Offset _DarkTurquoise
Dw  Offset Firebrick        ,       Offset _Firebrick
Dw  Offset ForestGreen      ,       Offset _ForestGreen
Dw  Offset Gold             ,       Offset _Gold
Dw  Offset Goldenrod        ,       Offset _Goldenrod
Dw  Offset GreenYellow      ,       Offset _GreenYellow
Dw  Offset IndianRed        ,       Offset _IndianRed
Dw  Offset Khaki            ,       Offset _Khaki
Dw  Offset LightBlue        ,       Offset _LightBlue
Dw  Offset LightSteelBlue   ,       Offset _LightSteelBlue
Dw  Offset LimeGreen        ,       Offset _LimeGreen
Dw  Offset Maroon           ,       Offset _Maroon
Dw  Offset MediumAquamarine ,       Offset _MediumAquamarine
Dw  Offset MediumBlue       ,       Offset _MediumBlue
Dw  Offset MediumForestGreen,       Offset _MediumForestGreen
Dw  Offset MediumGoldenrod  ,       Offset _MediumGoldenrod
Dw  Offset MediumOrchid     ,       Offset _MediumOrchid
Dw  Offset MediumSeaGreen   ,       Offset _MediumSeaGreen
Dw  Offset MediumSlateBlue  ,       Offset _MediumSlateBlue
Dw  Offset MediumSpringGreen,       Offset _MediumSpringGreen
Dw  Offset MediumTurquoise  ,       Offset _MediumTurquoise
Dw  Offset MediumVioletRed  ,       Offset _MediumVioletRed
Dw  Offset MidnightBlue     ,       Offset _MidnightBlue
Dw  Offset Navy             ,       Offset _Navy
Dw  Offset NavyBlue         ,       Offset _NavyBlue
Dw  Offset Orange           ,       Offset _Orange
Dw  Offset OrangeRed        ,       Offset _OrangeRed
Dw  Offset Orchid           ,       Offset _Orchid
Dw  Offset PaleGreen        ,       Offset _PaleGreen
Dw  Offset Pink             ,       Offset _Pink
Dw  Offset Plum             ,       Offset _Plum
Dw  Offset Salmon           ,       Offset _Salmon
Dw  Offset SeaGreen         ,       Offset _SeaGreen
Dw  Offset Sienna           ,       Offset _Sienna
Dw  Offset SkyBlue          ,       Offset _SkyBlue
Dw  Offset SlateBlue        ,       Offset _SlateBlue
Dw  Offset SpringGreen      ,       Offset _SpringGreen
Dw  Offset SteelBlue        ,       Offset _SteelBlue
Dw  Offset Tan              ,       Offset _Tan
Dw  Offset Thistle          ,       Offset _Thistle
Dw  Offset Turquoise        ,       Offset _Turquoise
Dw  Offset Violet           ,       Offset _Violet
Dw  Offset VioletRed        ,       Offset _VioletRed
Dw  Offset Wheat            ,       Offset _Wheat
Dw  Offset YellowGreen      ,       Offset _YellowGreen
Dw  Offset SummerSky        ,       Offset _SummerSky
Dw  Offset RichBlue         ,       Offset _RichBlue
Dw  Offset Brass            ,       Offset _Brass
Dw  Offset Copper           ,       Offset _Copper
Dw  Offset Bronze           ,       Offset _Bronze
Dw  Offset Bronze2          ,       Offset _Bronze2
Dw  Offset Silver           ,       Offset _Silver
Dw  Offset BrightGold       ,       Offset _BrightGold
Dw  Offset OldGold          ,       Offset _OldGold
Dw  Offset Feldspar         ,       Offset _Feldspar
Dw  Offset Quartz           ,       Offset _Quartz
Dw  Offset NeonPink         ,       Offset _NeonPink
Dw  Offset DarkPurple       ,       Offset _DarkPurple
Dw  Offset NeonBlue         ,       Offset _NeonBlue
Dw  Offset CoolCopper       ,       Offset _CoolCopper
Dw  Offset MandarinOrange   ,       Offset _MandarinOrange
Dw  Offset LightWood        ,       Offset _LightWood
Dw  Offset MediumWood       ,       Offset _MediumWood
Dw  Offset DarkWood         ,       Offset _DarkWood
Dw  Offset SpicyPink        ,       Offset _SpicyPink
Dw  Offset SemiSweetChoc    ,       Offset _SemiSweetChoc
Dw  Offset BakersChoc       ,       Offset _BakersChoc
Dw  Offset Flesh            ,       Offset _Flesh
Dw  Offset NewTan           ,       Offset _NewTan
Dw  Offset NewMidnightBlue  ,       Offset _NewMidnightBlue
Dw  Offset VeryDarkBrown    ,       Offset _VeryDarkBrown
Dw  Offset DarkBrown        ,       Offset _DarkBrown
Dw  Offset DarkTan          ,       Offset _DarkTan
Dw  Offset GreenCopper      ,       Offset _GreenCopper
Dw  Offset DkGreenCopper    ,       Offset _DkGreenCopper
Dw  Offset DustyRose        ,       Offset _DustyRose
Dw  Offset HuntersGreen     ,       Offset _HuntersGreen
Dw  Offset Scarlet          ,       Offset _Scarlet
Dw  -1                      ,       -1
Align 16
; les constantes de Mik.Pas
GradBase  DD 90
Xmax      DD 159  ;319
Ymax      DD 119  ;239
Xmax2     DD 159  ;319
Ymax2     DD 119  ;239
PicSizeWc DD 10.0
PixRat    DD  1.0
Half1     DD  0.5
Quater    DD  0.25
aQuater   DD    -2
Is1       DD  1.0
IsZero    DD  0.0
Mul255    DD  255
Infinity  DD  060AD78ECh ; 10E20
Epsilon   DD  02EDBE6FFh ; 10E-10
Pow10S    DD -10.0
MaxRekDep Equ 5
AttenEps  DD  0.01
Abank_R   DW  0
DestSeg   DW  0A000h

Xrotate   DD  0.0       ; Rotation sur l'axe des z !!
          DD  0.0
          DD  1.0

Eye       DD   0.0 ; V3t.X
          DD -20.0 ; V3t.Y
          DD   0.1 ; V3t.Z

LightV    DD -20.0 ; V3t.X
          DD -20.0 ; V3t.Y
          DD  10.0 ; V3t.Z

LightC    DD   1.0  ; Ct.R
          DD   1.0  ; Ct.G
          DD   1.0  ; Ct.B

AmbC      DD   0.15 ; Ct.R
          DD   0.15 ; Ct.G
          DD   0.15 ; Ct.B

; Base a y = -1.0 pour rotation visuelle autour du point 0,0,0
; Les Trois Spheres representant le Mickey
K1        DD   0.0  ; SphereT.m.X
          DD  -1.0  ; SphereT.m.Y
          DD   0.0  ; SphereT.m.Z
          DD   4.0  ; SphereT.Sqrr

K2        DD  -1.50 ; SphereT.m.X
          DD  -1.00 ; SphereT.m.Y
          DD   1.50 ; SphereT.m.Z
          DD   1.00  ; SphereT.Sqrr

K3        DD  +1.50 ; SphereT.m.X
          DD  -1.00 ; SphereT.m.Y
          DD   1.50 ; SphereT.m.Z
          DD   1.00 ; SphereT.Sqrr

K4        DD   0.0  ; SphereT.m.X
          DD  -2.625; SphereT.m.Y
          DD   0.0  ; SphereT.m.Z
          DD   0.25 ; SphereT.Sqrr

ObnrMax   Dw   4

ObnrIs    Dw   Offset K1        ; Equ 1 ; Quatre Sphere = un Mickey
          Dw   Offset K2        ; Equ 2 ;
          Dw   Offset K3        ; Equ 3 ;
          Dw   Offset K4        ; Equ 4 ;

K1Surf  DD 1.0 ;Ct <1.0,1.0,1.0>
        DD 0.5
        DD 1.0
        DD 100.0
        DD   1.0
        Dw   Faux
        Dw   Faux
        DD 0.5   ;Ct   < 0.5,0.5,0.5 >
        DD 0.5
        DD 0.5
        DD 1.0   ;Ct   < 1.0,1.0,1.0 >
        DD 1.0
        DD 1.0
        Dw   Offset EqOdProc
        Dw   Offset EqNrmProc
K2Surf  DD 0.5  ;Ct <0.5,0.6,0.7>
        DD 0.6
        DD 0.7
        DD 100.0
        DD   1.0
        Dw   Faux
        Dw   Faux
        DD 0.5   ;Ct   < 0.5,0.5,0.5 >
        DD 0.5
        DD 0.5
        DD 1.0   ;Ct   < 1.0,1.0,1.0 >
        DD 1.0
        DD 1.0
        Dw   Offset EqOdProc
        Dw   Offset EqNrmProc
K3Surf: ;Ct <0,0,0>
        DD 0.2
        DD 0.3
        DD 0.4
        DD 100.0
        DD   1.0
        Dw   Faux
        Dw   Faux
        DD 0.5   ;Ct   < 0.5,0.5,0.5 >
        DD 0.5
        DD 0.5
        DD 1.0   ;Ct   < 1.0,1.0,1.0 >
        DD 1.0
        DD 1.0
        Dw   Offset EqOdProc
        Dw   Offset EqNrmProc

K4Surf: ;Ct <1.0,1.0,1.0>
        DD 0.9
        DD 0.8
        DD 0.7
        DD 100.0
        DD   1.0
        Dw   Faux
        Dw   Faux
        DD 0.5   ;Ct   < 0.5,0.5,0.5 >
        DD 0.5
        DD 0.5
        DD 1.0   ;Ct   < 1.0,1.0,1.0 >
        DD 1.0
        DD 1.0
        Dw   Offset EqOdProc
        Dw   Offset EqNrmProc

SurfIs    Dw   Offset K1Surf
          Dw   Offset K2Surf
          Dw   Offset K3Surf
          Dw   Offset K4Surf

; Les Data en valorisations au demarrage
Ra RayT <>
Vh V3t  <>
Vr V3t  <>
Hv V3t  <>
Nh V3t  <>
Cct  Ct   <>
KeyStop Dw Faux
; Quelque Macros debilisante

CoordCopy Macro De,Vers
  Mov Eax,Dword Ptr Cs:[De.X]
  Mov Dword Ptr Cs:[Vers.X],Eax
  Mov Eax,Dword Ptr Cs:[De.Y]
  Mov Dword Ptr Cs:[Vers.Y],Eax
  Mov Eax,Dword Ptr Cs:[De.Z]
  Mov Dword Ptr Cs:[Vers.Z],Eax
EndM

ColorCopy Macro De,Vers
  Mov Eax,Dword Ptr Cs:[De.R]
  Mov Dword Ptr Cs:[Vers.R],Eax
  Mov Eax,Dword Ptr Cs:[De.G]
  Mov Dword Ptr Cs:[Vers.G],Eax
  Mov Eax,Dword Ptr Cs:[De.B]
  Mov Dword Ptr Cs:[Vers.B],Eax
EndM

; Additif pour avoir un rotation de vecteur !
; Variable Rattache a DefineMatrix
MatriceE   Matrice <>
Grad       DD 0
GradSin    DD 0
GradCos    DD 0
GradCosNeg DD 0
Theta      DD 0
DefineMatrix Proc Near
        Mov Dword Ptr Theta,Eax
        ; Calcul le Sinus & le Cosinus de Grad
        Finit
        Nop
        FLD  Dword Ptr Theta
        FSinCos
        Fwait
        Nop
        FSTP DWORD Ptr GradCos  ; Depile St(0) Dans GradCos
        FSTP DWORD Ptr GradSin  ; Depile St(0) Dans GradSin
        ; Calcul 1-GradCos
        FLD  Dword Ptr GradCos
        FLD1
        FSub St(0),St(1)
        FST  Dword Ptr GradCosNeg ; Stoque St(0)
        Fwait
        Nop
        FLD  (Vector Ptr ES:[SI]).Vector_1   ; Charge Vecteur X
        FSQRT                     ; Calcul Racine Carre de Vecteur X
        FMUL St(0),ST(1)          ; Multiplie sqrt(VecteurX) * 1-GradCos
        FLD  Dword Ptr GradCos    ; Charge GradCos
        FADD St(0),St(1)          ; Addition St(0),St(1);
        FSTP (Matrice Ptr DS:[DI]).Matrice1_1
        Fwait
        Nop
        Fld  Dword Ptr GradCosNeg
        Fld  (Vector Ptr ES:[SI]).Vector_2
        FSQRT                     ; Calcul Racine Carre de Vecteur X
        FMUL St(0),ST(1)          ; Multiplie sqrt(VecteurX) * 1-GradCos
        FLD  Dword Ptr GradCos    ; Charge GradCos
        FADD St(0),St(1)          ; Addition St(0),St(1);
        FSTP (Matrice Ptr DS:[DI]).Matrice2_2
        Fwait
        Nop
        Fld  Dword Ptr GradCosNeg
        Fld  (Vector Ptr ES:[SI]).Vector_3
        FSQRT                     ; Calcul Racine Carre de Vecteur X
        FMUL St(0),ST(1)          ; Multiplie sqrt(VecteurX) * 1-GradCos
        FLD  Dword Ptr GradCos    ; Charge GradCos
        FADD St(0),St(1)          ; Addition St(0),St(1);
        FSTP (Matrice Ptr DS:[DI]).Matrice3_3
        Fwait
        Nop
        Finit
        Nop
        FLD Dword Ptr GradSin
        FLD (Vector Ptr ES:[SI]).Vector_3
        FMul St(0),St(1)
        FSTP (Matrice Ptr DS:[DI]).Matrice1_2
        FLD (Vector Ptr ES:[SI]).Vector_2
        FMul St(0),St(1)
        Fstp (Matrice Ptr DS:[DI]).Matrice1_3
        FLD  (Vector Ptr ES:[SI]).Vector_1
        FMul St(0),St(1)
        Fstp (Matrice Ptr DS:[DI]).Matrice2_3
        Fwait
        Nop
        Finit
        Nop
        FLD Dword Ptr GradCosNeg
        FLD (Vector Ptr ES:[SI]).Vector_1
        Fmul St(0),St(1)
        FLD (Vector Ptr ES:[SI]).Vector_2
        Fmul st(0),St(1)
        FLD (Matrice Ptr DS:[DI]).Matrice1_2
        FLDZ
        FADD St(0),St(2)
        FSUB St(0),St(1)
        FSTP (Matrice Ptr DS:[DI]).Matrice2_1
        FXCH St(1)
        FADD St(0),St(1)
        FSTP (Matrice Ptr DS:[DI]).Matrice1_2
        FLD (Vector Ptr ES:[SI]).Vector_3
        Fmul St(0),St(2)
        FldZ
        Fadd St(0),St(1)
        Fld (Matrice Ptr DS:[DI]).Matrice2_3
        FXCH St(1)
        Fsub St(0),St(1)
        FSTP (Matrice Ptr DS:[DI]).Matrice3_1 ;
        Fadd St(0),St(1)
        FSTP (Matrice Ptr DS:[DI]).Matrice1_3
        FLD (Matrice Ptr DS:[DI]).Matrice2_3
        FLD (Vector Ptr ES:[SI]).Vector_2
        Fmul St(0),St(5)
        Fld (Vector Ptr ES:[SI]).Vector_3
        Fmul St(0),St(1)
        FldZ
        Fadd St(0),St(1)
        Fsub St(0),St(3)
        FSTP (Matrice Ptr DS:[DI]).Matrice3_2 ;
        Fadd St(0),St(2)
        FSTP (Matrice Ptr DS:[DI]).Matrice2_3 ;
        Finit
        Fwait
        Nop
RetN
DefineMatrix EndP

NouvRot    Vector <?>
Rotation     Proc Near
           Finit
           Nop
           FLD (Matrice Ptr DS:[DI]).Matrice1_1
           FLD (Vector Ptr ES:[SI]).Vector_1
           Fmul St(0),St(1)
           Fld  (Matrice Ptr DS:[DI]).Matrice1_2
           Fld  (Vector Ptr ES:[SI]).Vector_2
           Fmul St(0),St(1)
           Fadd St(0),St(2);

           Fld  (Matrice Ptr DS:[DI]).Matrice1_3
           Fld  (Vector Ptr ES:[SI]).Vector_3
           Fmul St(0),St(1)
           Fadd St(0),St(2);
           Fstp Dword Ptr NouvRot.Vector_1

           Finit
           Nop
           FLD (Matrice Ptr DS:[DI]).Matrice2_1
           FLD (Vector Ptr ES:[SI]).Vector_1
           Fmul St(0),St(1)
           Fld  (Matrice Ptr DS:[DI]).Matrice2_2
           Fld  (Vector Ptr ES:[SI]).Vector_2
           Fmul St(0),St(1)
           Fadd St(0),St(2);

           Fld  (Matrice Ptr DS:[DI]).Matrice2_3
           Fld  (Vector Ptr ES:[SI]).Vector_3
           Fmul St(0),St(1)
           Fadd St(0),St(2);
           Fstp Dword Ptr NouvRot.Vector_2

           Finit
           Nop
           FLD (Matrice Ptr DS:[DI]).Matrice3_1
           FLD (Vector Ptr ES:[SI]).Vector_1
           Fmul St(0),St(1)
           Fld  (Matrice Ptr DS:[DI]).Matrice3_2
           Fld  (Vector Ptr ES:[SI]).Vector_2
           Fmul St(0),St(1)
           Fadd St(0),St(2);

           Fld  (Matrice Ptr DS:[DI]).Matrice3_3
           Fld  (Vector Ptr ES:[SI]).Vector_3
           Fmul St(0),St(1)
           Fadd St(0),St(2);
           Fstp Dword Ptr NouvRot.Vector_3

           Mov  Eax,Dword Ptr NouvRot.Vector_1
           Mov  (Vector Ptr ES:[SI]).Vector_1,Eax
           Mov  Eax,Dword Ptr NouvRot.Vector_2
           Mov  (Vector Ptr ES:[SI]).Vector_2,Eax
           Mov  Eax,Dword Ptr NouvRot.Vector_3
           Mov  (Vector Ptr ES:[SI]).Vector_3,Eax

RetN
Rotation     EndP

CopyColor Proc Near
  Mov Cx,3
  enHaut:
      Mov Eax,Dword Ptr Cs:[Si]
      Mov Dword Ptr Cs:[Di],Eax
      Add Di,4
      Add Si,4
      Dec Cx
  Jnz enHaut
RetN
CopyColor EndP

;þþ
EqOdProc proc Near
RetN
EqOdProc Endp

EqNrmProc proc Near
Retn
EqNrmProc Endp

;þþ Validation
Align 16
Norm      Proc  ; DS:DI pointe sur V V3t ; ES:BX Pointe sur Single en Sortie
          FLD (V3t Ptr DS:[DI]).X       ; û(xý+yý+zý)
          FMul St,St(0)                  ;
          FLD (V3t Ptr DS:[DI]).Y       ;
          FMul St,St(0)                  ;
          FADD                           ;
          FLD (V3t Ptr DS:[DI]).Z       ;
          FMul St,St(0)                  ;
          FADD
          FSQRT
          FSTP Dword Ptr CS:[BX]
RetN
Norm      EndP

;þþ Validation
Align 16
NormSphere Proc  ; DS:DI pointe sur V V3t ; ES:BX Pointe sur Single en Sortie
           FLD (V3t Ptr DS:[DI]).X        ; (xý+yý+zý)
           FMul St,St(0)                  ;
           FLD (V3t Ptr DS:[DI]).Y        ;
           FMul St,St(0)                  ;
           FAdd                          ;
           FLD (V3t Ptr DS:[DI]).Z        ;
           FMul St,St(0)                  ;
           FAdd                          ;
           FSTP Dword Ptr CS:[BX]         ;
RetN
NormSphere EndP

;þþ Validation
Align 16
NormCylY   Proc  ; DS:DI pointe sur V V3t ; ES:BX Pointe sur Single en Sortie
          FLD (V3t Ptr DS:[DI]).X       ; (xý+zý)
          FMul St,St(0)                  ;
          FLD (V3t Ptr DS:[DI]).Z       ;
          FMul St,St(0)                  ;
          FADD
          FSTP Dword Ptr CS:[BX]
RetN
NormCylY   EndP

;þþ Validation
Align 16

Norm_     Proc  ; DS:DI pointe sur V V3t ; St(0) = Resultat
          FLD (V3t Ptr DS:[DI]).X       ; û(xý+yý+zý)
          FMul St,St(0)                  ;
          FLD (V3t Ptr DS:[DI]).Y       ;
          FMul St,St(0)
          FADD
          FLD (V3t Ptr DS:[DI]).Z
          FMul St,St(0)
          FADD
          FSQRT
RetN
Norm_     EndP

;þþ Validation
Align 16
NormSphere_     Proc  ; DS:DI pointe sur V V3t ; St(0) = Resultat
          FLD (V3t Ptr DS:[DI]).X       ; û(xý+yý+zý)
          FMul St,St(0)                  ;
          FLD (V3t Ptr DS:[DI]).Y       ;
          FMul St,St(0)
          FADD
          FLD (V3t Ptr DS:[DI]).Z
          FMul St,St(0)
          FADD
          FSQRT
RetN
NormSphere_     EndP

;þþ Validation
Align 16
Normalize Proc                  ; Assume DS:[DI] Pointe sur V3t
Enter 4,0
          Call Norm_
          FST Dword Ptr Cs:[Bp-4]
          Call ErrEps
          FLD  (V3t Ptr CS:[DI]).X
          FLD  Dword Ptr Cs:[Bp-4]
          FDIV
          FSTP (V3t Ptr CS:[DI]).X
          FLD  (V3t Ptr CS:[DI]).Y
          FLD  Dword Ptr Cs:[Bp-4]
          FDIV
          FSTP (V3t Ptr CS:[DI]).Y
          FLD  (V3t Ptr CS:[DI]).Z
          FLD  Dword Ptr Cs:[Bp-4]
          FDIV
          FSTP (V3t Ptr CS:[DI]).Z
Leave
RetN
Normalize EndP

Even
Vsum      Proc Near     ; Assume ES:[SI] Valeur en Sortie
                        ; DS:DI  a:V3t Ds:Bx b:V3t
          FLD  (V3t Ptr CS:[DI]).X      ; ( a+b )
          FLD  (V3t Ptr CS:[BX]).X      ;
          FAdd                          ;
          Fstp (V3t Ptr CS:[SI]).X      ;
          FLD  (V3t Ptr CS:[DI]).Y
          FLD  (V3t Ptr CS:[BX]).Y
          FAdd
          Fstp (V3t Ptr CS:[SI]).Y
          FLD  (V3t Ptr CS:[DI]).Z
          FLD  (V3t Ptr CS:[BX]).Z
          FAdd
          Fstp (V3t Ptr CS:[SI]).Z
RetN
Vsum      EndP

; Retour de Procedure copro status normal
Vdif      Proc Near     ; Assume ES:[SI] Valeur en Sortie
                        ; DS:DI  a:V3t Ds:Bx b:V3t
          FLD  (V3t Ptr CS:[DI]).X      ; ( a-b )
          FLD  (V3t Ptr CS:[BX]).X      ;
          FSub                        ;
          Fstp (V3t Ptr CS:[SI]).X      ;
          FLD  (V3t Ptr CS:[DI]).Y
          FLD  (V3t Ptr CS:[BX]).Y
          FSub
          Fstp (V3t Ptr CS:[SI]).Y
          FLD  (V3t Ptr CS:[DI]).Z
          FLD  (V3t Ptr CS:[BX]).Z
          FSub
          Fstp (V3t Ptr CS:[SI]).Z
RetN

Vdif      EndP

Comment#
TraceVdif Proc Near
          FLD  Dword Ptr Cs:[Eye].X      ; ( a-b )
          FLD  Dword Ptr Cs:[Trace_p].X  ;
          FSub                          ;
          Fstp Dword Ptr Cs:[Trace_Ve].X ;
          FLD  Dword Ptr Cs:[Eye].Y
          FLD  Dword Ptr Cs:[Trace_P].Y
          FSub
          Fstp Dword Ptr Cs:[Trace_Ve].Y
          FLD  Dword Ptr Ds:[Eye].Z
          FLD  (V3t Ptr DS:[Trace_p]).Z
          FSub
          Fstp Dword Ptr Es:[Trace_ve].Z
RetN
TraceVdif EndP
Comment#
GetNrmVdif Proc Near
          FLD  (V3t Ptr DS:[DI]).X          ;
          FLD  (V3t Ptr DS:)[Trace_p].X      ; ( a-b )
          FSub                              ;
          Fstp (V3t Ptr ES:[Trace_n]).X      ;
          FLD  (V3t Ptr DS:[DI]).Y
          FLD  (V3t Ptr DS:[Trace_p]).Y
          FSub
          Fstp (V3t Ptr ES:[Trace_n]).Y
          FLD  (V3t Ptr DS:[DI]).Z
          FLD  (V3t Ptr DS:[Trace_p]).Z
          FSub
          Fstp (V3t Ptr ES:[Trace_n]).Z
RetN
GetNrmVdif EndP

Kmul      Proc Near;  Es:[Si] V3t En Modification ; Cs:Bx Offset Single
                   ;  DS:[Di] V3t En Multiplication
          FLD Dword Ptr Cs:[Bx]
          FLD (V3t Ptr DS:[DI]).X
          Fmul
          FSTP Dword Ptr Es:[Si].X
          FLD Dword Ptr Cs:[Bx]
          FLD (V3t Ptr DS:[DI]).Y
          Fmul
          FSTP Dword Ptr Es:[Si].Y
          FLD Dword Ptr Cs:[Bx]
          FLD (V3t Ptr DS:[DI]).Z
          Fmul
          FSTP Dword Ptr Es:[Si].Z
RetN
Kmul      EndP
Smul      Proc Near; Assume Ds:[DI] Equ A [Bx] Equ B result Es:[Si]
          FLD (V3t Ptr DS:[DI]).X
          FLD (V3t Ptr DS:[BX]).X
          Fmul
          FLD (V3t Ptr DS:[DI]).Y
          FLD (V3t Ptr DS:[BX]).Y
          Fmul
          Fadd
          FLD (V3t Ptr DS:[DI]).Z
          FLD (V3t Ptr DS:[BX]).Z
          Fmul
          Fadd
          FSTP Dword Ptr ES:[SI]
RetN
Smul      EndP
Smul_     Proc Near; Assume Ds:[DI] Equ A [Bx] Equ B result St(0)
          FLD (V3t Ptr DS:[DI]).X
          FLD (V3t Ptr DS:[BX]).X
          Fmul
          FLD (V3t Ptr DS:[DI]).Y
          FLD (V3t Ptr DS:[BX]).Y
          Fmul
          Fadd
          FLD (V3t Ptr DS:[DI]).Z
          FLD (V3t Ptr DS:[BX]).Z
          Fmul
          Fadd
RetN
Smul_     EndP
Smulxz_   Proc Near; Assume Ds:[DI] Equ A [Bx] Equ B result St(0)
          FLD (V3t Ptr DS:[DI]).X
          FLD (V3t Ptr DS:[BX]).X
          Fmul
          FLD (V3t Ptr DS:[DI]).Z
          FLD (V3t Ptr DS:[BX]).Z
          Fmul
          Fadd
RetN
Smulxz_     EndP

ErrEps    Proc Near  ; Assume St(0) = single s
     Fabs
     Fld  Dword Ptr Epsilon
     Fxch
     Fcompp
     Fwait
     Fstsw Ax
     Test  Ah,1
     Jne   @@RunErrEps
     Clc
RetN
     @@RunErrEps:
       Mov Sp,0FFFEh
       Mov Ax,03h   ; Fin de Programme Erreur Epsilon
       Int 10h
       Int 20h
ErrEps    EndP

OldCw  DW  0
NewCw  DW  0
; utilise par Pow
ExpX       Proc Near   ; St(0) = X
Enter 4,0
           fldl2e                          ; load log2(10)
           fmulp   st(1),st(0)             ; log2(10) * argument
           fld     st(0)                   ; duplicate product
           fstcw   Word Ptr Cs:[Bp-4] ;oldcw; get old control word
           fwait                           ; wait till it arrives
           mov     ax,Word Ptr Cs:[Bp-4];oldcw; change rounding mode
           and     ax,0f3ffh               ; field to "round down"
           or      ax,0400h
           mov     Word Ptr Cs:[Bp-2],Ax   ;newcw,ax
           fldcw   Word Ptr Cs:[Bp-2];newcw; force rounding mode
           frndint                         ; get int part of product
           fldcw   Word Ptr Cs:[Bp-4];oldcw; restore old rounding mode
           fld     st(0)                   ; duplicate integer part
           fxch    st(2)                   ; get original product
           fsubrp  st(1),st(0)             ; find fractional part
           fld1
           fchs
           fxch    st(1)                   ; scale fractional part
           fscale
           fstp    st(1)                   ; discard coprocessor junk
           f2xm1                           ; raise 2 to power-1
           fld1
           faddp   st(1),st(0)             ; correct for the -1
           fmul    st(0),st(0)             ; square result
           fscale                          ; scale by int part
           fstp    st(1)                   ; discard coprocessor junk
Leave
RetN
ExpX       EndP

Pow       Proc Near   ; x = St(0) y= St(1) retour st(0)
          FldlN2
          Fxch
          Fyl2X
          Fmul  st(0),st(1)
          FSTP St(1)
          Fld Dword Ptr Pow10S
          FCOMP
          FWAIT
          FSTSW AX
          Test  AH,1
          Jne   @@Suite
            Fstp St(0)
            FldZ
          RetN
          @@Suite:
               Call  ExpX       ; St(0) = X
          RetN
Pow       EndP

SqrSolve3 Proc Near
   Fld  St(0)
   Fmul St,St(0)        ; sqr(p)
   Fild  Dword Ptr Cs:[aQuater]
   Fxch
   Fscale
   Fstp St(1)
;  Fmulp               ;st(0) sqr(p)*0.25
;  Fxch st(2)
   Fsub St,St(2)
   Fstp St(2)          ; q elimin? !
   Fchs                ; Ici on change le signe de p
   Fxch
   Ftst
   FSTSW AX
   SAHF
   JB   @@LamInfinity
        ; St(0) = d
        ; st(1) = p
        Fsqrt   ; st(0) = ûd
        Fld  Dword Ptr Cs:[Half1]
        Fmul st(1) st(2)
        ;
        FTST            ; On teste h et 0
        FSTSW AX
        SAHF
        JB @@TryL1
             FLD St(1)
             FLD St(1)
             Fsub
             Fld Dword Ptr Cs:[Epsilon]
        @@SolveEpsilonL2:
        FUCOM
        FSTSW AX
        SAHF
        JA @@TurnToL1 ;  Epsilon le plus grand
        Fstp St(0);
        Fstp St(2);
        Fstp St(0);
        Jmp  @@RealChoice
        @@TurnToL1:
        FSTP St(0)
        FSTP St(0)
;       Jmp  @@TryL1
        @@TryL1:
             Fadd
             Fld Dword Ptr Cs:[Epsilon]
;       Jmp  @@SolveEpsilonL1
;       @@SolveEpsilonL1:
        FUCOM
        FSTSW AX
        SAHF
        JA @@LamInfinity ;  Epsilon le plus grand
        Fstp St(0);
        Jmp  @@RealChoice
   @@LamInfinity:
        Fstp St(0)
        Fstp St(0)
        FLD Dword Ptr Cs:[Infinity]
   @@RealChoice:
Retn
SqrSolve3 EndP
Comment#
; Modifier pour ne pas avoir de passage de paramettre !
TraceRayToPoint Proc Near ;DI,r BX,l SI,p
           FLD  Dword Ptr Cs:[Trace_RA.RN.X]
           Fmul Dword Ptr Cs:[Trace_Lmin]
           Fadd Dword Ptr Cs:[Trace_RA.RP.X]
           FSTP DWord Ptr Cs:[Trace_P.X]

           FLD  Dword Ptr  Cs:[Trace_RA.RN.Y]
           Fmul Dword Ptr  Cs:[Trace_Lmin]
           Fadd Dword Ptr Cs:[Trace_RA.RP.Y]
           FSTP DWord Ptr Cs:[Trace_P.Y]

           FLD  Dword Ptr  Cs:[Trace_RA.RN.Z]
           Fmul Dword Ptr  Cs:[Trace_Lmin]
           Fadd Dword Ptr Cs:[Trace_RA.RP.Z]
           FSTP DWord Ptr Cs:[Trace_P.Z]
RetN
TraceRayToPoint EndP
Comment#

ReflV_W         DD 0
Reflv_V         DD 0,0,0 ; Equ V3t
ReflV     Proc Near
          Xchg  Bx,Di
;          Mov  Bx,  ;  ve   ; Valorise a l'inverse
;          Mov  Di,  ;  n    ;
          Call Smul_
          Fadd St,St(0)
          Xchg Bx,Di
          ; St(0) = W
          FSTP Dword Ptr Cs:[ReflV_W]
          Mov  Ax,Di    ; Ax = Ve
          Mov  Cx,Si    ; Cx = Vr
          Mov  Di,Bx    ; Ici di = n
          Mov  Bx,Offset ReflV_W
;         Mov  Di,n
          Mov  Si,Offset ReflV_V
          Call Kmul

;         Mov  Bx,Offset ReflV_V
;         Mov  Di,Ax ;ve

          Mov  Bx,Ax
          Mov  Di,Offset ReflV_V
          Mov  Si,Cx ;vr
          Call Vdif
Retn
ReflV     EndP

Comment#
TransV_P  DD ?
TransV_Q  DD ?
Proc      TransV ; Ve = Di, n = Bx , Dx pos d1,d2 , Si : Vt
          FLD (V3t Ptr DS:[DI]).X
          FLD (V3t Ptr DS:[BX]).X
          Fmul
          FLD (V3t Ptr DS:[DI]).Y
          FLD (V3t Ptr DS:[BX]).Y
          Fmul
          Fadd
          FLD (V3t Ptr DS:[DI]).Z
          FLD (V3t Ptr DS:[BX]).Z
          Fmul
          Fadd
          Fabs
          Fld
          Fmul St,St(0)
          Fld1
          Fsub St(0),St(1)
          Push Bx       ; Car Modifie
          Mov  Bx,Dx
          FLD  Dword Ptr Ds:[Bx]
          Add Bx,4
          FLD  Dword Ptr Ds:[Bx]
          FDIV
          Pop  Bx
          Fld
          Fmul St,St(0)
          Fmul st(0),st(2)
          Fld1
          Fsub St(0),St(1)
          FTST
          FSTSW AX
          SAHF
          JP @@Erreur1
          JA @@D_P0   ;> P.Z > 0.0
          JB @@Suite  ;> P.Z < 0.0
          @@Erreur1:
          @@D_P0:
          FSQRT
          Fld   St(1)
          Fmul st(0),St(3)
          Fsub  st(0),st(1)
          FSTP  Dword Ptr Cs:TransV_Q
          FSTP  Dword Ptr Cs:TransV_P
          Mov Dx,Si
          Mov Si,Di
          Mov Cx,Bx
          Mov Bx,Offset TransV_P
          Call Kmul
          Mov Bx,Offset TransV_Q
          Xchg Si,CX
          Mov Di,Si
          Call Kmul
          Mov    Di,Cx
          Mov    BX,Si
          Mov    Si,Dx
          Call   Vsum
          ; Plus Rien en Pile Normalement
          Clc
RetN
          @@Suite:
          Fstp St(0)
          Fstp St(0)
          Fstp St(0)
          STC
RetN
TransV    EndP
Comment#

Align 16
LnX       Proc Near   ; St(0) = X
          FldlN2
          Fxch
          Fyl2X      ;  St(0) = Ln(X)
RetN
LnX       EndP
Align 16
SphereInter Proc Near
; Pile Interne a SphereInter
@@Si_SavDx    Equ [Bp-2]
@@Si_P        Equ [Bp-6]
@@Si_Q        Equ [Bp-10]
@@Si_L        Equ [Bp-14]
@@Si_PMmNrm   Equ [Bp-18]
@@Si_pMm      Equ [Bp-30]
; Pile Externe a SphereInter
@@Si_Obrn     Equ [Bp+8];Bx = Trace.Obnr ; Pas le Mettre Ici En Fait !
@@Si_Lmin     Equ [Bp+4];Si = Trace.Lmin ;
@@Si_R        Equ [Bp+6];Di = Trace.r    ;
Enter 36,0
Mov Word Ptr Cs:@@Si_SavDx,Dx
Dec Dx
Shl Dx,1
Add Dx,Offset ObnrIs
;  vdif(r.p,Sphe.m,pMm);
Mov Si,Bp
Sub Si,30               ; Si Devient Si_pMm
Mov Bx,Dx
Mov Bx,Word Ptr Cs:[Bx] ; Bx Devient Sphere K1 ou autre
Mov Di,Word Ptr Cs:@@Si_R.RP
Call Vdif

;  pMmNrm   := Norm (pMm);
Mov Bx,Bp
Sub Bx,18  ; Bx devient pMmNrm
Mov Di,Bp
Sub Di,30 ;  Di Devient pMm
Call NormSphere

;  p        := 2* smul(pMm,r.n);
Mov Di,Bp
Sub Di,30    ; pMp
Mov Bx,Word Ptr Cs:@@Si_R
Add Bx,Rn
Call Smul_
Fld St(0)
Fadd
Fstp Dword Ptr Cs:@@Si_P

;  q        := sqr(pMmNrm)-Sphe.sqrr;
Fld Dword Ptr Cs:@@Si_pMmNrm
;Fmul st,st(0)
Mov Bx,Dx
Mov Bx,Word Ptr Cs:[Bx]
Fld Dword Ptr Cs:[Bx.Sqrr]
Fsub
;Fstp Dword Ptr Cs:@@Si_Q

;  sqrSolve ( p,q,l);
;Fld Dword Ptr Cs:@@Si_Q
Fld Dword Ptr Cs:@@Si_P
Call SqrSolve3
Fst Dword Ptr Cs:@@Si_L
Mov Di,Word Ptr Cs:@@Si_Lmin
Fld Dword Ptr Cs:[Di]
FUCOMPP
FSTSW AX
SAHF
;  if       l < lmin then
JBE @@NoChange
;           lmin := l;
Mov Dx,Word Ptr Cs:@@Si_SavDx
Mov Bx,Word Ptr Cs:@@Si_Obrn
Mov Ax,Word Ptr Cs:[Bx]
;Test Ax,0
;Je  @@Normal
;Fld1
;Fchs
;Fld Dword Ptr Cs:@@Si_L
;Fld Dword Ptr Cs:[Di]
;Faddp
;Fscale
;Fstp Dword Ptr Cs:[Di]
;Fstp St(0)
;Mov Word Ptr Cs:[Bx],Dx
;Jmp @@NoChange
;;Leave
;RetN
@@Normal:
Mov Eax,Dword Ptr Cs:@@Si_L
Mov Dword Ptr Cs:[Di],Eax
;           Obnr := test;
Mov Dx,Word Ptr Cs:@@Si_SavDx
Mov Bx,Word Ptr Cs:@@Si_Obrn
Mov Word Ptr Cs:[Bx],Dx
@@NoChange:
Leave
RetN
SphereInter EndP

Align 16
InterSect Proc Near ; Bx = Trace.Obnr
                    ; Di = Trace.r
                    ; Si = Trace.Lmin
Enter 6,0
Mov Word Ptr Cs:[Bp-2],Bx
Mov Word Ptr Cs:[Bp-4],Di
Mov Word Ptr Cs:[Bp-6],Si

; Normalize(r.n);    ;
  Add Di,12            ;
  Call Normalize ;     ;
  Mov Si,Word Ptr Cs:[Bp-6]
  Mov Di,Word Ptr Cs:[Bp-4]

  Fld  Dword Ptr Cs:[Infinity]
  Fstp Dword Ptr Cs:[Si]
  Mov  Word Ptr Cs:[Bx],0
Comment#

;  If r.n.y > 0 then
   FLD Dword Ptr Cs:[Di.Rn.Y]
   FTST
   FSTSW AX
   FSTP St(0)
   SAHF
   JA  @@C1True
   Jmp @@C1False
;  Begin
   @@C1True:
;      if r.p.y > 0 then
       Fld Dword Ptr Cs:[Di.Rp.Y]
       FTST
       FSTSW AX
       FSTP St(0)
       SAHF
       JA @@C11True
       Jmp @@C11False
       @@C11True:
;       Obnr := 5
        Mov Word Ptr Cs:[Bx],5
;     Jmp @@AfterC
      Jmp @@IsObnr5
      @@C11False:
;        Obnr:=0;
         Mov Word Ptr Cs:[Bx],0
;     Jmp @@AfterC
      Jmp @@Continue5
;  End
;  Else
;  Begin
   @@C1False:
;     If r.p.y < 0 then
      FLD Dword Ptr Cs:[Di.Rp.Y]
      FTST
      FSTSW AX
      FSTP St(0)
      SAHF
      JB @@C12True
      Jmp @@C12False
      @@C12True:
;        Obnr := 0
         Mov Word Ptr Cs:[Bx],0
;     Jmp @@AfterC
      Jmp @@Continue5
      @@C12False:
;        Obnr := 5;
         Mov Word Ptr Cs:[Bx],5
;     Jmp @@AfterC
      Jmp @@IsObnr5

  @@AfterC:
  Cmp Word Ptr Cs:[Bx],5
  Jne @@Continue5
; if Obnr = 5 Then
; begin
  @@IsObnr5:
;      lmin:=-r.p.y/r.n.y;
       FLD Dword Ptr Cs:[DI.Rp.Y]
       FCHS
       FLD Dword Ptr Cs:[Di.Rn.Y]
       FDIVP
       FST  Dword Ptr Cs:[Si]   ; Sauvegarde de Lmin
       FTST
       FSTSW AX
       FSTP St(0)
       SAHF
;      if lmin<0 then
       JB   @@Continue5
       Jmp  @@OkLmin
  @@Continue5:
;     lmin:=Infinity;
       Mov Eax,Dword Ptr Cs:[Infinity]
       Mov Dword Ptr Cs:[Si],Eax
  @@OkLmin:
Comment#

; Bp  Contient les Parametres deja passe a Intersect
  Push Bx
  Push Di
  Push Si

  Mov  Dx,4      ; Numero de Sphere a tester !
  Call SphereInter
  Mov  Dx,2
  Call SphereInter
  Mov  Dx,3
  Call SphereInter
  Mov  Dx,1
  Call SphereInter
  Pop  Si
  Pop  Di
  Pop  Bx
;  Mov  Bx,Ax
Leave
RetN  ; Elimine 6 Octets de La Pile
InterSect EndP

;            ToRefl:=GetNrm(ObNr,p,ve,n);
Align 16
GetMnrTable Dw  Offset CaseK0 ; Fond
            Dw  Offset CaseK1 ; Boule
            Dw  Offset CaseK2 ;
            Dw  Offset CaseK3 ;
            Dw  Offset CaseK4 ;
            Dw  Offset CaseK5 ; Sol
Align 16
GetNrm Proc Near
       Mov Bx,Word Ptr Cs:[Trace_Obnr]
       Shl Bx,1
       Add Bx,Offset GetMnrTable
       Mov Bx,Word Ptr Cs:[Bx]
       Call Bx
       Jmp AfterCaseK0
       CaseK1:
       Mov  Di,Offset K1
       Call GetNrmVdif
       Mov  Di,Bp
       Sub  Di,42
       Call Normalize
       RetN
       CaseK2:
       Mov  Di,Offset K2
       Call GetNrmVdif
       Mov  Di,Bp
       Sub  Di,42
       Call Normalize
       RetN
       CaseK3:
       Mov  Di,Offset K3
       Call GetNrmVdif
       Mov  Di,Bp
       Sub  Di,42
       Call Normalize
       RetN
       CaseK4:
       Mov  Di,Offset K4
       Call GetNrmVdif
       Mov  Di,Bp
       Sub  Di,42
       Call Normalize
       RetN
       CaseK5:
           FLDZ
           FST  Dword Ptr Cs:[Trace_N.X]
           FSTP Dword Ptr Cs:[Trace_N.Z]
           FLD1
           FSTP  Dword Ptr Cs:[Trace_N.Y]
       RetN
       CaseK0:

       RetN
       AfterCaseK0:

       ; Effectue Smul Ve,n resultat St(0)
          FLD Dword Ptr Cs:[Trace_Ve].X
          FLD Dword Ptr Cs:[Trace_n].X
          Fmul
          FLD Dword Ptr Cs:[Trace_Ve].Y
          FLD Dword Ptr Cs:[Trace_n].Y
          Fmul
          Fadd
          FLD Dword Ptr Cs:[Trace_ve].Z
          FLD Dword Ptr Cs:[Trace_n].Z
          Fmul
          Fadd
          Ftst
          FSTSW AX
          Fstp St(0)
          SAHF
          JP @@GetNrmC1 ;Erreur1
;      If Smul(ve,n) < 0 Then
          JAE @@GetNrmC1   ;>= 0.0
          @@Erreur1:
;         kmul(-1,n,n); { remplace par un Changement de signe ca }
          Fld Dword Ptr Cs:[Trace_n].x
          Fchs
          Fstp Dword Ptr Cs:[Trace_n].x
          Fld Dword Ptr Cs:[Trace_n].y
          Fchs
          Fstp Dword Ptr Cs:[Trace_n].y
          Fld Dword Ptr Cs:[Trace_n].z
          Fchs
          Fstp Dword Ptr Cs:[Trace_n].z

          Jmp @@GetNrmC2
          @@GetNrmC1:
;         Fstp St(0)
          @@GetNrmC2:

;      nn:=n;   Copy simple ; Elimine pas de reflextion
;      appel de NrmProc paramettre p et n

       Mov  Di,Bp       ; Normalize(n)
       Sub  Di,42       ;
       Call Normalize   ;

; ?limine car pas de gestion reflexion !
;Ax = Vrais si
;       (sMul(ve,n)>0) and (smul(nn,n)>0);
;Ax = Faux sinon
;
       Retn
GetNrm EndP

Ins_Obnr Dw 0
Even
Ins_R  DD 0,0,0,0,0,0
Ins_Lmin DD 0.001
Ins_Dummy DD 0
Even
Comment#
Function InShadow(p:v3T):boolean;
var r:rayT; ShdNr:integer; dummy:single;
begin
  r.p:=p; r.n:=LightV; RayToPoint(r,0.001,r.p);
  intersect(r,Shdnr,dummy); InShadow:=Shdnr>1;
end;
Comment#
InShadow Proc Near
;  Mov Si,Offset Ins_R.RP
;  Mov Cx,3
;  @@InS_Mov1:
;      Mov Eax,Dword Ptr Cs:[Di]
;      Mov Dword Ptr Cs:[Si],Eax
;      Add Di,4
;      Add Si,4
;      Dec Cx
;  Jnz @@InS_Mov1       ; Delocalise dans le specifique RayToPoint
   Mov Bx,Offset LightV
   Mov Si,Offset Ins_R.RN
   Mov Cx,3
   @@InS_Mov2:
       Mov Eax,Dword Ptr Cs:[Bx]
       Mov Dword Ptr Cs:[Si],Eax
       Add Bx,4
       Add Si,4
       Dec Cx
   Jnz @@InS_Mov2
   ; Equ RayToPoint Specifique
   FLD  Dword Ptr Cs:[Ins_R.RN.X]
   Fmul Dword Ptr Cs:[Ins_LMin]
;  Fadd Dword Ptr Cs:[Ins_R.RP.X]
   Fadd Dword Ptr Cs:[DI.X]
   FSTP DWord Ptr Cs:[Ins_R.RP.X]
   FLD  Dword Ptr  Cs:[Ins_R.RN.Y]
   Fmul Dword Ptr  Cs:[Ins_Lmin]
;  Fadd Dword Ptr Cs:[Ins_R.RP.Y]
   Fadd Dword Ptr Cs:[DI.Y]
   FSTP DWord Ptr Cs:[Ins_R.RP.Y]
   FLD  Dword Ptr  Cs:[Ins_R.RN.Z]
   Fmul Dword Ptr  Cs:[Ins_Lmin]
;  Fadd Dword Ptr Cs:[Ins_R.RP.Z]
   Fadd Dword Ptr Cs:[DI.Z]
   FSTP DWord Ptr Cs:[Ins_R.RP.Z]

   ; Faire Intersect(r,Shdnr,Dummy);
   Mov  Word Ptr Cs:[Ins_Obnr],0
   Mov  Di,Offset Ins_R
   Mov  Bx,Offset Ins_Obnr
   Mov  Si,Offset Ins_Dummy
   Call InterSect
   Mov  Bx,Offset Ins_Obnr
   RetN
InShadow EndP

; Attention Ici Pour Beneficier de L'appel Direct au paramettre contenue
; dans Trace il Faut Recalcul l'ajout sur BP
; Apres Introduction dans la routine
Light_Cd   Equ [Bp-2]    ; Position
Light_Cs   Equ [Bp-14]   ; Position
Light_W2   Equ [Bp-18]   ; Position
Light_Spec Equ [Bp-22]   ; Position
Light_W1   Equ [Bp-26]   ; Position
Align 16
Light  Proc Near
Enter  26,0             ; Ajout pour variable de Trace !
       Mov Bx,Word Ptr Cs:[Trace_Obnr][134]; A voir !
       Dec Bx
       Shl Bx,1
       Add Bx,Offset SurfIs
       Mov Bx,Word Ptr Cs:[Bx]
       Mov Word Ptr Cs:[Light_Cd],Bx   ; Position sur Surface!

;      w1:=smul(Lightv,n);
       Mov Di,Offset LightV
       Mov Bx,Bp
       Add Bx,92;(-42)+134
       Call Smul_
; St(0) Equ W1
; If (w1>0)
       FTST
       FSTSW AX
       FSTP Dword Ptr CS:[Light_W1]
       SAHF
       JP   @@Erreur1
       JB   @@LightEndCase
       @@Erreur1:
;      Call InShadow p sur pile !!      ; Elimine sans Consequence !
;      And (not InShadow(p)) Then
;      ; test (Not InShadow(p)) Vrais
;  Begin
        Mov  Di,Bp
        Add  Di,-30+134
        Call InShadow
        Cmp  Bx,1
        Jl   @@LightEndCase
        Mov Di,Word Ptr Cs:[Light_Cd]

        ;c.r:=(LightC.r*w1+AmbC.r)*cd.r;
        FLD Dword Ptr Cs:[LightC.R]
        Fmul Dword Ptr Cs:[Light_W1]
        Fadd Dword Ptr Cs:[AmbC.R]
        Fmul Dword Ptr Cs:[Di.R]
        Fstp Dword Ptr Cs:[Cct.R]

        ;c.g:=(LightC.g*w1+AmbC.g)*cd.g;
        FLD Dword Ptr Cs:[LightC.G]
        Fmul Dword Ptr Cs:[Light_W1]
        Fadd Dword Ptr Cs:[AmbC.G]
        Fmul Dword Ptr Cs:[Di.G]
        Fstp Dword Ptr Cs:[Cct.G]

        ;c.b:=(LightC.b*w1+AmbC.b)*cd.b;
        FLD Dword Ptr Cs:[LightC.B]
        Fmul Dword Ptr Cs:[Light_W1]
        Fadd Dword Ptr Cs:[AmbC.B]
        Fmul Dword Ptr Cs:[Di.B]
        Fstp Dword Ptr Cs:[Cct.B]

;      w2:=smul(Vr,Lightv);
       Mov Bx,Bp
       Add Bx,68;(-66)+134      ; Vr
       Mov Di,Offset Lightv
       Call Smul_
       FTST
       FSTSW AX
       FSTP Dword Ptr CS:[Light_W2]
       SAHF
;      JP   @@LightEnd;Erreur2
;      If w2>0 Then
       JB   @@LightEnd
       @@Erreur2:
; Pow Comment Ca Marche Huhu
;      spec:=pow(w2,ObArr[ObNr].Oe);
       Mov Di,Word Ptr Cs:[Light_Cd]
       Fld Dword Ptr Cs:[Di].SurfT.SOe
       Fld Dword Ptr Cs:[Light_W2]
       Call Pow
       Fst  Dword Ptr Cs:[Light_Spec]
       Ftst
       FSTSW AX
       FSTP St(0)
       SAHF
       JZ   @@NoSpec  ; si Spec = 0 pas besoin de calcul

;      cs:=ObArr[ObNr].specC;
       Mov Di,Word Ptr Cs:[Light_Cd]
;      c.r:=c.r+spec*cs.r;
       Fld Dword Ptr Cs:[Di].SurfT.SSpecC.R
       Fmul Dword Ptr Cs:[Light_Spec]
       Fadd Dword Ptr Cs:[Cct.R]
       Fstp Dword Ptr Cs:[Cct.R]

;      c.g:=c.g+spec*cs.g;
       Fld Dword Ptr Cs:[Di].SurfT.SSpecC.G
       Fmul Dword Ptr Cs:[Light_Spec]
       Fadd Dword Ptr Cs:[Cct.G]
       Fstp Dword Ptr Cs:[Cct.G]

;      c.b:=c.b+spec*cs.b;
       Fld Dword Ptr Cs:[Di].SurfT.SSpecC.B
       Fmul Dword Ptr Cs:[Light_Spec]
       Fadd Dword Ptr Cs:[Cct.B]
       Fstp Dword Ptr Cs:[Cct.B]
       @@NoSpec:

     Jmp @@LightEnd
   @@LightEndCase:
     Mov Di,Word Ptr Cs:[Light_Cd]
;    c.r:=AmbC.r*cd.r;
     FLD Dword Ptr  Cs:[AmbC.r]
     Fmul Dword Ptr Cs:[DI.r]
     Fstp Dword Ptr Cs:[Cct.R]
;    c.g:=AmbC.g*cd.g;
     FLD Dword Ptr  Cs:[AmbC.g]
     Fmul Dword Ptr  Cs:[DI.g]
     Fstp Dword Ptr Cs:[Cct.G]
;    c.b:=AmbC.b*cd.b;
     FLD Dword Ptr  Cs:[AmbC.b]
     Fmul Dword Ptr  Cs:[DI.b]
     Fstp Dword Ptr Cs:[Cct.b]
   @@LightEnd:

Leave
RetN
Light  EndP

Align 16
Trace     Proc Near
; Les Variables Transmise a Trace
Trace_RekDep  Equ [Bp+16]      ; Word ; Correspond!
Trace_R       Equ [Bp+14]      ; Word addresse de ra
Trace_c       Equ [Bp+12]      ; Word
Trace_N1      Equ [Bp+08]      ; Dword
Trace_Atten   Equ [Bp+04]      ; Dword

; Les Variables Interne a
Trace_Obnr    Equ [BP-2]
Trace_Lmin    Equ [BP-6]
Trace_N2      Equ [BP-10]
Trace_As      Equ [BP-14]
Trace_At      Equ [BP-18]
Trace_P       Equ [BP-30]
Trace_N       Equ [BP-42]
Trace_VE      Equ [BP-54]
Trace_VR      Equ [BP-66]
Trace_VT      Equ [BP-78]
Trace_CI      Equ [BP-90]
Trace_CS      Equ [BP-102]
Trace_ToRefl  Equ [BP-104]
Trace_ToTrans Equ [BP-106]
Trace_Ra      Equ [Bp-130] ; Zone de stockage Ra

Enter 130,0         ; Une Zone de Data de 130 Octets
          Mov  Si,Word Ptr Cs:[Trace_R]; Chargement d'un Rayon passe en paramettre
          Mov  Di,Bp                   ; sur la pile interne a Proc_Trace
          Sub  Di,130                  ;
          Mov  Cx,6                    ; 6 Dword en Copie !
          @@Duplique:
            Mov Eax,Dword Ptr Cs:[Si]
            Mov Dword Ptr Cs:[Di],Eax
            Add Si,4
            Add Di,4
            Dec Cx
          Jnz @@Duplique

          Mov  Ax,Word Ptr Cs:[Trace_RekDep]
          Cmp  Ax,Word Ptr Cs:[MaxRekDep]
          Jg   @@TestAtten
          @@SetC:
            Mov  Bx,Word Ptr Cs:[Trace_c]
            Mov Eax,Dword Ptr Cs:[IsZero]
            Mov Dword Ptr Cs:[Bx.R],Eax
            Mov Dword Ptr Cs:[Bx.G],Eax
            Mov Dword Ptr Cs:[Bx.B],Eax
            Jmp @@OutOfTrace
         @@TestAtten:
            FLD Dword Ptr Cs:Trace_Atten
            FLD Dword Ptr Cs:AttenEps
            FUCOMPP
            FSTSW AX
            SAHF
            JA  @@SetC

; Subterfuge
; On Peu Elimine la passation de parametre vers Intersect
; A  Condition de Permettre a Intersect de Taper dans la structure
; de pile de Trace !!!
          ;intersect(r,obNr,lMin);
          Mov Di,Bp
          Sub Di,130 ;Mov Di, Trace_Ra
          Mov Bx,Bp
          Sub Bx,2   ;Mov Bx, Trace_Obnr
          Mov Si,Bp
          Sub Si,6   ;Mov Si, Trace_Lmin
          Call Intersect
          Mov Bx,Cs:[Trace_Obnr]        ; Recupere Bx Valorise par Intersect
          Cmp  Bx,0
          Je   @@K0
;         Fld Dword Ptr Cs:[Trace_Lmin]
;         Fstp St(0);
;         RayToPoint(r,lMin,p);

;         Call TraceRayToPoint          ; Specifique
; remplace en Dur                       ; Les Parametres Sont Acquis !!
           FLD  Dword Ptr Cs:[Trace_RA.RN.X]
           Fmul Dword Ptr Cs:[Trace_Lmin]
           Fadd Dword Ptr Cs:[Trace_RA.RP.X]
           FSTP DWord Ptr Cs:[Trace_P.X]

           FLD  Dword Ptr  Cs:[Trace_RA.RN.Y]
           Fmul Dword Ptr  Cs:[Trace_Lmin]
           Fadd Dword Ptr Cs:[Trace_RA.RP.Y]
           FSTP DWord Ptr Cs:[Trace_P.Y]

           FLD  Dword Ptr  Cs:[Trace_RA.RN.Z]
           Fmul Dword Ptr  Cs:[Trace_Lmin]
           Fadd Dword Ptr Cs:[Trace_RA.RP.Z]
           FSTP DWord Ptr Cs:[Trace_P.Z]

;            vDif(eye,p,ve);
;         Call TraceVdif                ; Specifique
; Remplace en Dur                       ; Les Parametres Sont Acquis !!
          FLD  Dword Ptr Cs:[Eye].X      ; ( a-b )
          FLD  Dword Ptr Cs:[Trace_p].X  ;
          FSub                         ;
          Fstp Dword Ptr Cs:[Trace_Ve].X ;
          FLD  Dword Ptr Cs:[Eye].Y
          FLD  Dword Ptr Cs:[Trace_P].Y
          FSub
          Fstp Dword Ptr Cs:[Trace_Ve].Y
          FLD  Dword Ptr Ds:[Eye].Z
          FLD  (V3t Ptr DS:[Trace_p]).Z
          FSub
          Fstp Dword Ptr Es:[Trace_ve].Z
;            normalize(ve);
          Mov Di,Bp
          Sub Di,54
          Call Normalize

          Mov Di,Bp
          Sub Di,30
;            ToRefl:=GetNrm(ObNr,p,ve,n);
          Call GetNrm

;            ReflV(ve,n,vr);
          Mov Di,Bp   ; ve;n
          Sub Di,54
          Mov Bx,Bp   ; n;Ve
          Sub Bx,42
          Mov Si,Bp   ; Vr
          Sub Si,66
          Call ReflV

;         Light(Obnr,p,n,ve,vr,c);
          Call Light
          Jmp  @@OutOfTrace
          @@K0:
          Mov Si,Offset Black;MediumVioletRed
          Mov Di,Offset Cct
          Call CopyColor
          Jmp  @@OutOfTrace

      @@LastChoice:
      @@OutOfTrace:
      Leave
RetN  14
Trace     EndP

; ce Pset Correspond a 16m couleur pour ma Tseng !
Even
PsetX DD ?
PsetY DD ?
Bu    DD 0
Gr    DD 0
Rd    DD 0
Even
Pset   Proc Near
Push   Es
Push   Word Ptr Cs:[DestSeg]
Pop    Es
Mov    Dword Ptr Cs:[PsetX],Ecx
Mov    Dword Ptr Cs:[PsetY],Ebx
       Mov Eax,Ecx
       Shl Ecx,1
       Add Ecx,Eax
       Mov Eax,Ebx
       Mov Ebx,640*3
       Mul Bx
       Add Ax,Cx
       Adc Dx,0
       Mov Di,Ax
       Mov Ax,Dx
       Cmp Dx,Word Ptr Cs:[ABank_R]
       Je  @@NextB
       Mov Word Ptr Cs:[Abank_R],Dx
       Mov Ah,Al
       Shl Ah,4
       Or  Al,Ah
       Mov Dx,3CDh
       Out Dx,Al
       @@NextB:
       Mov Al,Byte Ptr Cs:[Bu]
       StoSb

       Mov Ecx,Dword Ptr Cs:[PsetX]
       Mov Eax,Ecx
       Shl Ecx,1
       Add Ecx,Eax
       Inc Ecx
       Mov Eax,Dword Ptr Cs:[PsetY]
       Mov Ebx,640*3
       Mul Bx
       Add Ax,Cx
       Adc Dx,0
       Mov Di,Ax
       Mov Ax,Dx
       Cmp Dx,Word Ptr Cs:[ABank_R]
       Je  @@NextG
       Mov Word Ptr Cs:[Abank_R],Dx
       Mov Ah,Al
       Shl Ah,4
       Or  Al,Ah
       Mov Dx,3CDh
       Out Dx,Al
       @@NextG:
       Mov Al,Byte Ptr Cs:[Gr]
       StoSb

       Mov Ecx,Dword Ptr Cs:[PsetX]
       Mov Eax,Ecx
       Shl Ecx,1
       Add Ecx,Eax
       Add Ecx,2
       Mov Eax,Dword Ptr Cs:[PsetY]
       Mov Ebx,640*3
       Mul Bx
       Add Ax,Cx
       Adc Dx,0
       Mov Di,Ax
       Mov Ax,Dx
       Cmp Dx,Word Ptr Cs:[ABank_R]
       Je  @@NextR
       Mov Word Ptr Cs:[Abank_R],Dx
       Mov Ah,Al
       Shl Ah,4
       Or  Al,Ah
       Mov Dx,3CDh
       Out Dx,Al
       @@NextR:
       Mov Al,Byte Ptr Cs:[Rd]
       StoSb

Pop    Es
RetN
Pset   EndP

Even
Pset64K Proc Near
Push   Es
Push   Word Ptr Cs:[DestSeg]
Pop    Es
Mov    Dword Ptr Cs:[PsetX],Ecx
Mov    Dword Ptr Cs:[PsetY],Ebx
       Mov Eax,Ecx
       Add Ecx,Eax
       Mov Eax,Ebx
       Mov Ebx,640*2
       Mul Bx
       Add Ax,Cx
       Adc Dx,0
       Mov Di,Ax
       Mov Ax,Dx
       Cmp Dx,Word Ptr Cs:[ABank_R]
       Je  @@NextB
       Mov Word Ptr Cs:[Abank_R],Dx
;      Xor Dx,Dx
;      Mov Ah,Al
;      Shl Ah,4
;      Or  Al,Ah
;      Mov Dl,Al
       Mov Ax,4F05h
       Xor Bx,Bx
       Int 10h
;      Mov Dx,3CDh
;      Out Dx,Al
       @@NextB:
       Xor Ax,Ax
       Mov Al,Byte Ptr Cs:[Rd]
       Shr Al,3
       Shl Ax,11
       Mov Al,Byte Ptr Cs:[Bu]
       Shr Al,3
       Xor Bx,Bx
       Mov Bl,Byte Ptr Cs:[Gr]
       Shr Bl,2
       Shl Bx,5
       Add Ax,Bx
       StoSw
Pop    Es
RetN
Pset64K  EndP

AddX   DD 0
AddY   DD 0
BaseX  DD 0
BaseY  DD 0
RunM_X DD 0
RunM_Y DD 0
H      DD 0
V      DD 0
HelpCompute1 DD 0

RunMickey1 Proc Near

  Fld  Dword Ptr Cs:[PicSizeWc] ; Aide au calcul de h
  Fld  Dword Ptr Cs:[PixRat]    ;
  Fmul                         ;
  Fild Dword Ptr Cs:[Ymax]      ;
  Fild Dword Ptr Cs:[Xmax]      ; Valorisation de HelpCompute
  Fdiv                         ;
  Fmul
  Fstp Dword Ptr Cs:[HelpCompute1]

Mov    Eax,DWord Ptr Cs:[BaseY]
Mov    DWord Ptr Cs:[RunM_Y],Eax

;While ((Y <= Ymax) And (KeyStop=False)) Do
@@W1Test:
Mov    Eax,DWord Ptr Cs:[Ymax2]
Cmp    Dword Ptr Cs:[RunM_Y],Eax
Jle    @@W1C0Vrais
Jmp    @@W1False
@@W1C0Vrais:
Cmp    Word Ptr Cs:[KeyStop],Faux
Je     @@W1C1Vrais
Jmp    @@W1False
@@W1C1Vrais:

; Remettre Ici Equ 0.21
; h:=(-y/ymax+0.5)*ymax/xmax*PicSiZeWC*PixRat;
  FiLD Dword Ptr Cs:[RunM_Y]
  FCHS
  Fild Dword Ptr Cs:[Ymax]
  Fdiv
  Fld Dword Ptr Cs:Half1
  Fadd
  Fld Dword Ptr Cs:HelpCompute1
  Fmul
  Fstp Dword Ptr Cs:[h]

; kMUl(h,Vh,hv);
  Mov Bx,Offset h
  Mov Di,Offset Vh
  Mov Si,Offset Hv
  Call Kmul

; X:=BaseX;
Mov    Eax,Dword Ptr Cs:[BaseX]
Mov    Dword Ptr Cs:[RunM_X],EaX

;While ((X <= Xmax) And (KeyStop=False))Do
@@W2Test:
Mov    Eax,Dword Ptr Cs:[Xmax2]
Cmp    Dword Ptr Cs:[RunM_X],Eax
Jle    @@W2C0Vrais
Jmp    @@W2False
@@W2C0Vrais:
Cmp    Word Ptr Cs:[KeyStop],Faux
Je     @@W2C1Vrais
Jmp    @@W2False
@@W2C1Vrais:

;     v:=(x/xmax-0.5)*PicSizeWC;
      Fild Dword Ptr Cs:[RunM_X]
      Fild Dword Ptr Cs:[Xmax]
      FdivP St(1),St(0)
      Fld  Dword Ptr Cs:[Half1]
      Fsubr
      Fld  Dword Ptr Cs:[PicSizeWc]
      Fmul
      Fstp Dword Ptr Cs:[V]

;     kMul(v,vr,nh);
      Mov Bx,Offset v
      Mov Di,Offset Vr
      Mov Si,Offset Nh
      Call Kmul

;     vSum(hv,nh,nh);
      Mov Di,Offset Hv
      Mov Bx,Offset Nh
      Mov Si,Offset Nh
      Call Vsum

;     Vdif(nh,eye,r.n);
      Mov Di,Offset Nh
      Mov Bx,Offset Eye
      Mov Si,Offset Ra.Rn
      Call Vdif

;     Trace(r,0,1,1,c);
      Push Word Ptr  0000         ; Correspond a RekDep !!
      Push Offset Ra              ; Trace doit faire une copie en pile
      Push Offset Cct               ;
      Push Dword Ptr  Cs:Is1      ;
      Push Dword Ptr  Cs:Is1      ;
      Call Trace

;
      FLD Dword Ptr Cs:[Cct.R]          ; þþþþþþ
      FLD1                            ; þþþþ
      FUCOMPP                         ; þþ
      FSTSW AX                        ; þþ
      SAHF                            ; þþ La Chromatique Rouge est
      JA  @@NoRChg                    ; þþ compare a 1.0 et est mise a 1.0
          Mov Byte Ptr  Cs:[Rd],255   ; þþ Arrondit Automatique
          Jmp @@DoGreen               ; þþ
      Even                            ; þþ
      @@NoRChg:                       ; þþ
      FLD Dword Ptr Cs:[Cct.R]          ; þþ
      Fild Dword Ptr Cs:[Mul255]      ; þþ
      Fmul                           ; þþ Ici On Arrondie les Couleurs
      Fistp Dword Ptr Cs:[Rd]         ; þþ Avant Mise en place du point
      @@DoGreen:                      ; þþ
      FLD Dword Ptr Cs:[Cct.G]          ; þþ
      FLD1                            ; þþ
      FUCOMPP                         ; þþ
      FSTSW AX                        ; þþ
      SAHF                            ; þþ La Chromatique Verte est
      JA  @@NoGChg                    ; þþ compare a 1.0 et est mise a 1.0
          Mov Byte Ptr Cs:[Gr],255    ; þþ
          Jmp @@DoBlue                ; þþ
      Even                            ; þþ
      @@NoGChg:                       ; þþ
      FLD Dword Ptr Cs:[Cct.G]          ; þþ
      Fild Dword Ptr Cs:[Mul255]      ; þþ
      Fmul                           ; þþ
      Fistp Dword Ptr Cs:[Gr]         ; þþ
      @@DoBlue:                       ; þþ
      FLD Dword Ptr Cs:[Cct.B]          ; þþ
      FLD1                            ; þþ
      FUCOMPP                         ; þþ
      FSTSW AX                        ; þþ La Chromatique Bleu est
      SAHF                            ; þþ compare a 1.0 et est mise a 1.0
      JA  @@NoBChg                    ; þþ Si et Seulement Si la Chromatique
;         Mov Eax,Dword Ptr Cs:[Is1]  ; þþ de d?part est superieure a 1.0
;         Mov Dword Ptr Cs:[C.B],Eax  ; þþþþ
          Mov Byte  Ptr Cs:[Bu],255   ; þþ
          Jmp @@DoPset                ; þþ
      Even                            ; þþ
      @@NoBChg:                       ; þþ
      FLD   Dword Ptr Cs:[Cct.B]        ; þþ
      Fild  Dword Ptr Cs:[Mul255]     ; þþ
      Fmul                           ; þþþþ
      Fistp   Dword Ptr Cs:[Bu]       ; þþþþþþ
      @@DoPset:

;     setzePixel(AddX+x,AddY+y,round(c.r*255),round(c.g*255) ,round(c.b*255) );
      Mov Ecx,Dword Ptr Cs:[Addx]     ; Positionnement du Demarrage
      Add Ecx,Dword Ptr Cs:[RunM_X]   ; Premier Point Haut Gauche
      Mov Ebx,Dword Ptr Cs:[Addy]     ;
      Add Ebx,Dword Ptr Cs:[RunM_Y]   ;
      Call Pset64K

      In Al,60h                       ; Test Clavier pour
      Dec Al                          ; Interruption
      Jz @@StopIt                     ; et sortie dans l'espace

Inc Dword Ptr Cs:[RunM_X]             ; Ajoute 2 au tramage X
Jmp @@W2Test
@@W2False:

Inc    Dword Ptr Cs:[RunM_Y]          ; Ajoute 2 au tramage Y
Jmp    @@W1Test
@@W1False:; Fin du While
@@StopIt:
RetN
RunMickey1 EndP

   Mov  Word Ptr Cs:[Abank_R],65535           ; Generation d'un Mickey en
   Call RunMickey1                            ; Lancement du remap en Question
Demarre:               ; Ici D?marre le programme

; Juste Pour Etre Tranquille
  Mov Ax,Cs
  Mov Ds,Ax
  Mov Es,Ax

  Finit         ; Necessaire
; þþþþþþ
; þþþþþþþþþþþþ  Valorisation de Demarrage
; þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
   ; R.p := Eye;                       ;   þþþþþþþ
   CoordCopy Eye Ra.Rp                 ;     þþþþþ
   ; ErrEps(Eye.z);                    ;       þþþ
   FLD Dword Ptr Cs:Ra.RP.z            ;       þþþ
   Call ErrEps                         ;       þþþ
   ; Normalize(LightV)                 ;       þþþ
   Mov Ax,Cs                           ;       þþþ
   Mov Ds,Ax                           ;       þþþ
   Mov Di,Offset LightV                ;       þþþ
   Call Normalize                      ;       þþþ
   ;vh.x:=-x;                          ;       þþþ
   FLD Dword Ptr Cs:[Eye.x]            ;       þþþ
   FCHS                                ;       þþþ
   FSTP Dword Ptr Cs:[Vh.x]            ;       þþþ
   ;vh.y:=-y;                          ;       þþþ
   FLD Dword Ptr Cs:[Eye.y]            ;       þþþ
   FCHS                                ;       þþþ
   FSTP Dword Ptr Cs:[Vh.y]            ;       þþþ
   ;vh.z:=(sqr(x)+sqr(y)+sqr(z))/z;    ;       þþþ
   FLD Dword Ptr Cs:[Eye.x]            ;       þþþ
   FMul st,St(0)                       ;       þþþ
   Fld Dword Ptr Cs:[Eye.y]            ;       þþþ
   FMul st,St(0)                       ;       þþþ
   Fadd                               ;       þþþ
   Fld Dword Ptr Cs:[Eye.z]            ;       þþþ
   FMul st,St(0)                       ;       þþþ
   Fadd                               ;       þþþ
   Fld Dword Ptr Cs:[Eye.z]            ;       þþþ
   Fdiv                               ;       þþþ
   Fstp Dword Ptr Cs:[Vh.z]            ;       þþþ
   ;normalize(vh);                     ;       þþþ
   Mov Ax,Cs                           ;       þþþ
   Mov Ds,Ax                           ;       þþþ
   Mov Di,Offset Vh                    ;       þþþ
   Call Normalize                      ;       þþþ
   ;if z<0 then                        ;       þþþ
   Fld Dword Ptr Cs:[Eye.z]            ;       þþþ
   FTST     ; Test St(0) & 0.0         ;       þþþ
   FSTSW AX                            ;       þþþ
   SAHF     ; Valorise Flags           ;       þþþ
   JAE @@NoMul                         ;       þþþ
   ;kMUl(-1,vh,vh);                    ;       þþþ
   Int 20;                             ;       þþþ
   Fld Dword Ptr Cs:[Vh.X]             ;       þþþ
   Fchs                                ;       þþþ
   Fstp Dword Ptr Cs:[Vh.X]            ;       þþþ
   Fld Dword Ptr Cs:[Vh.Y]             ;       þþþ
   Fchs                                ;       þþþ
   Fstp Dword Ptr Cs:[Vh.Y]            ;       þþþ
   Fld Dword Ptr Cs:[Vh.Z]             ;       þþþ
   Fchs                                ;       þþþ
   Fstp Dword Ptr Cs:[Vh.Z]            ;       þþþ
   @@NoMul:                            ;       þþþ
   ;vr.x:=vh.y*z-vh.z*y;               ;       þþþ
   Fld Dword Ptr Cs:[Vh.z]             ;       þþþ
   Fld Dword Ptr Cs:[Eye.y]            ;       þþþ
   Fmul                              ;       þþþ
   Fld Dword Ptr Cs:[Vh.y]             ;       þþþ
   Fld Dword Ptr Cs:[Eye.z]            ;       þþþ
   Fmul                               ;       þþþ
   Fsub                               ;       þþþ
   Fstp Dword Ptr Cs:[Vr.x]            ;       þþþ
   ;vr.y:=vh.z*x-vh.x*z;               ;       þþþ
   Fld Dword Ptr Cs:[Vh.x]             ;       þþþ
   Fld Dword Ptr Cs:[Eye.z]            ;       þþþ
   Fmul                               ;       þþþ
   Fld Dword Ptr Cs:[Vh.z]             ;       þþþ
   Fld Dword Ptr Cs:[Eye.x]            ;       þþþ
   Fmul                               ;       þþþ
   Fsub                               ;       þþþ
   Fstp Dword Ptr Cs:[Vr.y]            ;       þþþ
   ;vr.z:=vh.x*y-vh.y*x;               ;       þþþ
   Fld Dword Ptr Cs:[Vh.y]             ;       þþþ
   Fld Dword Ptr Cs:[Eye.x]            ;       þþþ
   Fmul                               ;       þþþ
   Fld Dword Ptr Cs:[Vh.x]             ;       þþþ
   Fld Dword Ptr Cs:[Eye.y]            ;       þþþ
   Fmul                               ;       þþþ
   Fsub                               ;       þþþ
   Fstp Dword Ptr Cs:[Vr.z]            ;       þþþ
   Fstp St(0)                          ;       þþþ
   ;normalize(vr);                     ;       þþþ
   Mov Ax,Cs                           ;       þþþ
   Mov Ds,Ax                           ;       þþþ
   Mov Di,Offset Vr                    ;     þþþþþ
   Call Normalize                      ;   þþþþþþþ
; þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
; þþþþþþþþþþþþ  Valorisation de Demarrage Termine
; þþþþþþ

; Fabrication d'un degre
  FLDPI
  FILD Dword Ptr GradBase
  Fdiv
  Fstp Dword Ptr Grad

  Mov  Eax,Dword Ptr Grad ; Eax Definit le degre de modif
  Mov  Si,Offset Xrotate  ; le vecteur applique
  Mov  Di,Offset MatriceE ; la Matrice genere
  Call DefineMatrix       ;

   Mov Sp,16384;+1024;+512 ; Permet un Gain de Temps !

   Mov  Ax,4F02h  ;þþþ Changement de mode video
   Mov  Bx,0111h  ;þþ  112 Mode 640*480 16m Pset    <- Et4000W32p
   Int  10h       ;þþþ 111 Mode 640*480 64k Pset64K <- Vesa

   Mov Si,Offset PaleGreen       ; þþþþþþ
   Mov Di,Offset K1Surf          ; þþþþ
   Call CopyColor                ; þþ Valorisation des pigments
   Mov Si,Offset MediumVioletRed ; þþ pour chacune des spheres
   Mov Di,Offset K2Surf          ; þþ composant le Mickey
   Call CopyColor                ; þþ
   Mov Si,Offset MediumVioletRed ; þþ
   Mov Di,Offset K3Surf          ; þþ
   Call CopyColor                ; þþ
   Mov Si,Offset Red;MediumVioletRed ; þþ
   Mov Di,Offset K4Surf          ; þþþþ
   Call CopyColor                ; þþþþþþ

   Mov  Dword Ptr Cs:[AddX] ,  0     ; Centrage sur ecran
   Mov  Dword Ptr Cs:[AddY] ,  0     ; 640*480
   Xor Ecx,Ecx
   Again:                        ; Attente touche escape
   Push Ecx
   Mov  Dword Ptr Cs:[BaseX],  0   ; Base de Remap d'un Mickey
   Mov  Dword Ptr Cs:[BaseY],  0
   Mov  Word Ptr Cs:[Abank_R],65535           ; Generation d'un Mickey en
   Call RunMickey1                            ; Lancement du remap en Question

   Mov Di,Offset MatriceE   ; On Effectue la rotation de chacun des points
   Mov Si,Offset K4         ;
   Call Rotation            ;
;   Mov Di,Offset MatriceE  ;
   Mov Si,Offset K1         ;
   Call Rotation            ;
;   Mov Di,Offset MatriceE  ;
   Mov Si,Offset K3         ;
   Call Rotation            ;
;   Mov Di,Offset MatriceE  ;
   Mov Si,Offset K2         ;
   Call Rotation            ;

   Add Word Ptr Cs:[AddX], 160
   Cmp Word Ptr Cs:[AddX],640
   Jl  @@NoIncBase
   Mov Word Ptr Cs:[AddX],0
   Add Word Ptr Cs:[AddY],120
   Cmp Word Ptr Cs:[AddY],480
   Jl  @@NoIncBase
   Mov Word Ptr Cs:[AddX],0
   Mov Word Ptr Cs:[AddY],0
   @@NoIncBase:
   Pop Ecx                  ;
   inc Cx
   Cmp Cx,180
   Jg  CestFinit
    In Al,60h
    Dec Al
   Jnz Again

   CestFinit:
   Mov  Ax,03h                   ; Retour en Mode Texte
   Int  10h

   Mov Sp,0FFFEh                 ; Validation Stack pour retour
Int 20h
StartC EndS
End StartC          ; Fin de Programme

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (BasilYercin)