-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRGBBOX.PAS
More file actions
139 lines (120 loc) · 2.85 KB
/
RGBBOX.PAS
File metadata and controls
139 lines (120 loc) · 2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
{Projet: Afficher une boŒte de couleur RVB en 3D
Date de r‚daction: Jeudi le 7 juin 2001
Nom du programmeur: Sylvain Maltais
Configuration requise: VESA + mode 640x480x65536
Courriel: gladir@hotmail.com
Site de distribution: https://www.gladir.com/SOURCES/index.html
Description
ÍÍÍÍÍÍÍÍÍÍÍ
Ce programme permet d'afficher un cube en 3 dimensions de couleur
RVB (Rouge, Vert et Bleu). Chacun des axes correspond … ceci:
X = Rouge
Y = Vert
Z = Bleu
Remarque
ÍÍÍÍÍÍÍÍ
þ Ce d‚monstrateur fonctionne correctement seulement en mode vid‚o
640 x 480 en 65536 couleurs de la plupart des cartes ®Super VGA¯
supportant se mode et naturellement le standard ®VESA¯.
}
Program SampleRGBCube;
Const
CenterHorizontal=640 shr 1;
CenterVertical=480 shr 1;
White=$FFFF;
{ Cette routine n'est pas trŠs efficace mais permet de changer les pages
d'affichage correspondant au standard VESA.
}
Procedure SetBankPage(Page:Word);Assembler;ASM
MOV AX,04F05h
XOR BX,BX
MOV DX,Page
PUSH DX
INT 010h
POP DX
MOV AX,04F05h
MOV BX,1
INT 010h
END;
{ Cette proc‚dure permet d'afficher un pixel au coordonn‚es (X,Y) avec
la couleur ®Color¯.
}
Procedure SetPixel(X,Y,Color:Word);Assembler;ASM
TEST X,8000h
JNZ @End
SHL X,1
MOV AX,640 shl 1
MUL Y
XCHG AX,DI
ADD DI,X
PUSH DI
ADC DX,0
PUSH DX
CALL SetBankPage
POP DI
MOV AX,0A000h
MOV ES,AX
MOV AX,Color
STOSW
@End:
END;
{ Cette proc‚dure permet l'affichage d'un point selon une coordonn‚e
en 3 dimensions partant du centre de l'‚cran.
}
Procedure SetPixel3D(X,Y,Z:Integer;Color:Word);Begin
SetPixel(CenterHorizontal+X-(Z shr 1),CenterVertical-Y+(Z shr 1),Color);
End;
{ Cette fonction retourne la couleur encod‚ RVB d'un mode d'affichage
en 65536 couleurs.
}
Function RGB2Color(R,G,B:Byte):Word;Assembler;ASM
MOV AH,R
AND AH,0F8h
MOV AL,B
{$IFOPT G+}
SHR AL,3
{$ELSE}
SHR AL,1
SHR AL,1
SHR AL,1
{$ENDIF}
MOV BL,G
AND BX,00F8h
{$IFOPT G+}
SHR BX,3
{$ELSE}
SHL BX,1
SHL BX,1
SHL BX,1
{$ENDIF}
ADD AX,BX
END;
Var I,J,K:Byte; { Compteur de boucle }
BEGIN
{ Permet de change de mode vid‚o }
ASM
MOV AX,04F02h
MOV BX,00111h { Mode 640x480 en 65536 couleurs }
INT 010h
END;
{ Trace des lignes de bordures de couleur blanche }
For I:=0to 149do Begin
SetPixel3D(0,0,I,White);
SetPixel3D(0,I,0,White);
SetPixel3D(I,0,0,White);
End;
{ Si vous souhaitez afficher tous les Pixels un par un:
For K:=0to 99do For I:=0to 99do For J:=0to 99do Begin
SetPixel3D(I,J,K,RGB2Color(I,J,K));
End;
}
{ Trace les 3 faces du cube de couleurs }
For J:=99downto 0do For I:=0to 99do SetPixel3D(I,J,99,RGB2Color(I,J,99));
For K:=0to 99 do For I:=0to 99do SetPixel3D(I,99,K,RGB2Color(I,99,K));
For J:=99downto 0do For K:=0to 99do SetPixel3D(99,J,K,RGB2Color(99,J,K));
{ Attend que l'utilisateur enfonce une touche }
ASM
XOR AX,AX
INT 16h
END;
END.