Аппаратное обеспечение персонального компьютера




Программа PRINTFL - часть 2


    rg.x.dx = 0;

    int86(0x17, &rg, &rg);

    // Запоминаем байт состояния принтера

    // после вывода символа

    status = rg.h.ah;

    // Проверяем наличие ошибок. Нас интересуют биты:

    //

    //    0 - задержка при печати

    //    3 - ошибка ввода/вывода

    //    4 - принтер в состоянии ONLINE (1) или OFFLINE (0)

    //    5 - конец бумаги

    if((status & 0x39) != 0x10)

    {

      // Вызываем функцию обработки ошибки error(). Эта

      // функция возвращает 0, если оператор желает

      // повторить печать символа, или 1 - если

      // оператор отменяет печать

      if(error(chr, status))

      {

        printf("\nПечать завершилась аварийно");

        return -1;

      }

    }

    else

      break;

  }

}

// ------------------------------------

// Функция выводит на экран состояние

// принтера и запрашивает у оператора

// требуемые действия - повторить

// печать символа или отменить печать

// ------------------------------------

int error(char chr, int status)

{

  // Выводим состояние принтера после ошибки

  printf("\nОшибка принтера %02.2X"

       "\n\nСостояние принтера:"

       "\n-------------------", status);

  if(status & 1)

    printf("\nТаймаут при печати");

  if(status & 8)

    printf("\nОшибка ввода/вывода");

  if(!(status & 0x10))

    printf("\nПринтер находится в состоянии OFFLINE");

  if(status & 0x20)

    printf("\nКонец бумаги");

  printf("\n\nДля отмены печати нажмите клавишу ESC,"

    "\nдля повтора - любую другую клавишу\n");

  if(getch() == 27)

    return 1;

  else

    return 0;

}

Программа считывает по байтам содержимое файла, открытого в двоичном режиме. Считанные байты передаются в качестве параметра функции printchar, которая и выводит их на принтер.

После вызова прерывания INT 17h функция printchar проверяет состояние принтера.При возникновении ошибки ввода/вывода вызывается обработчик - функция error. Эта функция выводит на экран состояние принтера (в развернутом виде с объяснением каждого бита в байте состояния), а также  запрашивает пользователя о дальнейших действиях.

Если пользователь может устранить причину ошибки (перевести принтер в состояние online, вставить бумагу, если она кончилась и так далее), он нажимает любую клавишу, кроме <Esc>. В этом случае функция error возвращает 0. Иначе возвращается значение 1.

Если пользователь решил повторить печать, и, соответственно, если функция error возвратила значение 0, функция printchar повторяет печать символа. При отмене печати выдается сообщение об ошибке и работа программы завершается.




Содержание  Назад  Вперед