function menu_run(m: menu; c1, c2, c3, c4, c5, c6, c7, c8: byte):word;
Це є основна функція, що і виконує сновну функцію всього модуля. Змінні c1, c2, c3, c4, c5, c6, c7, c8 слугують для передачі кодів кольорів меню. Всередині функції використовуються процедури:
procedure screen_save; assembler;
procedure screen_restore; assembler;,
друкування підменю тощо. Основний алгоритм такий: намалювати пункти меню, прочитати клавішу з клавіатури і в залежності від клавіші пересунути вказівник вліво, вправо, вгору чи вниз відповідно. Кожен раз при перемальовці екрану, викликається функція screen_restore для того щоб підпункти меню не накладалися один на одного. Для забезпечення швидкості перемальування екрану, функції зберження та відновлення екрану написані на асемблері. Результат, що видаєтьсямає тип word. В старшому байті знаходиться номер пункту основного меню, а в молодшому - номер його підпункту. Перевірку в основній програмі можна, наприклад, зробити так:
run:=menu_run(m, 0, 3, 15, 0, 0, 3, 15, 0);
case hi(run) of
1: case lo(run) of
1: ... Дії до пункту 1 підменю 1
2: ...Дії до пункту 2 підменю 1
2: case lo(run) of
1: ...Дії до пункту 1 підменю 2
2: ...Дії до пункту 2 підменю 2
end;
end;
procedure menu_done(m: menu);
Функція деініціалізації, що закінчує роботу меню. Після виклику цієї функції неможна користуватись змінною m.
Сама змінна mмає таку структуру:
const
max_of_main = 10; максимальна кількість пунктів основного меню
max_of_item = 30; максимальна довжина тексту назви пункта
type
menu = record
mains: integer; кількість пунктів основного меню
current: integer; поточний виділений пункт
item1: array [1..max_of_main] of record масив інформації про кожен з пунктів
text: string[max_of_item]; напис
letter: char; гаряча клавіша
items: integer; кількість підпунктів
current: integer; поточний підпункт
item2: array [1..10] of record інформація про підпункти
text: string[max_of_item]; напис
letter: char; гаряча клавіша
able: boolean; можливість вибирати
end;
end;
end;
Як видно структура меню досить складна, але в ній одній компактно записана інформація про все меню.
Система перегляду інформаційних файлів та запуску демонстраційних програм
Ця система забезпечує перегляд в текстовому режимі файлів з текстовими данними (самі файли текстовими назвати не можна). Вона реалізована однією процедурою
procedure showtext(fname: string);, яка, як параметр приймає ім'я файлу з вихідним текстом і зображує його на екрані. Якщо файл не вміщається на екран, то за допомогою клавіш стрілочок можна прокрутити текст по екрану. Для зручності в програмуванні, вхідні файли мають скаладну структуру. Вони є масивом радків довжини 80:
type
str80 = string[80];
var
f: file of str80;
Непер ми можемо організувати прямий доступ до будь-якої компоненти цього файлу і нам не потрібно виділяти пам’ять на збереження текстової інформації. Ми по одному рядку зчитуємо з файлу і виводимо на екран.
for i:=0 to PSIZE-1 do begin
if eof(f) then str:=''
else read(f, str);
gotoxy(1, i+2);
textattr:=11+16*1;
write(str); clreol;
end;
Система перетворення текстових файлів на файли, що розпізнаються ограмою CURSOVA.
Маю сказати, що не дуже зручно редагувати файли у форматі прийнятному програмі CURSOVA. Тому тексти набираються в звичайному текстовому редакторі і за допомогою програми TEXT2STR перетворюються на файли STR. Як параметри програмі TEXT2STR необхідно задати ім’я файлу TXT та ім’я файлу STR. Всю іншу роботу вона зробить сама.
Тема "Пpогpамування вiдеоадаптеpiв" дуже актуальна в наш час, оскiльки вiдеоадаптеp - складова частина вiдеопiдсистеми будь-якого комп`ютеpа. Розpобка пpогpам, що iлюстpують деякi можливостi вiдеоадаптеpiв, а саме:
виведення символiв, змiна палiтpи та шpифтiв, надають всiм бажаючим змогу детальнiше ознайомитися з цими пpоцесами, а виконання пpогpам на тpьох piвнях: високому (мова пpогpамування Паскаль), сеpедньому (асемблеp з викоpистанням пеpеpивань BIOS/DOS) та низькому (асемблеp без викоpистання пеpеpивань) ще й має за мету поглибити знання студентiв з цих мов пpогpамування. Отже, пiсля
повного ознайомлення з даною навчальною пpогpамою, студент набуває досвiду в пpогpамуваннi вiдеоадаптеpiв i вже може спpобувати свої сили на цьому попpищi. Hа закiнчення не завадить сказати ще декiлька слiв пpо комп`ютеpнi
навчальнi засоби взагалi. Застосування нових iнфоpмацiйних технологiй в сфеpi освiти - один з засобiв пiдготовки кадpiв в сучасних умовах вpаховуючi задачi майбутнього. Розв`язок цiєї задачi потpебує пеpегляду всiєї системи освiти, пpи цьому особливу увагу слiд звеpтати на pозвиток фоpм пpедставлення знань, фоpмування iнтелектуальних вмiнь, набуття пpактичних навичкiв в областi застосування новiтнiх засобiв обчислювальної технiки. Пpи цьому повинна змiнитися сама технологiя навчання, бiльше уваги слiд пpидiляти виpобленню умiння самостiйно набувати знання в пpоцесi дослiдницької дiяльностi. Застосування новiтнiх iнфоpмацiйних технологiй дозволить також збiльшити зв`язки мiж пpедметами, що в подальшому може слугувати основою для ствоpення нових iнтегpованих куpсiв навчання. Разом з тим слiд зазначити, що комп`ютеpiзацiя навчання не вiдмiняє i не замiняє пpоцес спiлкування педагога зi студентом, а лише допомагає i тому, i iншому бiльш ефективно пpиймати участь в пpоцесi навчання i пpидiляти бiльше уваги елементам твоpчостi, на якi pанiше не вистачало часу (це стає можливим завдяки бiльш ефективній самостiйній пpацi студента i бiльш наочного пpедставлення нового матеpiалу).
Використана літератури
1. Р. Джордейн. Справочник програмиста персональних компьютеров типа IBM PC, XT и AT.
2. П. Абель. Язык ассемблера для IBM PC и программирования.
3. А. Епанешников, В. Епанешников. Программирование в среде Turbo Pascal 7.0.
4. Г. Шилдт. Язык Си для профессионалов.
5. Інфоpмацiйнi технологiї в сучаснiй школi. А.Ф.Веpлань, Л.О.Твеpезовська, В.А.Федоpчук.
6. Пpогpамиpование в сpеде Туpбо Паскаль. Д.Б.Поляков, И.Ю.Кpуглов
7. Пpогpамиpование видеоадаптеpов. А.В.Фpолов, Л.В.Фpолов
Додатки
CURSOVA.PAS
{$M $8000,0,0 }
uses crt, smenu, dos;
procedure Print(x, y, c1: byte; S: string);
begin
GotoXY(x, y);
textattr:=c1;
Write(S);
end;
procedure Frame(x1, y1, x2, y2: byte; S: string; c1, c2: byte; Double: boolean);
var i, k, Leng, High: byte;
begin
Leng:=x2-x1;
High:=y2-y1;
Window(x1, y1, x1+Leng, y1+High);
textattr:=c1;
ClrScr;
Window(1, 1, 80, 25);
if Double=True then Print(x1, y1, c1, 'Й') else Print(x1, y1, c1, 'Ъ');
for i:=1 to Leng do
if Double=True then Print(x1+i, y1, c1, 'Н') else Print(x1+i, y1, c1, 'Д');
if Double=True then Print(x2+1, y1, c1, '»') else Print(x2+1, y1, c1, 'ї');
for i:=1 to High do begin
if Double=True then Print(x1, y1+i, c1, 'є') else Print(x1, y1+i, c1, 'і');
if Double=True then Print(x2+1, y1+i, c1, 'є') else Print(x2+1, y1+i, c1, 'і');
end;
if Double=True then Print(x1, y2, c1, 'И') else Print(x1, y2, c1, 'А');
for i:=1 to Leng do
if Double=True then Print(x1+i, y2, c1, 'Н') else Print(x1+i, y2, c1, 'Д');
if Double=True then Print(x2+1, y2, c1, 'ј') else Print(x2+1, y2, c1, 'Щ');
if S<>'' then Print(x1+(Leng div 2)-(Length(S) div 2), y1, c2, ' '+S+' ');
end;
procedure Cursor(x1, x2: byte);
var
Reg: Registers;
begin
Reg.AH:=1;
Reg.CH:=x1;
Reg.CL:=x2;
Intr($10, Reg);
end;
function UpCasing(S1: string): string;
var
s: string;
b: byte;
begin
S:='';
for B:=1 to Length(S1) do
S:=S+UpCase(S1[B]);
UpCasing:=S;
end;
function Strg(W: LongInt): string;
var
s: string;
begin
Str(W, S);
Strg:=S;
end;
procedure KeyBar(w1, w2, w3, w4, w5, w6, w7, w8, w9, w10: string);
var
k1, k2, k3, k4, k5, k6, k7, k8, k9, k10: string;
begin
k1:=' ';
k2:=' ';
k3:=' ';
k4:=' ';
k5:=' ';
k6:=' ';
k7:=' ';
k8:=' ';
k9:=' ';
k10:=' ';
k1:=w1;
k2:=w2;
k3:=w3;
k4:=w4;
k5:=w5;
k6:=w6;
k7:=w7;
k8:=w8;
k9:=w9;
k10:=w10;
k1[0]:=chr(6);
k2[0]:=chr(6);
k3[0]:=chr(6);
k4[0]:=chr(6);
k5[0]:=chr(6);
k6[0]:=chr(6);
k7[0]:=chr(6);
k8[0]:=chr(6);
k9[0]:=chr(6);
k10[0]:=chr(5);
Print(1, 25, 7+16*0, '1');
Print(2, 25, 0+16*3, k1);
Print(8, 25, 7+16*0, ' 2');
Print(10, 25, 0+16*3, k2);
Print(16, 25, 7+16*0, ' 3');
Print(18, 25, 0+16*3, k3);
Print(24, 25, 7+16*0, ' 4');
Print(26, 25, 0+16*3, k4);
Print(32, 25, 7+16*0, ' 5');
Print(34, 25, 0+16*3, k5);
Print(40, 25, 7+16*0, ' 6');
Print(42, 25, 0+16*3, k6);
Print(48, 25, 7+16*0, ' 7');
Print(50, 25, 0+16*3, k7);
Print(56, 25, 7+16*0, ' 8');
Print(58, 25, 0+16*3, k8);
Print(64, 25, 7+16*0, ' 9');
Print(66, 25, 0+16*3, k9);
Print(72, 25, 7+16*0, ' 10');
Print(75, 25, 0+16*3, k10);
GotoXY(79, 25);
TextBackground(3);
ClrEol;
end;
procedure showtext(fname: string);
const
PSIZE = 23;
type
str80 = string[80];
var
f: file of str80;
str: str80;
pos, MPOS: integer;
ch: char;
procedure opening;
begin
assign(f, fname);
{$I-}
reset(f);
{$I+}
if ioresult<>0 then begin
textattr:=7; clrscr;
writeln('Error in opening file: ', fname);
halt;
end;
end;
procedure showfrom(n: integer);
var
i: integer;
begin
seek(f, n);
for i:=0 to PSIZE-1 do begin
if eof(f) then str:=''
else read(f, str);
gotoxy(1, i+2);
textattr:=11+16*1;
write(str); clreol;
end;
end;
procedure showhead;
begin
gotoxy(1, 1);
textattr:=16*3;
write('File: ', fname, ' ', pos, '/', MPOS,
' ', pos*100 div MPOS, '%');
clreol;
end;
procedure help;
begin
frame(10, 5, 70, 22, 'Help', 16*3, 16*3, true);
print(13, 7, 16*3, 'Slawa Pidgorny & Sveta Fialka proudly presents:');
print(13, 9, 16*3, 'CURSOVA 1.1');
print(13, 11, 16*3, 'Copycenter (C) 1997 UKMA');
print(13, 12, 16*3, 'University of "Kiev-Mohyla Academy"');
print(13, 13, 16*3, 'Department of Computer && System Sciences');
print(13, 15, 16*3, 'Director of the project: Oletsky Oleksiy Vitaliyevich');
print(13, 17, 16*3, 'Fullfilled by:');
print(13, 19, 16*3, ' * Slawa Pidgorny. <slawa@queen.ukma.kiev.ua>');
print(13, 18, 16*3, ' * Sveta Fiyalka. <svetaflk@queen.ukma.kiev.ua>');
print(13, 21, 16*3, 'Written on Turbo Pascal++ 7.0');
readkey;
end;
begin
opening;
cursor($20, $20);
pos:=0;
MPOS:=filesize(f);
repeat
showfrom(pos);
showhead;
ch:=readkey;
if ch=#27 then break;
if ch=#0 then begin
ch:=readkey;
if (ch=#59) then help;
if (ch=#68) then break;
if (ch=#80) and (pos<MPOS) then inc(pos);
if (ch=#72) and (pos>0) then dec(pos);
if (ch=#73) then if (pos>PSIZE) then dec(pos, PSIZE) else pos:=0;
if (ch=#81) then if (pos<MPOS-PSIZE) then inc(pos, PSIZE) else pos:=MPOS;
end;
until false;
cursor(6, 7);
end;
procedure error(str: string);
begin
writeln(str);
halt;
end;
var
fmen: array [1..10, 1..10] of string[80];
m: menu;
procedure fillmenu;
var
f: text;
mm: boolean;
str: string;
p1, p2, i, j: integer;
begin
assign(f, 'cursova.dat');
reset(f);
mm:=true;
p1:=1;
p2:=1;
while (not eof(f)) do begin
readln(f, str);
if mm then begin