Обработка аппаратных прерываний - Free Pascal

  1. Доброго вечера. Уважаемые форумчане, кто нибудь сталкивался с таким? Необходимо написать подпрограмму обработки аппаратного прерывания системного таймера для генерации звука через каждые 5 секунд. Функция Delay() не в счёт. Прошу помощи, так как сам ума не приложу, как это сделать.


textual

Код к задаче: «Обработка аппаратных прерываний - Free Pascal»

{$IFNDEF Debug}
{$D-,S-,L-}
{$ENDIF}
{$B-,R-,V-,X+,N+,E-,A-,T-,F-,Q-,P-}
{.$G+}
program SysTimerSample;
 
uses
  CRT;
 
const
  Time1sec = 18;       { 18.2065086 Гц                    }
  Time10sec = 182;     { 1 сутки = 1 573 040 (18 00 B0 h) }
  Time1min = 1092;
  Time1hour = 65543;
  Time24hour = 1573040;
  IntNum = $1C;
var
  TimerDec: word;
 
var
  OldExitProc: Pointer;
  OldIntProc:  Pointer;
 
var
  Sounds: boolean;    {состояние звучания динамика}
 
  VectInt       : Pointer absolute $0000:(IntNum*4  );
  procedure DisableInterrupts; inline($FA); {cli}
  procedure EnableInterrupts;  inline($FB); {sti}
 
  procedure Speaker;
  begin
    Sounds := not Sounds;
    begin
      if Sounds then
      begin
        Sound(440);
        TimerDec := Time1sec * 1;
      end
      else
      begin
        NoSound;
        TimerDec := Time1sec * 4;
      end;
    end;
  end;
{$F+}
  procedure SystemTimer; interrupt;
  assembler;
  asm
    Dec TimerDec
    test TimerDec, 0ffffH
    jnz @@Skip
    call Speaker
  @@Skip:
    pushf
    call  OldIntProc
  end;
 
  procedure DoneSysTimer; far;
  begin
    DisableInterrupts;
    VectInt := OldIntProc;
    EnableInterrupts;
    ExitProc := OldExitProc;
  end;
 
{$F-}
  procedure InitSysTimer;
  begin
    OldIntProc := VectInt;
    DisableInterrupts;
    VectInt := @SystemTimer;
    EnableInterrupts;
    OldExitProc := ExitProc;
    ExitProc := @DoneSysTimer;
  end;
 
begin
  TimerDec:=2;
  Sounds := false;
  InitSysTimer;
  while not KeyPressed do;
  ReadKey;
  NoSound;
end.

СДЕЛАЙТЕ РЕПОСТ

5   голосов, оценка 4.000 из 5



Похожие ответы
  1. День добрый, есть задачка по Паскалю, которую сдавать через час, а у меня еще долги Если не сложно, то прошу помочь, буду вам премного благодарен Дана матрица B[1:6,1:6] и вектор А[1:6]. Из среднеарифметических значений строк матрицы сформировать вектор C. Если минимальный элемент вектора C меньше минимального элемента вектора A, то из элементов главной диагонали матрицы сформировать вектор D. Иначе в матрице B элементы главной диагонали матрицы заменить элементами вектора A по правилу Bi,i= Ai.

  1. Всем привет. Прошу помочь со следующей задачей: Необходимо обработать строку следующим образом: 1) Удалить ВСЕ пробелы до начала первого символа (начало строки) 2) Удалить все лишние (более 1-го пробела) между символами 3) Удалить ВСЕ пробелы после последнего введенного символа (конец строки) Использовать при этом можно только символьные или текстовые переменные, операторы While, If, а также маркер конца строки - EOLN. Для примера основная часть программы для вывода всех символов БЕЗ последнего:

  1. Люди, помогите Пожалуйста!!! Каким образом в Pascale можно обрабатывать wav-файлы?? Если можно дайте пожалуйста ссылку на полезную информацию!

  1. Когда вместо числа вводишь строку паскаль выдаёт Ошибку 106: Invalid Numeric Format и прога вылетает. Как сделать так, чтобы прога не вылетала, а просто выдала текст с предложением ввести значение заново?

  1. Из прямоугольной матрицы, находящейся в файле, сформировать файл, содержащий массив из сумм отрицательных элементов столбцов матрицы. Во входном файле первая компонента – размер строки, вторая - размер столбца, далее – элементы построчно. В выходном файле первая компонента – размер массива, далее – элементы.

  1. Тема: Создание и обработка двоичных файлов. Цель: Написание и отладка программ на обработку двоичных файлов. В прямоугольной матрице, находящейся в файле, подсчитать «СА» отрицательных элементов строк (по каждой строке в отдельности). В файле первая компонента – размер строки, вторая – размер столбца, далее – элементы построчно.

  1. Здравствуйте, нужна помощь. Нужно эту программу сделать с процедурами и функциями.

  1. Как в pascal сделать так: Если (файл открылся), то делай что-то Иначе выведи(Я не смог открыть файл). И кстати, можно ли создавать файл прямо по ходу? Ну то есть я предлагаю в программе создать файл и создаю. И вот что: не будет ли работать такой (примерно) код(?):

  1. Разработать программу в которой из заданной текстовой строки будут сформированы три множества: S1 – множество цифр, S2 – множество больших букв, S3 – множество символов, что находятся на четных позициях. Найти объединение множеств( S1 и S3) и (S2 и S3).