Розробка комп ютерних навчальних засобів з обраної предметної області

СОДЕРЖАНИЕ: Національний Університет «Києво - Могилянська Академія» Департамент комп’ютерних технологій Кафедра інформатики РОЗРОБКА КОМП`ЮТЕРНИХ НАВЧАЛЬНИХ ЗАСОБІВ З ОБРАНОЇ ПРЕДМЕТНОЇ ОБЛАСТІ

Національний Університет «Києво - Могилянська Академія»

Департамент комп’ютерних технологій

Кафедра інформатики

`

Курсова робота
студента II курсу
Підгорного Свєтослава та студентки IIкурсу

Фіялко Світлани

Науковий керівник:

кандидат технічних наук

Олецький Олексій Віталійович

Київ. 1997.


, ` , ` , `. , , , . `: ; , , .

` ( ). ` .

` . . , .., , , ` , , . , `, - . , . ` . , , .

, , : , - , . , , , , . , , . , . ` . , `. , , , . .

, - , , , .

. , , . , . , ` . , , , , . , , -1, IBM PC - `, `. , , .

, - , :

* ` (, ), .

* , (, : , ).

* ( )

* , , `, .

, , , .

` (MathCAD, MathLab). .

` ` . , . - TERC. : LOGO LOGOWriter; , `, , , , .

IBM LinkWay. LinkWay . . , , , , : , , , .

LinkWay :

* .

* .

* .

* .

* .

, . , , л . , , .

, : п, , , , .

: . . , . , , , , .

- . : , , .

: , - , . , . . ` . , `, .

: . , . `.

Основи реалізації програми CURSOVA

Програма написана на мові Паскаль з використанням компілятора Turbo Pascal 7.0 та Turbo Assembler фірми Borland International, Inc. Програма працює в текстовому режимі. Керування відбувається за допомогою системи меню. Саму програму за внутрішньою побудовою можна поділити на три такі частини:

* Система меню

* Система просмотру інформаційних файлів та запуску демонстраційних програм

* Система перетворення текстових файлів на файли, що розпізнаються ограмою CURSOVA.

Система меню

Як вже було сказано, система меню забезпечує керування програмою. Це звичайне випадаюче (pop-up) меню. Зовнішній вигляд його зображений на малюнку 1.

Малюнок 1

Перший пункт меню, як ви бачите, виділений. Тобто, при натиснені кнопки Enter, зявиться підменю з списком можливих дій. Керувати виділеним пунктом можна за допомогою клавіш стрілочок.

Малюнок 2

Як видно, система меню зроблена досить схожою на меню більшості професійних програм і є досить інтуїтивною.

Внутрішньо система меню реалізована у вигляді окремого модуля з назвою SMENU.TPU. Там знаходяться такі костанти, змінні, процедури та функції:

procedure menu_init(var m: menu);

Процедура ініціалізує всі необхідні змінні і взагалі приводить систему меню в стан готовності до роботи. Змінна m є складною змінною в якій саме і знаходиться данні для меню.

procedure menu_insert_main(var m: menu; s: string; c: char);

Процедура вставляє в основне меню ще один пункт в меню m з написом s та гарячою літерою c .

procedure menu_insert_sub(var m: menu; n: integer; s: string; c: char);

Процедура вставляє в підменю з номером n основного меню ще один пункт, з написом s та гарячою літерою c .

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);

c ase 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 ioresult0 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 (posMPOS) then inc(pos);

if (ch=#72) and (pos0) then dec(pos);

if (ch=#73) then if (posPSIZE) then dec(pos, PSIZE) else pos:=0;

if (ch=#81) then if (posMPOS-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

menu_insert_main(m, str, );

mm:=false;

end else if str= then begin

mm:=true;

inc(p1); if (p110) then error(max no of submenus: 10);

p2:=1;

end else begin

fmen[p1, p2]:=copy(str, 1, pos( , str)-1);

inc(p2); if (p210) then error(max no of items in submenu: 10);

menu_insert_sub(m, p1+1, copy(str, pos( , str)+1, 255), );

end;

end;

end;

var

run: word;

extt: string;

begin

textattr:=7; clrscr;

menu_init(m);

menu_insert_main(m, ю, ‚);

menu_insert_sub(m, 1, Exit, x);

fillmenu;

repeat

keybar(Help, , , , , , , , , Menu);

run:=menu_run(m, 0, 3, 15, 0, 0, 3, 15, 0);

case hi(run) of

1: break;

2..10: begin

extt:=upcasing(copy(fmen[hi(run)-1, lo(run)],

pos(., fmen[hi(run)-1, lo(run)])+1, 255));

if extt=STR then showtext(fmen[hi(run)-1, lo(run)]);

if extt=EXE then begin

textattr:=7;

clrscr;

SwapVectors;

Exec(fmen[hi(run)-1, lo(run)], );

SwapVectors;

if DosError 0 then error(Dos error #+strg(DosError));

readkey;

end;

end;

end;

until false;

menu_done(m);

textattr:=7; clrscr;

writeln(Program created as a cursova by);

writeln( * Slawa Pidgorny. slawa@queen.ukma.kiev.ua);

writeln( * Sveta Fiyalka. svetaflk@queen.ukma.kiev.ua);

writeln(using Turbo Pascal 7.0.);

end.

SMENU.PAS

unit smenu;

interface

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 menu_init(var m: menu);

procedure menu_insert_main(var m: menu; s: string; c: char);

procedure menu_insert_sub(var m: menu; n: integer; s: string; c: char);

function menu_run(m: menu; c1, c2, c3, c4, c5, c6, c7, c8: byte): word;

procedure menu_done(m: menu);

implementation

uses

crt;

procedure Cursor(x1, x2: byte); assembler;

asm

mov ah, 1

mov ch, x1

mov cl, x2

int 10h

end;

function strings(a: integer): string;

var

s: string;

i: integer;

begin

s:=;

for i:=1 to a do begin

s:=s+ ;

end;

strings:=s;

end;

procedure colors(a, b: byte);

begin

textcolor(a); textbackground(b);

end;

procedure colour(a: byte);

begin

textattr:=a;

end;

procedure print(x, y: integer; c: byte; s: string);

begin

gotoxy(x, y);

colour(c);

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);

Colour(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 menu_init(var m: menu);

begin

m.mains:=0;

m.current:=1;

end;

procedure menu_insert_main(var m: menu; s: string; c: char);

begin

inc(m.mains);

m.item1[m.mains].text:=s;

m.item1[m.mains].letter:=c;

m.item1[m.mains].current:=1;

end;

procedure menu_insert_sub(var m: menu; n: integer; s: string; c: char);

begin

inc(m.item1[n].items);

m.item1[n].item2[m.item1[n].items].text:=s;

m.item1[n].item2[m.item1[n].items].letter:=c;

end;

function menu_run(m: menu; c1, c2, c3, c4, c5, c6, c7, c8: byte): word;

var

pos_tab: array[1..max_of_main] of record

x, l: integer;

end;

scr1: array[0..3999] of byte;

procedure screen_save; assembler;

asm

push ds

mov ax, 0B800h

mov ds, ax

xor si, si

mov ax, seg scr1

mov es, ax

mov di, offset scr1

mov cx, 1000

cld

db $66; rep movsw

pop ds

end;

procedure screen_restore; assembler;

asm

push ds

mov ax, seg scr1

mov ds, ax

mov si, offset scr1

mov ax, 0B800h

mov es, ax

xor di, di

mov cx, 1000

cld

db $66; rep movsw

pop ds

end;

procedure create_pos_tab;

var

i, p: integer;

begin

p:=2;

for i:=1 to m.mains do begin

pos_tab[i].x:=p;

inc(p, length(m.item1[i].text)+2);

end;

end;

procedure main_show(m: menu; sel: integer);

var

i: integer;

begin

gotoxy(1, 1);

colors(c1, c2);

clreol;

for i:=1 to m.mains do begin

if i=sel then begin

colors(c3, c4);

end else begin

colors(c1, c2);

end;

gotoxy(pos_tab[i].x, 1);

write( +m.item1[i].text+ );

end;

end;

function sub_menu_max_len(m: menu; n: integer): integer;

var

i, max: integer;

begin

max:=0;

for i:=1 to m.item1[n].items do begin

if maxlength(m.item1[n].item2[i].text) then begin

max:=length(m.item1[n].item2[i].text);

end;

end;

sub_menu_max_len:=max;

end;

procedure sub_show(m: menu; sel1, sel2: integer);

var

i: integer;

begin

frame(pos_tab[sel1].x, 2, 1+pos_tab[sel1].x+sub_menu_max_len(m, sel1)+1,

m.item1[sel1].items+3, , c5+16*c6, c7+16*c8, false);

for i:=1 to m.item1[sel1].items do begin

if i=sel2 then begin

colors(c3, c4);

end else begin

colors(c1, c2);

end;

gotoxy(pos_tab[sel1].x+1, 2+i);

write( +m.item1[sel1].item2[i].text+ +strings(

sub_menu_max_len(m, sel1)-length(m.item1[sel1].item2[i].text)));

end;

end;

var

main_menu_position: integer;

sub_menu_position: integer;

sub_menu_open: boolean;

ch: char;

saved_x, saved_y: byte;

saved_colors: byte;

begin

cursor($20, $20);

saved_colors:=textattr;

saved_x:=wherex;

saved_y:=wherey;

main_menu_position:=m.current;

sub_menu_open:=false;

create_pos_tab;

screen_save;

repeat

screen_restore;

main_show(m, main_menu_position);

if sub_menu_open then begin

sub_show(m, main_menu_position, sub_menu_position);

end;

ch:=readkey;

if ch=#0 then begin

ch:=readkey;

if ch=#75{Left} then begin

if main_menu_position1 then begin

m.item1[main_menu_position].current:=sub_menu_position;

dec(main_menu_position);

sub_menu_position:=m.item1[main_menu_position].current;

end;

end;

if ch=#77{Right} then begin

if main_menu_positionm.mains then begin

m.item1[main_menu_position].current:=sub_menu_position;

inc(main_menu_position);

sub_menu_position:=m.item1[main_menu_position].current;

end;

end;

if sub_menu_open then begin

if ch=#72{Up} then begin

if sub_menu_position1 then begin

dec(sub_menu_position);

end;

end;

if ch=#80{Down} then begin

if sub_menu_positionm.item1[main_menu_position].items then begin

inc(sub_menu_position);

end;

end;

end; {sub_menu_open}

end; {ch=#0}

if ch=#13{Enter} then begin

if not sub_menu_open then begin

sub_menu_open:=true;

sub_menu_position:=m.item1[main_menu_position].current;

end else begin

menu_run:=main_menu_position*256+sub_menu_position;

break;

end;

end;

if ch=#27{Esc} then begin

menu_run:=0;

break;

end;

until false;

screen_restore;

textattr:=saved_colors;

gotoxy(saved_x, saved_y);

cursor(6, 7);

end;

procedure menu_done(m: menu);

begin

end;

end.

TEXT2STR.PAS

type

str80 = string[80];

var

f1: text;

f2: file of str80;

str: string;

str2: str80;

begin

if paramcount2 then exit;

assign(f1, paramstr(1));

reset(f1);

assign(f2, paramstr(2));

rewrite(f2);

write(Processing);

while not eof(f1) do begin

readln(f1, str);

str2:=copy(str, 1, 80);

write(f2, str2);

write(.);

end;

writeln;

close(f2);

close(f1);

end.

CURSOV16.PAS

uses

crt;

procedure a1;

begin

textColor(14);

textBackground(3);

write(Slawa);

textAttr:=7;

writeLn;

end;

procedure a31; assembler;

asm

mov ah, 9 {function 9}

mov al, a {char a}

xor bh, bh {video page 0}

mov bl, 16*3+14 {color}

mov cx, 5 {print 5 times}

int 10h {printing}

end;

procedure a32;

const

str: array [0..6] of char =slawa+#13+#10;

begin

asm

push bp {push used registers to stack}

push es

mov ax, seg str {es is a segment register of text}

mov es, ax

mov bp, offset str {es:bp is an actual string location}

mov ah, 13h {funtion 13h}

mov al, 1 {only text}

mov bh, 0 {video page}

mov bl, 16*3+14 {color}

mov cx, 7 {chars counter}

mov dh, 10 {coordinates}

mov dl, 10

int 10h {printing}

pop es {restore registers}

pop bp

end;

end;

procedure a4; assembler;

const

color: byte = 16*3+14; {color}

str: array [0..4] of char

= slawa; {string to print}

strlen: word = 5; {length of that string}

asm

mov ax, 0B800h {mov es, 0B800h}

mov es, ax

mov cx, strlen {cx - counter of chars}

mov si, offset str {ds:si - text}

xor di, di {es:di - video memory}

@a:

lodsb {load byte from ds:si}

stosb {store byte to es:di}

mov al, color

stosb {store color to es:di}

loop @a {while there is more chars to print}

end;

begin

textattr:=7; clrscr; a1; readkey;

textattr:=7; clrscr; a31; writeln; textattr:=7; clreol; readkey;

textattr:=7; clrscr; a32; readkey;

textattr:=7; clrscr; a4; readkey;

end.

CURSOV26.PAS

uses crt, graph;

procedure a5;

var

aVGA, aVGALO: integer;

begin

aVGA:=VGA; aVGALO:=VGAHI;

initGraph(aVGA, aVGALO, ); {entering video mode 640x480x16}

setFillStyle(1, 13);

bar(10, 10, 100, 100); {making a filled rectangle}

readkey; {press any key}

setPalette(13, 3); {palette changing}

end;

procedure a6; assembler;

asm

{palette changing}

mov ah, 10h {function 10h for palette operations}

mov al, ah {subfunct 10h for changin 1 palette color}

mov bx, 14 {14 color number}

mov bh, 10 {red 10}

mov ch, 40 {green 40}

mov cl, 30 {blue 30}

int 10h {changing}

end;

procedure a7; assembler;

const

n: byte = 14; {color}

r: byte = 63; {red}

g: byte = 23; {green}

b: byte = 25; {blue}

asm

mov dx, 3C8h {port #3C8h}

mov al, n {outing color number}

out dx, al

inc dx {port #3C9h}

mov al, r {outing red}

out dx, al

mov al, g {outing green}

out dx, al

mov al, b {outing blue}

out dx, al

end;

procedure tograph(a: word); assembler;

asm

{entering mode13h - 320x200x256}

mov ax, 13h

int 10h

{filling all the screen with 14th color}

mov ax, 0A000h

mov es, ax {mov es, 0A000h}

mov cx, 64000/2 {cx - counter}

xor di, di {begin of video memory is at 0A000:0}

cld {move forward}

mov ax, a {color to put}

rep stosw {filling}

end;

procedure totext; assembler;

asm

mov ax, 3 {changing video mode to text one}

int 10h

end;

begin

textattr:=7; clrscr; a5; readkey;

tograph(14+256*14);

readkey;

a6;

readkey;

a7;

readkey;

totext;

end.

CURSOV33.PAS

uses

crt;

procedure a8; assembler;

asm

mov ah, 11h {function 11h - bios font operations}

mov al, 11h {8x14}

mov bl, 0 {font plane}

int 10h {changing}

call readkey; {let you see the changes}

mov ah, 11h {function 11h - bios font operations}

mov al, 12h {8x8}

mov bl, 0 {font plane}

int 10h {changing}

call readkey; {let you see the changes}

mov ah, 11h {function 11h - bios font operations}

mov al, 14h {8x16}

mov bl, 0 {font plane}

int 10h {changing}

call readkey; {let you see the changes}

end;

begin

writeln(Thats a text mode font changing demonstration);

a8;

end.

Скачать архив с текстом документа