File: seldes.pp

package info (click to toggle)
fpc 1.9.4-5
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 63,532 kB
  • ctags: 93,677
  • sloc: pascal: 675,850; makefile: 219,089; xml: 9,242; perl: 7,703; yacc: 3,074; ansic: 2,275; lex: 711; sh: 406; asm: 71; csh: 34; sed: 33; cpp: 26; tcl: 7
file content (91 lines) | stat: -rw-r--r-- 2,821 bytes parent folder | download | duplicates (2)
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
{$mode delphi}
uses
	crt,
	go32;

const
	maxx = 80;
	maxy = 25;
	bytespercell = 2;
	screensize = maxx * maxy * bytespercell;

	linB8000 = $B800 * 16;

type
	string80 = string[80];

var
	text_save : array[0..screensize-1] of byte;
	text_oldx, text_oldy : Word;

	text_sel : Word;

procedure status(s : string80);
begin
     gotoxy(1, 1); clreol; write(s); readkey;
end;

procedure selinfo(sel : Word);
begin
     gotoxy(1, 24);
     clreol; writeln('Descriptor base address : $',
     	hexstr(get_segment_base_address(sel), 8));
     clreol; write('Descriptor limit : ', get_segment_limit(sel));
end;

function makechar(ch : char; color : byte) : Word;
begin
     result := byte(ch) or (color shl 8);
end;

begin
     seg_move(dosmemselector, linB8000, get_ds, longint(@text_save),
     	screensize);
     text_oldx := wherex; text_oldy := wherey;
     seg_fillword(dosmemselector, linB8000, screensize div 2,
     	makechar(' ', Black or (Black shl 4)));
     status('Creating selector ''text_sel'' to a part of ' +
     	'text screen memory');
     text_sel := allocate_ldt_descriptors(1);
     set_segment_base_address(text_sel,
     	linB8000 + bytespercell * maxx * 1);
     set_segment_limit(text_sel, screensize - 1 - bytespercell *
     	maxx * 3);
     selinfo(text_sel);

     status('and clearing entire memory selected by ''text_sel''' +
     	' descriptor');
     seg_fillword(text_sel, 0, (get_segment_limit(text_sel)+1) div 2,
     	makechar(' ', LightBlue shl 4));

     status('Notice that only the memory described by the' +
     	' descriptor changed, nothing else');

     status('Now reducing it''s limit and base and setting it''s ' +
     	'described memory');
     set_segment_base_address(text_sel,
     	get_segment_base_address(text_sel) + bytespercell * maxx);
     set_segment_limit(text_sel,
     	get_segment_limit(text_sel) - bytespercell * maxx * 2);
     selinfo(text_sel);
     status('Notice that the base addr increased by one line but ' +
     	'the limit decreased by 2 lines');
     status('This should give you the hint that the limit is ' +
     	'relative to the base');
     seg_fillword(text_sel, 0, (get_segment_limit(text_sel)+1) div 2,
     	makechar(#176, LightMagenta or Brown shl 4));

     status('Now let''s get crazy and copy 10 lines of data from ' +
     	'the previously saved screen');
     seg_move(get_ds, longint(@text_save), text_sel,
     	maxx * bytespercell * 2, maxx * bytespercell * 10);

     status('At last freeing the descriptor and restoring the old '+
     	' screen contents..');
     status('I hope this little program may give you some hints on '+
     	'working with descriptors');
     free_ldt_descriptor(text_sel);
     seg_move(get_ds, longint(@text_save), dosmemselector,
     	linB8000, screensize);
     gotoxy(text_oldx, text_oldy);
end.