Программатор ПЗУ (программный интерфейс)
2
Абель П. «Язык Ассемблер для IBM PC и программирования», Москва, изд.
«Высшая школа», 1992г., ISBN 5-101-123447-1
Гейтс Б. «Дорога в будующее», Москва, изд. «Русская редакция», 1996г., ISBN
5-7502-0019-1
Информация с сервера www.referats.aha.ru, изд. INTERNET
CD-библиотека «Все для инженера», изд. InfoLink, 1997г.
ПРИЛОЖЕНИЕ 1
ПРОГРАММНЫЙ ИНТЕРФЕЙС
Uses DOS;
Type TNT = Array[0..65534]Of Byte;
Filearray = Array[1..5000]Of String[12];
Const
U0 = Char(200);
U1 = Char(201);
U2 = Char(202);
U3 = Char(199);
U4 = Char(198);
U5 = Char(203);
U6 = Char(193);
U7 = Char(192);
Up = Char(194)+Char(195);
Uf = Char(196)+Char(185);
Us = Char(197)+Char(186);
Speed = 3;
Hex : Array[0..15]Of Char =
('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
Var
Buffer : ^TNT;
Filx : ^filearray;
Dirx : ^filearray;
Fake : ^TNT;
ScanCode: Byte;
Key : Char;
Screen : Array[0..50*90] of byte;
Segscr : Word;
Ofsscr : Word;
px,py : Byte;
Clr : Byte;
MenuP : Byte;
F : File;
RomSize : Longint;
Curd : String;
RomName : String;
lxul,lyul,lxdr,lydr : byte;
Procedure WaitRt; assembler;
Asm
mov dx,$3da
@wa1:
in al,dx
test al,8
je @wa1
@wa2:
in al,dx
test al,8
jne @wa2
End;
Procedure Color(c1,c2 : byte);
Begin
clr:=c1+16*c2;
End;
Procedure Loc(x,y: byte);
Begin
px:=x;
py:=y;
End;
Procedure WChar(c : char);
Begin
screen[py*160+px+px]:=byte(c);
screen[py*160+px+px+1]:=clr;
inc(px);
If px=80 Then
Begin px:=0; inc(py);
If py>25 Then py:=25;
End;
End;
Procedure Shade(x : byte);
Var
m : byte;
Begin
For m:=1 To x Do
Begin
Screen[py*160+px+px+1]:=screen[py*160+px+px+1] And $7;
inc(px);
If px=80 Then
Begin px:=0; inc(py);
If py>25 Then py:=25;
End;
End;
End;
Procedure Wrt(s : string);
Var
x: word;
Begin
For x:=1 To length(s) Do WChar(s[x]);
End;
Procedure WrtLn(s : string);
Var
x: word;
Begin
For x:=1 To length(s) Do WChar(s[x]);
px:=0;
inc(py);
If py>25 Then py:=25;
End;
Procedure Map;
Begin
Move(screen,mem[$b800:0],80*50);
End;
Procedure Cls;
Begin
FillChar(screen,80*50,0);
End;
Procedure ReadKey; assembler;
Asm
xor ax,ax
int 16h
End;
Function ScanKey : char;
Var
x : byte;
Begin
x:=255;
Asm
mov ah,01
int 16h
jz @nokey
mov x,al
mov ScanCode,ah
@nokey:
End;
If x<>255 Then ReadKey;
ScanKey:=char(x);
End;
Procedure SkipTime;
Var
h,m,s,c : word;
lh,lm,ls,lc : longint;
abstime1,abstime2: longint;
Begin
GetTime(h,m,s,c);
lh:=h; lm:=m; ls:=s; lc:=c;
abstime1:=lc+(ls*100)+(lm*60*100)+(lh*60*60*100);
Repeat
GetTime(h,m,s,c);
lh:=h; lm:=m; ls:=s; lc:=c;
abstime2:=lc+(ls*100)+(lm*60*100)+(lh*60*60*100);
Until (abstime2<>abstime1);
End;
Procedure MoveMan;
Var
addr : word;
a : byte;
x : word;
Begin
addr:=0;
For x:=0 To 80*25-1 Do
Begin
a:=screen[addr];
If (a>207)And(achar(255);
End;
Procedure Window(xul,yul,xdr,ydr : byte; name : string);
Var
x,y : word;
Begin
Loc(xul,yul);
Wrt(up);
For x:=xul+2 To xdr Do Wrt('-');
For y:=yul+1 To ydr-1 Do
Begin
Loc(xul,y); Wrt(u0);
For x:=xul+1 To xdr-1 Do Wrt(' ');
Wrt(u1);
Shade(2);
End;
Loc(xul,y);
Wrt(u4);
For x:=xul+1 To xdr-1 Do Wrt(u7);
Wrt(u5);
Loc(xul+2,ydr);
Shade(xdr-xul+1);
x:=length(name) shr 1;
y:=(xdr-xul)shr 1+xul;
y:=y-x;
Loc(y+1,yul);
y:=clr;
x:=(clr and $F0)shr 4;
color(x,clr and $0F);
Wrt(name);
clr:=y;
lxul:=xul;
lyul:=yul;
lxdr:=xdr;
lydr:=ydr;
End;
Procedure Morph(xf1,yf1,xf2,yf2,xt1,yt1,xt2,yt2 : byte);
Var
x : word;
Begin
Window(xf1,yf1,xf2,yf2,'');
Repeat
MakeMans;
If xf1>xt1 Then dec(xf1,((xf1-xt1)Shr speed)+1);
If xf1yt1 Then dec(yf1,((yf1-yt1)Shr speed)+1);
If yf1xt2 Then dec(xf2,((xf2-xt2)Shr speed)+1);
If xf2yt2 Then dec(yf2,((yf2-yt2)Shr speed)+1);
If yf20 Then dec(yp);
Until (Key=chr(13))or(Key=chr(27));
x:=x1-2;
Repeat
Loc(x,y1+(stepy*yp));
Wrt(' '+chr(205));
WaitRt;
Map;
inc(x,1);
Until x>=x1+lenx;
clr:=yt;
MenuP:=yp;
End;
Procedure HexL2Str(l : longint; var s : string);
Begin
s:=hex[(l shr (4*7))and 15];
s:=s+hex[(l shr (4*6))and 15];
s:=s+hex[(l shr (4*5))and 15];
s:=s+hex[(l shr (4*4))and 15];
s:=s+hex[(l shr (4*3))and 15];
s:=s+hex[(l shr (4*2))and 15];
s:=s+hex[(l shr (4*1))and 15];
s:=s+hex[(l)and 15];
End;
Procedure HexB2Str(l : byte; var s : string);
Begin
s:=hex[(l shr 4)and 15];
s:=s+hex[(l)and 15];
End;
Procedure MemEd(name: string);
Var
x,y : word;
l,l1,p,lpos : longint;
s,st : string;
stc : byte;
size : longint;
readsize : longint;
bank : word;
b1,b2 : byte;
flag : boolean;
i : searchrec;
Label Repaint, TryAgain;
Begin
TryAgain:
FindFirst(name,AnyFile,i);
If i.Attr And ReadOnly = ReadOnly Then
Begin
stc:=clr;
color(7,4);
MorPhL(20,7,56,15);
WindowL('File has ReadOnly Attribute!');
Menu(30,9,2,3,$4b,'Remove it','Reselect
file','Exit','xxx4','xxx5',6);
If MenuP=1 Then
Begin
MenuP:=8;
exit;
End;
If MenuP=2 Then
Begin
MenuP:=0;
exit;
End;
clr:=stc;
assign(f,name);
SetFattr(f,(i.Attr xor ReadOnly));
MorPhL(0,0,77,24);
Color(7,6);
WindowL('Memory Editor');
goto TryAgain;
End;
Assign(f,name);
reset(f,1);
size:=FilesiZe(f);
l1:=0;
p:=0;
lpos:=0;
bank:=0;
flag:=false;
If size>35000 Then readsize:=35000 Else readsize:=size;
blockread(f,buffer^,readsize);
RePaint:
If l1 Div 32767 <> bank Then
Begin
If flag Then
Begin
color(7,4);
MorPhL(24,7,50,14);
WindowL('Save Changed Data?');
Menu(36,9,3,2,$4b,'YES','NO','xxx3','xxx4','xxx5',6);
If MenuP=0 Then
Begin
Seek(f,lpos);
blockwrite(f,buffer^,readsize);
End;
MorPhL(0,0,77,24);
Color(7,6);
WindowL('Memory Editor');
End;
lpos:=(l1 div 32767)*32767+(l1 div 32767);
Seek(f,lpos);
If size-l1>35000 Then readsize:=35000 Else readsize:=size-
l1;
blockread(f,buffer^,readsize);
bank:=l1 div 32767;
flag:=false;
end;
l:=l1 and 32767;
Loc(2,1);
Wrt('address 0 1 2 3 4 5 6 7 8 9 A B C D E F
ASCII');
For x:=2 To 22 Do
Begin
Loc(2,x);
HexL2Str(l+(l1 and (32767 xor $FFFFFFFF)),s);
Wrt(s+': ');
For y:=1 to 16 do
Begin
HexB2Str(buffer^[l],s);
Wrt(s+' ');
inc(l);
End;
For y:=16 Downto 1 Do
Begin
Wrt(char(buffer^[l-y]));
End;
End;
l:=l1 and 32767;
Repeat
Repeat
stc:=clr;
color(6,7);
HexB2Str(buffer^[l+p],s);
Loc((((p) and 15)*3)+13,(p) shr 4+2);
Wrt(s);
Loc((((p) and 15))+61,(p) shr 4+2);
Wrt(char(buffer^[l+p]));
clr:=stc;
WaitKey;
Until (Key=chr(13))or(ScanCode=$49)or(ScanCode=$51)or(ScanCode=$48)
or(ScanCode=$4D)or(ScanCode=$4B)or(ScanCode=$50)or(Key=chr(27))
or((Key>='0')and(Key='A')and(Upcase(Key)='0')And(Key='A')And(Upcase(Key)='0')And(Key='0')and(Key='A')and(Upcase(Key)='0')And(Key='0')And(Key='A')And(Upcase(Key)320+15 then begin
inc(l1,16); p:=320+(p and 15); goto RePaINt; end; end;
$48: begin if (p>15)or(l1<>0)then dec(p,16); if p320+15 then begin
inc(l1,16); p:=320; goto RePaINt; end; end;
$4B: begin if (p>0)or(l1<>0)then dec(p); if p319) then begin dec(l1,320) end else l1:=0; goto
RePaint; end;
$51: begin inc(l1,320); if l1>size-336 then l1:=size-336; goto
RePaint; end;
end;
Until (key=chr(13))or(Key=chr(27));
If flag Then
Begin
color(7,4);
MorPhL(24,7,50,14);
WindowL('Save Changed Data?');
Menu(36,9,3,2,$4b,'YES','NO','','','',6);
If MenuP=0 Then
Begin
Seek(f,lpos);
blockwrite(f,buffer^,readsize);
End;
End;
close(f);
End;
Function LowCase(s : string) : string;
Var
x : integer;
Begin
LowCase:=s;
For x:=1 To length(s) Do
Begin
If (s[x]>='A')And(s[x]'.' Then inc(dz);
End
Else
Begin
dirx^[fz+1]:=LowCase(i.name);
inc(fz);
End;
FindNext(i);
Until DOSERROR<>0;
z:=dz+fz;
x:=1;
For y:=dz To z Do
Begin
filx^[y]:=dirx^[x];
inc(x);
End;
Repeat
maxp:=curp+17;
If maxp>(z-1) Then maxp:=(z-1);
For y:=curp To maxp Do
Begin
Loc(23,3+y-curp);
name:=filx^[curp+(y-curp)];
For x:=17 DownTo length(filx^[curp+(y-curp)]) Do
name:=name+' ';
If curps=(y-curp+1) Then color(1,2) Else color(7,1);
Wrt(' '+name);
End;
Repeat
WaitKey;
Until
(Key=chr(13))or(ScanCode=$48)or(ScanCode=$50)or(Key=chr(27))or(ScanCod
e=82);
Case ScanCode Of
$50: inc(curps);
$48: dec(curps);
82:
Begin
MOrPhL(10,10,40,15);
WindowL('Input File Name .ROM');
y :=1;
zs:=' ';
Loc(22,12);
Wrt('-');
Repeat
WaitKey;
Loc(21+y,12);
If (Key<>chr(13))And(Key<>chr(27)) Then
If (Key<>chr(08)) Then
Begin
If y<>9 Then
Begin
zs[y]:=Key;
Wrt(key+'-');
inc(y);
End;
End
Else
If y<>1 Then
Begin
dec(y);
Loc(21+y,12);
zs[y]:=' ';
Wrt('- ');
End;
Until (Key=Chr(13))or(Key=chr(27));
MorPhL(20,8,50,12);
Color(7,4);
WindowL('!!!!!!!!!!!!');
Loc(30,10);
Wrt('Жди давай!'+chr(208));
Map;
Assign(f,zs+'.ROM');
Rewrite(f);
y:=$FF;
For pos:=1 To romsize Do Write(f,byte(y));
close(f);
Key:=chr(255);
ScanCode:=0;
color(7,1);
MorPhL(20,2,50,22);
WindowL('Выберите файл');
s:='';
Goto RePaint;
End;
End;
If curps>(z-1) Then curps:=(z-1);
If (curps>18) Then
Begin
curps:=18;
If curp1 Then dec(curp);
End;
Until (Key=chr(13))or(Key=chr(27));
Color(7,1);
If Key=chr(13) Then
Begin
FindFirst(filx^[curp+curps-1],00,i);
If DOSERROR<>0 Then
Begin chdir(filx^[curp+curps-1]);
Goto RePaint;
End;
s:=filx^[curp+curps-1];
End;
End;
Procedure ReadROM(addr : longint);
Var
x : word;
y : byte;
Begin
x:=addr;
port[$378]:=x and 65535;
port[$379]:=x shr 16;
y:=port[$380];
fake^[x and 65535]:=y;
End;
Var
x : byte;
s : string;
l : LONGINT;
y : longint;
zs : string;
rsz : longint;
fi,fo : file;
Label OpenF;
Begin
New(buffer);
New(filx);
New(dirx);
New(fake);
ofsscr:=ofs(screen);
segscr:=seg(screen);
LoadFont;
MakeMans;
GetDir(0,curd);
romsize:=0;
color(7,5);
Window(1,1,26,12,'Главное меню');
Repeat
MorPhL(1,1,26,12);
Color(7,5);
WindowL('Main Menu');
Menu(4,3,2,4,$5b,'Выбор ПЗУ','Работа с ПЗУ','О
программе','Вы'+char(208)+'ход','',20);
case MenuP of
0:
Begin
Repeat
MorPhL(20,10,50,18);
color(7,1);
WindowL('Выбор типа ПЗУ');
Menu(23,12,2,3,$1b,'УФ ПЗУ','ПЗУ с плавкими
перемычками','Назад','','',26);
case MenuP of
0:
Begin
MorPhL(10,10,29,18);
color(7,5);
WindowL('УФ ПЗУ');
Menu(13,12,2,3,$5b,'2176','573РФ','Назад','','',16);
If MenuP<>2 Then
Begin
romsize:=8*1024;
romname:=curd+'\amibio';
End;
If MenuP<>2 Then MenuP:=2 Else MenuP:=0;
End;
1:
Begin
MorPhL(40,8,70,16);
Color(7,5);
WindowL('ПЗУ с плавкими перемычками');
Menu(43,10,2,3,$5b,'155РЕ3','556РТ6','Назад','','',16);
If MenuP<>2 Then
Begin
romsize:=16*1024;
romname:=curd+'\amibio1';
end;
If MenuP<>2 Then MenuP:=2 Else MenuP:=0;
end;
end;
Until MenuP=2;
MenuP:=5;
end;
1:
Begin
If romsize=0 Then
Begin
MorPhL(21,6,49,10);
Color(7,4);
WindowL('Варнинг!!!');
Loc (25,8);
Wrt ('Пипл!!! Выбери ПЗУ!!!!');
WaitKey;
End
Else
Repeat
MorPhL(40,5,60,15);
Color(7,1);
WindowL('Работа с ПЗУ');
Menu(44,7,2,4,$1b,'Чтение','Запись','Тестирование','Назад','Num5',12);
Case MenuP Of
0:
Begin
MorPhl(22,7,50,11);
color(7,1);
WindowL('Чтение ПЗУ');
Loc(24,9);
Wrt('-------------------------');
For l:=0 To romsize Do
Begin
Loc(24+(l*24 div romsize),9);
Wrt ('-'+chr(208));
Color (3,1);
Map;
ReadROM(l);
End;
Color(7,1);
MorPhL(0,0,77,24);
Color(7,6);
WindowL('Просмотр прошивки');
MemEd(romname);
Color(7,4);
MorPhL(24,7,60,14);
WindowL('Сохранить прочитанные данные?');
Menu(40,9,3,2,$4b,'YES','NO','','','',6);
Case MenuP of
0:
Begin
MOrPhL(10,10,50,15);
WindowL('Имя сохраняемого образа .ROM');
y:=1;
zs:=' ';
Loc(26,12);
Wrt('-');
Repeat
WaitKey;
Loc(25+y,12);
If (Key<>chr(13))And(Key<>chr(27)) Then
If (Key<>chr(08)) Then
Begin
If y<>9 Then
Begin
zs[y]:=Key;
Wrt(key+'-');
inc(y);
End;
End
Else
If y<>1 Then
Begin
dec(y);
Loc(25+y,12);
zs[y]:=' ';
Wrt('- ');
End;
Until (Key=Chr(13))or(Key=chr(27));
If key=chr(13) Then
Begin
MorPhL(20,8,50,12);
Color(7,4);
WindowL('!!!!!!!!!!!!');
Loc(30,10);
Wrt('Жди давай!'+chr(208));
Map;
Assign(fo,zs+'.ROM');
Rewrite(fo,1);
Assign(fi,romname);
Reset(fi,1);
rsz:=FileSize(fi);
Repeat
y:=rsz;
If y>65535 Then y:=65535;
BlockRead(fi,buffer^,y);
BlockWrite(fo,buffer^,y);
rsz:=rsz-y;
Until rsz=0;
Close(fi);
Close(fo);
End;
End;
End;
MenuP:=5;
End;
1:
Begin
Repeat
MenuP:=1;
MorPhL(20,2,50,22);
color(7,1);
WindowL('Выберите файл');
FFile(s);
If s<>'' Then
Begin
MorPhL(0,0,77,24);
Color(7,6);
WindowL('Редактировение прошивки');
MemEd(s);
Color(7,4);
MorPhL(24,7,60,14);
WindowL('Прошить ПЗУ?');
Menu(40,9,3,2,$4b,'YES','NO','xxx3','xxx4','xxx5',6);
If MenuP=0 Then
Begin
MorPhl(22,7,50,11);
Color(7,1);
WindowL('Прошиваем ПЗУ');
Loc(24,9);
Wrt('-------------------------');
For l:=0 To romsize Do
Begin
Loc(24+(l*24 div romsize),9);
Wrt ('-'+chr(208));
Color (3,1);
Map;
ReadROM(l);
End;
End;
End;
Until MenuP<>8;
end;
2:
Begin
MorPhl(22,7,50,11);
color(7,1);
WindowL('Тестируем программатор');
Loc(24,9);
Wrt('-------------------------');
For l:=0 To 1000 Do
Begin
Loc(24+(l*24 div 1000),9);
Wrt ('-'+chr(208));
Color (3,1);
Map;
End;
Loc(23,9);
Wrt(chr(209)+' Все в порядке, аднака ');
waitkey;
End;
end;
Until MenuP=3;
MenuP:=5;
end;
2:
Begin
MorPhL(9,2,70,23);
color(7,0);
WindowL('О программе');
Loc(10,10);
For x:=1 To 60 Do Wrt(chr(210));
Loc(12,4);
Wrt('Дипломный проект "Лабораторный макет программатора ПЗУ"');
Loc(11,6);
Wrt('Это программка была написана в среде Borland Pascal v7.0');
Loc(13,8);
Wrt('Программа расчита на роботу с 2 типами микросхем ПЗУ');
Loc(36,12);
Wrt('Авторы:');
Loc(11,14);
Wrt('Идея и текст программы:');
Loc(25,15);
Wrt('Дмитрий В. Румянцев');
Loc(11,17);
Wrt('Помощь в написание программы:');
Loc(25,18);
Wrt('Dead Emotion //HellraiseR Group');
Loc(11,20);
Wrt('Тестирование программы:');
Loc(25,21);
Wrt('Алексек А. Иванов');
WaitKey;
MenuP:=5;
end;
end
until MenuP=3;
MorPhL(13,7,13,7);
asm
mov ax,3
int 10h
end;
end.
Страницы: 1 , 2 , 3 , 4
Приглашения
09.12.2013 - 16.12.2013
09.12.2013 - 16.12.2013