Списки в оперативній пам'яті, операції над списками. Керування програмами. Керування таймером. Системні керуючі блоки. Управління пам’яттю: таблиця векторів переривань, страница 6

        for (i=0;++i<=p_psp->JFT_size;printf("%d ",(s++)));

        printf ("   \n\n\rоточення   DOS  : " );

        printf ("%.4X\n\r",p_psp->env_seg );

        s= (unsigned char far *)MK_FP(p_psp->env_seg, 0);

       if (_version > 2){

             for (i = 0; ( (*(s + i) != 0) || ( *(s + i + 1) != 0) ) ;i++)

             {

                    printf ( "%c",   *(s+i) );

                    if ( (*(s + i) == 0) )

                          cout << endl;

              }

         }

        printf ("   \n\n\n\n\rнатиснiть будь-яку клавiшу...   \7 " );

        printf ("\n");

        getch ();   clrscr ();

       }

Результати роботи програми:

Лабораторна робота N2

 Адреса   PID   =   8A53

  Команди :

    --------

   Завершення -   int   20h : cd20

   Старий виклик  DOS  : 9a f0 fe 1d f0

   Новий виклик   DOS  : cd21cb

  Aдреса :

  -------

    Кiнець пам'ятi : a000 :   0000

    Обробник завершення : 19AC:0201

    Обробник   Ctrl+break :    125A:3B7B

    Обробник   критич. помилки :    FD9D:2147

    Стек :    8F75:0E50

 батько :    11aa

натиснiть будь-яку клавiшу...

Лабораторна робота N2   Управлiння програмами

таблиця файлiв : 8A53:0018(20) - в цьому ж  PSP 8A53:0018

1 1 1 0 2 C FF FF FF FF FF FF FF FF FF FF FF FF FF FF

оточення   DOS  : 8A41

TMP=C:\WINDOWS\TEMP

TEMP=C:\WINDOWS\TEMP

PROMPT=$p$g

winbootdir=C:\WINDOWS

COMSPEC=C:\WINDOWS\COMMAND.COM

ALSINI=C:\WINDOWS\ALS3.INI

windir=C:\WINDOWS

BLASTER=A220 I5 D1 H1 REC0 T6 P330

PATH=F:\MY_WORK\BC\BIN

CMDLINE=bc lab2.cpp

натиснiть будь-яку клавiшу...

Висновок: ознайомилась з принципами управління програмами в MS_DOS та придбала практични навикі роботи з префіксом програмного сегменту та його полями.


Лабораторная робота № 3

“Керування таймером”

Мета роботы: вивчення функцiй системного таймера та закріплення  практичних навиків роботи з ним.

Постановка завдання: побудувати модель аналого-цифрового перетворювача, яка працюї у реальному часi. Процес, який дискретизується, моделюїться програмою  (програмним  блоком),  який  виконуї  циклiчне  обчислення

функцiї y=F(x),  де x - номер iтерацiї.  Перетворювач моделюїться програмою,  яка  виконуї  iз  заданою частотою (у реальному часi) переривання процесу, зчитування та запам'ятовування поточного значення функцiї. Запам'ятати не менш як 80 значень функцiї.Забезпечити наочне подання результатiв роботи "АЦП".

Iндивiдуальне завдання:

N

R

y = F(x)

Частота (гц)

1

0 – 10

y=((100-x)%100)*0.5+R+100

72.7

Текст програми:

#include <dos.h>

#include <math.h>

#include <stdlib.h>

#include <stdio.h>

#include <graphics.h>

#include <time.h>

#include <conio.h>

#define TIMEINT 8         

#define NN 100 

void interrupt (*oldtime)();

void interrupt  newtime();  

static int y[NN];

static int ny;    

static int yc;    

static int kf;    

union REGS rr;    

struct SREGS sr;

void *readvect(int in);    

void writevect(int in, void *h);

void main()

{

  unsigned oldtic=65535u; 

  unsigned newtic=16406u; 

  int dd,                 

      m,                  

      errorcode;          

  double x;               

  textbackground(0);

  clrscr();

  textattr(0x0a);

  cprintf("         Лабораторна робота N7");

  cprintf("\n       Керування таймером               ");

  textattr(0x8e);

  gotoxy(35,12);

  cprintf("Please wait");

  outportb(0x43,0x36);         

  outportb(0x40,newtic&0x00ff);

  outportb(0x40,newtic>>8);    

  ny=-1;             

  kf=15;

  oldtime= (void interrupt (*) ()) readvect(TIMEINT);

  writevect(TIMEINT,newtime);

  randomize();

  for (x=ny=0; ny<NN; x+=1)

       yc = ( (int(100-x)) % 100 ) * 0.5 + (unsigned (random (11))) +100;

  /* Вiдновлення вектора */

  writevect(TIMEINT,oldtime);

  /* Вiдновлення канала 0 */

  outportb(0x43,0x36);          /* Керуючий байт */

  outportb(0x40,oldtic&0x00ff); /* Молодший байт лiчилника */