Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3385

.pdf
Скачиваний:
2
Добавлен:
15.11.2022
Размер:
4.73 Mб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]