3385
.pdff_02: push ax push dx
;Настроим бит ACK# порта LPT2 на отмену прерываний
mov dx,27Ah |
;Адрес порта управления |
mov al,00000000b |
|
out dx,al |
;сбросим бит |
pop dx |
|
pop ax |
|
jmp near ptr outret
;03 :Функция передачи элемента массива ;при входе в BX-номер элемента i(0..N-1) ;a[i]-AH
f_03: push si
mov si,vxod mov ah,[si][bx] pop si
jmp near ptr outret
;04 :Функция настройки резидентной программы f_04:
jmp near ptr outret
;05 :Функция завершения программы чтения данных ;из порта LPT2
f_05:
;Замаскируем принтерное прерывание
mov al,maska |
;загрузим |
|
or al,00100000b |
;модифицируем |
|
out 0021h,al |
|
;запишем |
;Восстановим исходный обработчик порта LPT2 |
||
push ds |
;Сохраним DS |
|
mov ax,250Dh |
;Функция 25h,вектор 0Dh |
|
lds dx,old_0D |
;Сохраненный адрес |
|
int 21h |
|
|
pop ds |
|
|
;Восстановим исходный обработчик пользователя
push ds |
|
mov al,60h |
;Функция 25h,вектор 60h |
lds dx,old_60 ;Сохраненный адрес |
|
int 21h |
|
pop ds |
;Восстановим DS |
;Восстановим регистр управления портом mov dx,27Ah
mov al,b_ypr
out dx,al
;Инициализация порта LPT2
; mov ah,01h ; mov dx,01h ;int 17h
;Восстановим маску прерываний
mov al,maska |
;загрузим |
out 0021h,al |
;восстановим |
;Завершим программу |
|
mov ax,4C00h |
|
int 21h
jmp near ptr outret
;06 :Функция разрешения аппаратного прерывания ;от порта LPT2
f_06: push ax push dx
;Настроим бит ACK# порта LPT2 на разрешение прерываний
mov dx,27Ah |
;Адрес порта управления |
mov al,00010000b |
|
out dx,al |
;установим бит |
pop dx |
|
pop ax
jmp near ptr outret
;07 :Функция управления режимом заполнения массива ;Вход: AL-режим заполнения массива
;AL=00-циклическая регенерация
;AL=01-однократная регенерация с последующим
;запрещением аппаратного прерывания
;от сигнала ACK#
f_07:
mov regin,al
jmp near ptr outret
outret: pop ds iret
new_60 endp
old_0D dd 0 ;Ячейка для исходного вектора old_60 dd 0
mas db 1024 dup (0);Массив накопленных данных kol dw ($-mas) ;Размер массива
smeh dw 0 ;Число заполненных элементов
maska db 0 ;Старая маска прерываний b_ypr db 0 ;Регистр управления порта vxod dw offset mas;Адрес первого элемента
regin db 0 ;Задает режим регенерации массива ressize=($-offset main);Размер программы без перфикса code ends
end main
Содержание .bat-файла для трансляции данного файла в .com программу:
C:\TASM\BIN\tasm /z/zi/n/m2 y_dr1,y_dr1,y_dr1 C:\TASM\BIN\tlink /x/v/3/t y_dr1,y_dr1
rem C:\TASM\BIN\td y_dr1
Листинг программыядра графической оболочки
program yra_and_reset; uses graph,crt;
const Hx=1;Hy=25;{шаг сетки} xBegin=10;yBegin=10;xEnd=33*16+xBegin;yEnd=25*16+yBegin; yMiddle=(yEnd-yBegin) div 2+yBegin;
xMiddle=(xEnd-xBegin) div 2+xBegin; bgcolor=blue;
fOscSpec: boolean=true; var ch: char;
s,xBpf,yBpf:array[0..1024] of real; sBpfMax: real;
procedure drv_on; begin
asm push ax
mov ah,06h int 60h
pop ax end;
end;
procedure drv_off; begin
asm push ax
mov ah,02h int 60h
pop ax
end;
end;
procedure drv_mode; begin
asm push ax
mov ax,0701h int 60h
pop ax end;
end;
procedure BPF(m: byte); var
n,n1,n2,i,j,k,g: longint; e,a,c,s,xt,yt: real;
begin n:=round(exp(m*ln(2))); n2:=n;
for i:=0 to n-1 do yBpf[i]:=0; for k:=1 to m do
begin n1:=n2;
n2:=round(n2/2);
e:=2*pi/n1;
a:=0;
for j:=1 to n2 do begin
c:=cos(a); s:=sin(a); a:=j*e;
i:=j;
while (i<=n) do begin
g:=i+n2; xt:=xBpf[i-1]-xBpf[g-1]; xBpf[i-1]:=xBpf[i-1]+xBpf[g-1]; yt:=yBpf[i-1]-yBpf[g-1]; yBpf[i-1]:=yBpf[i-1]+yBpf[g-1]; xBpf[g-1]:=c*xt+s*yt; yBpf[g-1]:=c*yt-s*xt;
i:=i+n1;
end;
end;
end;
j:=1; n1:=n-1;
for i:=1 to n1 do begin
if i<j then begin
xt:=xBpf[j-1]; xBpf[j-1]:=xBpf[i-1]; xBpf[i-1]:=xt; yt:=yBpf[j-1]; yBpf[j-1]:=yBpf[i-1]; yBpf[i-1]:=yt;
end;
k:=round(n/2); while (k<j) do begin
j:=j-k; k:=round(k/2);
end;
j:=j+k;
end;
end;
function grf(x:word): byte; begin
asm push ax push bx
mov ah,03h mov bx,x int 60h
mov @result,ah pop bx
pop ax end;
end;
var Mx,My:integer;
procedure setka(MxProc: integer); var yy1,xx1: real;
begin setcolor(3);setlinestyle(0,0,1); xx1:=xBegin+Hx*MxProc;
yy1:=yBegin+Hy*My; repeat
line(round(xx1),yBegin,round(xx1),yEnd);
xx1:=xx1+Hx*MxProc; until xx1>=xEnd;
repeat line(xBegin,round(yy1),xEnd,round(yy1)); yy1:=yy1+Hy*My;
until yy1>=yEnd; end;
procedure GridCenter; begin
setcolor(green);setlinestyle(0,0,3);
line(xBegin,yMiddle,xEnd,yMiddle);
line(xMiddle+5,yBegin,xMiddle+5,yEnd);
end;
procedure funkc(color,xMul,yMul,xPos,yPos:integer);{c- цвет,s-: (+1:-1) впра-
во/влево от нуля} var m: word; begin
setcolor(color);setlinestyle(0,0,3);
SetViewPort(xBegin,yBegin,xEnd,yEnd,True); MoveTo(0,round(grf(1)*My-140)*yMul+200+yPos); for m:=1 to 1024 do
begin LineTo(round((m-1)*xMul/(xEnd-xBegin)*1024),round(grf(m)*My-
140)*yMul+200+yPos);
end;
SetViewPort(0,0,GetMaxX,GetMaxY,True);
end;
procedure ClearWin; begin
setlinestyle(0,0,1); if fOscSpec then
begin Sound(220); Delay(200); NoSound;
SetColor(LightRed);
SetFillStyle(SolidFill,green);
bar(565,420,605,460);
Rectangle(565-1,420-1,605+1,460+1); OutTextXY(575,435,'Osc');
end else
begin Sound(420); Delay(200); NoSound;
SetColor(LightRed);
SetFillStyle(SolidFill,5);
bar(565,420,605,460); Rectangle(565-1,420-1,605+1,460+1); OutTextXY(570,435,'Spec');
end;
SetFillStyle(SolidFill,bgColor);
setlinestyle(0,0,1);
bar(xBegin,yBegin,xEnd,yEnd);
SetColor(15); Rectangle(xBegin-1,yBegin-1,xEnd+1,yEnd+1);
end;
procedure SpecBPF; var i: integer;
begin
for i:=0 to 1023 do xBpf[i]:=grf(i)-140; BPF(10);
for i:=0 to 1023 do begin
s[i]:=2*sqrt(sqr(xBpf[i])+sqr(yBpf[i]))/1024;
end;
end;
procedure Spec(bgColor,ySMul: integer); var i: word;
begin SetViewPort(xBegin,yBegin,xEnd,yEnd,True); setlinestyle(0,0,1);
setcolor(bgColor);
{ sBpfMax:=2*sqrt(sqr(xBpf[0])+sqr(yBpf[0]))/1024; for i:=1 to 511 do
begin s:=2*sqrt(sqr(xBpf[i])+sqr(yBpf[i]))/1024; if sBpfMax<s then sBpfMax:=s;
end;}
for i:=0 to 511 do begin
line(i,yEnd-round(s[i]*ySMul),i,yEnd); end;
SetViewPort(0,0,GetMaxX,GetMaxY,True);
end;
var a,b: integer; xMul,yMul,xPos,yPos,ySMul: integer;
procedure ShowInfo1; var st: string;
begin SetFillStyle(SolidFill,bgColor); setlinestyle(0,0,1);
bar(xEnd+10,yBegin+35,GetMaxX-10,155); SetColor(15);
Rectangle(xEnd+10-1,yBegin+20-1,GetMaxX-10+1,yEnd-20+1); OutTextXY(555,50,'V/Del=');
str(1/yMul:5:3,st);
OutTextXY(570,60,st);
OutTextXY(555,80,'T/Del=');
str(1/(xMul*2):5:3,st);
OutTextXY(570,90,st);
OutTextXY(555,110,'YPos='); str(-yPos/25:5:1,st); OutTextXY(560,120,st+'(V)');
end;
procedure ShowInfo2; var st: string;
begin SetFillStyle(SolidFill,bgColor); setlinestyle(0,0,1);
bar(xEnd+10,170,GetMaxX-10,255); SetColor(15); OutTextXY(555,180,'Gz/Del='); OutTextXY(570,190,'1(kGz)'); str(1/ySMul:5:3,st); OutTextXY(555,210,'V/Del='); OutTextXY(570,220,st);
end;
procedure ShowInfo3; var st: string;
VDC,VAC: real; i: integer;
begin SetFillStyle(SolidFill,bgColor); setlinestyle(0,0,1);
bar(xEnd+10,270,GetMaxX-10,yEnd-20); SetColor(15);
OutTextXY(555,280,'V (DC)='); VDC:=0;VAC:=0;
for i:=1 to 1024 do begin
VDC:=VDC+(grf(i)-140)/25; VAC:=VAC+sqr((grf(i)-140)/25);
end; str(-VDC/1024:5:2,st);
OutTextXY(555,290,st+' (V)');
OutTextXY(555,310,'V (AC)='); str(sqrt(abs(VAC/1024-sqr(VDC/1024))):5:2,st);
if (VAC/1024-sqr(VDC/1024))<0 then OutTextXY(555,320,'-'); OutTextXY(555,320,st+' (V)');
end;
begin drv_mode;
xMul:=1;yMul:=1;xPos:=0;yPos:=0;ySMul:=1;
a:=detect;b:=detect;
initgraph(a,b,'');
SetFillStyle(SolidFill,LightRed); bar(xEnd+10,yBegin+20,GetMaxX-10,yBegin+35); setcolor(yellow);
OutTextXY(560,35,'Oscill.'); bar(xEnd+10,155,GetMaxX-10,170); OutTextXY(560,160,'Spect.'); setbkcolor(0); bar(xEnd+10,255,GetMaxX-10,270); OutTextXY(560,260,'Volt.'); SetFillStyle(SolidFill,bgcolor); ClearWin;
setcolor(lightgreen); OutTextXY(10,420,'Functional keys:'); setcolor(yellow);
OutTextXY(50,430,'Tab - switch between osilloscope and spectral analizate'); OutTextXY(50,440,'Space - get new signal');
OutTextXY(50,450,'Ins - set default settings');
OutTextXY(50,460,'Esc - exit from program'); Mx:=33;My:=1;{масштаб}
ShowInfo1;
ShowInfo2; repeat
ShowInfo3;
if fOscSpec then begin
funkc(bgcolor,xMul,yMul,xPos,yPos); drv_on;
setka(27);
GridCenter;
funkc(LightRed,xMul,yMul,xPos,yPos); end
else begin
bar(xBegin,yBegin,xEnd,yEnd); drv_on;
SpecBPF;
setka(33);
Spec(yellow,ySMul);
end; repeat
ch:=readkey; case ch of
#0: if fOscSpec then begin
ch:=readkey; case ch of
#77: if xMul=33 then xMul:=33 else
begin funkc(bgcolor,xMul,yMul,xPos,yPos); xMul:=xMul+1;
setka(27);
GridCenter;
funkc(LightRed,xMul,yMul,xPos,yPos);
ShowInfo1;
end;
#75: if xMul=1 then xMul:=1 else
begin funkc(bgcolor,xMul,yMul,xPos,yPos); xMul:=xMul-1;