Как проверить готовность принтера перед печатью?

Перед передачей байта в принтер надо проверить состояние линии "BUSY" и если все в порядке, то передавать байт.

При чтении состояния принтера проверяются биты:

If (b and $B8) = $90 then { all's well }
else begin
  If (b and $20) = $20 then { no paper }
  If (b and $10) = 0   then { off line }
  If (b and $80) = 0   then { busy     }
  If (b and $08) = $08 then { i/o error}
end;
Пример программы проверки состояния принтера при печати
{-------------------------------------}
{    Проверка состояния принтера      }
{written by Valery Votintsev 2:5021/22}
{usage: prnstat <lptnumber>           }
{  where lptnumber = 1 for lpt1       }
{        lptnumber = 2 for lpt2       }
{-------------------------------------}
{    Запустите программу,             }
{    включите/выключите принтер,      }
{    понажимайте кнопку OnLine...     }
{    Когда надоест - ESC              }
{-------------------------------------}
uses
  crt;
 
Type
  String8 = String[8];
 
Const
  HexD:array[0..15] of Char='0123456789ABCDEF';
 
var 
  b,b1,
  prnum:byte;
  e:integer;
 
   function Byte2Hex(x:Byte):String8;
   begin
      Byte2Hex:=HexD[(x and $F0) shr 4]+HexD[x and $0F]
   end;
 
   function Byte2Bit(b:byte):string8;
   var 
     i,m:byte;
     s:string8;
   begin
     m:=1;
     s[0]:=#8;
     for i:=8 downto 1 do begin
        if (b and m) <> 0 then
          s[i]:='1'
        else
          s[i]:='0';
        m:=m shl 1;
     end;
     byte2bit:=s;
   end;
 
   Function PrinterStatus(LptNumber:byte):byte; assembler;
   {LptNumber: 1 - lpt1, 2 - lpt2, 3 - lpt3, 4 - lpt4}
   {Функция возвращает байт статуса принтера,
    в котором установленные биты означают:
         Printer Status
         7 6 5 4 3 2 1 0
    $80  x . . . . . . .      Printer not busy (0=busy)
    $40  . x . . . . . .      Acknowledgement from printer
    $20  . . x . . . . .      Out of paper
    $10  . . . x . . . .      Printer selected (0=No printer)
    $08  . . . . x . . .      I/O error
    $04  . . . . . 0 . .      Not used (reserved)
    $02  . . . . . . 0 .      Not used (reserved)
    $01  . . . . . . . x      Time-out error
   }
   Asm
      mov dl,LptNumber {DX <- номер принтера}
      dec dl
      xor dh,dh
      mov ah,2  {функция 2 - чтение статуса принтера}
      int 17h
      mov al,ah {AL <- байт состояния принтера}
   end;
 
begin
   val(paramstr(1),prnum,e);
   if prnum = 0 then Inc(prnum); {по умолчанию LPT=1}
   writeln('lpt',prnum,' status:');
 
   b:=PrinterStatus(prnum);
   writeln(Byte2Bit(b),'b (',byte2hex(b),'h)');
   repeat
     b1:=PrinterStatus(prnum);
     If b1 <> b then begin     {если статус изменился - печатаем его}
       writeln(Byte2Bit(b1),'b (',byte2hex(b1),'h)');
       b:=b1;
     end;
   until keypressed;
 
   while keypressed do readkey;
end.