Graficos en Pascal
Publicado por ramon (2158 intervenciones) el 09/03/2013 19:20:52
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
(*Por la cantidad de informacion en esta pagina [Compiladr de pascal 7.7] la
cual os recomiendo para segir el proceso de programacion en pascal paso a
abrir una nueva para el sistema de programacion de graficos.
Empezaremos creando una unidad para nuestros graficos los cuales nos
permitiran de momento trabajar con pantallas de 640x480 con 16/256/24bit de
colores.
Iremos esplicando poco a poco cada proceso provandolo individual mente y
despues crearemos la unidad con todos ellos.
Lo primero que tenemos que realizar es la comprovacion de la presencia y
toma de datos de nuestra targeta grafica os comento que estaremos con el
estandar vesa que hoy es lo normal.
En la vesa tenemos dor registros de infoemacion no todos se empleara pero
para que la conoccais la iremos presentando.*)
program unidadgf;
{$G+} (*Generaci¢n de C¢digo 80286 en el estado {$G-} codiga 8086*)
{$N+} (*Coprocesador Num‚rico en el estado {$N-} rutinas de librer¡a*)
(*Conmuta entre los dos modelos diferentes de generaci¢n de c¢digos*)
uses
crt, dos; (*unidades estandar de pascal*)
type
pModoList = ^tModoList; (*Puntero a los modos de video soportados*)
tModoList = Array[0..65] of word; (*Array de modos soportados*)
(*Primer registro de informacion vesa*)
cabeceravesa = record
identif : array[1..4] of char; (*Identificacion [vesa]*)
version : array[1..2] of byte; (*Version de la vesa*)
targeta : pchar; (*Nombre de la casa*)
capabilities : longint; (*Compatibilidad*)
Modosvideo : pmodolist; (*Modos de video de la tarjeta*)
memoriatama : word; (*Tama¤o de la memoria*)
revision : word; (*Fecho revision*)
nombrevendor : pchar; (*Nonbre del vendedor*)
nombreproducto : pchar; (*Nombre del producto*)
revisionproducto : pchar; (*Fecha revision del producto*)
reserbado : array[0..221] of byte; (*Reservados*)
datosmas : array[0..255] of byte; (*Reservados*)
end;
(*Segundo registro de informacion vesa*)
informacionvesa = record
attributes : word; (*atributos de modo*)
winAa : byte; (*atributos ventana A*)
winBa : byte; (*atributos ventana B*)
granula : word; (*granularidad ventana*)
winize : word; (*tama¤o ventana*)
segwinA : word; (*inicio segmento ventana A*)
segwinB : word; (*inicio segmento ventana B*)
winfunction : pointer;(*puntero a funcion ventana*)
bytesporline : word; (*bytes por linea de exploracion*)
tamx : word; (*resolucion horizontal x*)
tamy : word; (*resolucion vertical y*)
charcex : byte; (*ancho de caracter x *)
charcey : byte; (*altura de los caracteres y *)
memoplanes : byte; (*num. de planos de memoria*)
bitspixel : byte; (*bits por pixel*)
numbanks : byte; (*num. de bancos*)
memtype : byte; (*Tipo de memoria o modelo*)
sizebank : byte; (*tama¤o banco en kb*)
numpages : byte; (*num. de paginas*)
reserve1 : byte; (*reserbado*)
redsize : byte; (*tama¤o de la mascara roja directa color en bits*)
redpos : byte; (*posicion de bit LSB de mascara roja*)
greesize : byte; (*tama¤o de la mascara verde directa color en bits*)
greepos : byte; (*posicion de bit LSB de mascara verde*)
bluesize : byte; (*tama¤o de la mascara azul directa color en bits*)
bluepos : byte; (*posicion de bit LSB de mascara azul*)
ressize : byte; (*tama¤o de la mascara reservados*)
respos : byte; (*posicion de bit LSB de reservados*)
dircolorinfo : byte; (*atributos Directos Modo de color*)
linvidbuffer : pointer; (*puntero al buffer*)
reserve4 : array[1..210] of byte; (*reservado*)
end;
bgr = array[0..3] of byte; (*array para el color*)
dibujo = record (*registro para el puntero del raton*)
xg : integer; (*posicion x del raton*)
yg : integer; (*posicion y del raton*)
imag : array[0..15,0..15] of byte; (*pantalla de la posicion*)
(* del raton*)
colores : array[0..15,0..15] of bgr;(*colores tomados*)
end;
const
loximag = 15; (*longitud x de la imagen*)
loyimag = 15; (*longitud y de la imagen*)
blue : byte = 255; (*variable de color verde*)
green : byte = 255; (*variable de color azul*) (*estado inicial*)
red : byte = 255; (*variable de color rojo*)
(*Nuestro raton*)
raton : array[0..15,0..15] of byte = (
(1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(1,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0),
(1,8,8,1,0,0,0,0,0,0,0,0,0,0,0,0),
(1,8,8,8,1,0,0,0,0,0,0,0,0,0,0,0),
(1,8,8,8,8,1,0,0,0,0,0,0,0,0,0,0),
(1,8,8,8,8,8,1,0,0,0,0,0,0,0,0,0),
(1,8,8,8,8,8,8,1,0,0,0,0,0,0,0,0),
(1,8,8,8,8,8,8,8,1,0,0,0,0,0,0,0),
(1,8,8,8,8,8,8,8,8,1,0,0,0,0,0,0),
(1,8,8,8,8,8,1,1,1,1,1,0,0,0,0,0),
(1,8,8,1,1,8,1,0,0,0,0,0,0,0,0,0),
(1,1,1,0,1,8,8,1,0,0,0,0,0,0,0,0),
(1,1,0,0,1,8,8,1,0,0,0,0,0,0,0,0),
(0,0,0,0,0,1,8,8,1,0,0,0,0,0,0,0),
(0,0,0,0,0,1,8,8,1,0,0,0,0,0,0,0),
(0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0));
var
mous : dibujo; (*para el raton*)
sal, mouse : boolean; (*para la presencia o ausencia del raton*)
cabecera : cabeceravesa; (*para la cabecera vesa*)
infovesa : informacionvesa; (*para la informacion vesa*)
page, currentblock, temp, BPP : Byte; (*para nuestra vesa datos*)
cbank, modo : word; (*para nuestra vesa datos*)
regs : registers; (*para los datos del raton*)
xm, ym, x, y, screeny, screenx : Integer; (*datos de posiciones*)
maxx, maxy : word; (*lo mismo de antes*)
tecla : char; (*para el teclado*)
colorpixel, jpgszin : bgr; (*para el color*)
esta : boolean; (*para el estado vesa*)
tamano : longint; (*para la memoria video*)
modosl : pModoList; (*modos video*)
(*funcion conversion word a string*)
function wordstring(n : word) : string;
var
s : string[12];
begin
str(n,s);
wordstring := copy(s,1,sizeof(s));
end;
(*conversion a exadecimal un word*)
function hexstr(val : word; cnt : byte) : string;
const
HexTbl : array[0..15] of char = '0123456789ABCDEF';
var
i : longint;
begin
hexstr[0] := char(cnt);
for i := cnt downto 1 do
begin
hexstr[i] := hextbl[val and $f];
val := val shr 4;
end;
end;
(*recojemos los datos de la cabecera vesa*)
procedure informacioncabeceravesa;assembler;
asm
mov ax,4f00h
mov bx,seg cabecera.identif[1]
mov es,bx
mov di,offset cabecera.identif
int 10h
end;
(*comprovamos se esiste el modo vesa y cargamos los datos*)
procedure setvideo(mo : word);
var
segm, ofsm : word;
begin
informacioncabeceravesa;
esta := true;
asm
mov ax,4f02h
mov bx,mo
int 10h
cmp ax,4fh
je @exit
mov ah,00h
mov al,3
int 10H
mov esta,false
@exit:
end;
if esta = false then
begin
writeln('<<< Error Grafico Sistema Vesa No Presente >>>');
writeln('******* Pulse [Enter] ********');
readln;
halt;
end;
segm := seg(infovesa);
ofsm := ofs(infovesa);
asm
push es
mov ax,4f01h
mov cx,mo
mov es,segm
mov di,ofsm
int 10h
mov segm,es
mov ofsm,di
pop es
end;
maxx := infovesa.tamx;
maxy := infovesa.tamy;
screeny := maxy;
screenx := maxx;
page := 0;
currentblock := 0;
temp := 0;
BPP := 16;
end;
(*cerramos el modo grafico vesa pasando a texto*)
procedure closegraph;assembler;
asm
mov ah,00h
mov al,03h
int 10h
end;
(*programa principal comprovamos lo dicho*)
begin
clrscr;
modo := $101;
setvideo(modo);
if esta = true then
begin
closegraph;
writeln;
writeln(' Identificacion : ',cabecera.identif[1],cabecera.identif[2],
cabecera.identif[3],cabecera.identif[4]);
writeln(' Version : ',cabecera.version[2],'.',
cabecera.version[1]);
writeln(' Fabricante : ',cabecera.targeta);
tamano := cabecera.memoriatama;
tamano := (tamano * 64000) div 1024;
writeln(' Memoria Tama¤o : ',tamano,' Kb');
writeln(' Modos Soportados ');
x := 0;
sal := false;
repeat
if cabecera.Modosvideo^[x] < 655 then
write(' $',hexstr(cabecera.Modosvideo^[x],3))
else
sal := true;
x := x + 1;
until (sal = true) or (x > 65);
writeln;
writeln(' *** Pulse [Enter] ***');
readln;
end;
end.
(*Con esto podeis practicar la prosima pintaremos y moveremos el raton*)
Valora esta pregunta
0