Hi Chris,

> I'll give "printq" a try and see what happens

Hmmm I only found a 6/2000 version on the page,
which is described as being from Dr Dobbs and
being a user interface for PRINT.

It tries to highly portable (various DOS compilers)
and seems to be "1991 by Robert Mashlan, Public
Domain". Most files are from 5/2000. There is no
built-in help, but the following commands are okay:

printq /t --> cancels all queued printjobs
printq /c filenames --> cancels all selected printjobs
printq /p filenames --> adds all selected files to the queue

The main code is in prnspool.c, no wildcards supported.

Install check is: int 2f.100 -> if return al=-1 print found

Enqueue file is: int 2f.101 pack=ds:dx -> carry, ax on error
  pack has fields "level=0" and "pathname=(char far *)string"
  (pack is 1 + 4 bytes) (RBIL: if no carry, 01=added 9e=printing)

Unqueue file is: int 2f.102 stringpointer=ds:ds -> ...

Cancel all is: int 2f.103 -> carry, ax on error

List queue is: int 2f.104 returns ds:si, carry, ax on error
  pointer is to array of strings, each padded to 64 bytes
  (RBIL: also returns error count since last read in DX...)
  (first empty string marks end of list)

List queue ack is: int 2f.105 (needed to continue printing
  after getting the pointer to the live list queue array)

Get status is: int 2f.104 -> carry, ax on error, and always
  in dx the count of printing errors (since when?)

Error codes are:
0 okay 1 invalid func 2 file not found 3 path not found
4 too many files open 5 access denied
8 queue full 9 spooler busy
c name too long
f drive invalid

RBIL also tells that int 2f.106 returns carry, ax=8, ds:si=
  pointer to device driver if printing, no carry, ax=0 else
  (useful to know which device PRINT is using at the moment)
  (useful to avoid concurrent printing to the same device)

So... PRINTQ is just a user interface for PRINT :-)
It should also work for MS PRINT, but of course MS
PRINT has those options built-in anyway.

FreeDOS PRINT is ancient, from 1999... It does not
support ANY command line option beyond a name of a
file to be printed. The first time you run it, it
goes resident, and all other times, it expects a file
name as command line option. Simplistic utility. Yet
the source code is ca 1000 lines of Assembly...

FreeDOS PRINT hooks int 5 (prtscr), 8 (timer),
13 (disk), 24 (error), 28 (idle), 2f (print api).
It also checks for dos critical sections.
RUN_CNT is initially TIME_TOGO (18 ticks, 1 sec).
There is a byte marked with "SETONIT> <" where you
can set the printer number to be used, manually.

You can queue at most 10 files. What FreeDOS PRINT
does is, basically, try to send data to the printer
once per second, but only if neither DOS nor the
disk are active at that moment. Both the timer and
the idle int are used to check the moment. The int
5 hook is simply "suppress print screen while a
queued file is printing". The "level" thing is read
by FreeDOS PRINT as "if 0, then send form feed, and
if 1, do not send form feed". PRINT takes a lot of
effort to avoid collisions with other DOS activities.

For example it uses its own PSP, DTA and crit err
handler. It fully implements the interface used by
MS PRINT and PRINTQ apart from the "get device" one.
At most 256 chars are printed at a time (fixed buffer
size: BUFFER DB 258 DUP..., followed by 192 bytes of
local stack, quite small?).

You could *tune* the print speed by patching the bytes
at file offsets (add 0x100 if you are in debug) here:

- 0x348 reduce from 0x12 but maybe better not to < 2
- 0x395 reduce from 0x12 ...

To change the chunk size, you would have to recompile.

For comparison, MS PRINT has the /T /C /P and filename
options handled by the free PRINTQ, plus also:

/d:device (for example LPT1, default PRN, as with ours)
/b:chunksize (512-16384 default 512, twice of ours)
/u:ticks (to wait till ready) /m:ticks (max wait per 1
char, uses printer default in our print) /s:ticks (how
often to try to send, half of ours) /q:queuesize (1-32,
default 10, as ours).

So FreeDOS PRINT has default queue size 10, chunk size
256, printer PRN, poll delay 18, per char timeout as
set by MODE, unknown ready timeout. All unconfigurable.

MS PRINT has default queue size 10, chunk size 256,
printer PRN, poll delay 8, per char timeout unknown,
ready timeout unknown. So default is to print 4x faster.

You said you wanted PRINT /B:1024 /Q:4 /S:1 /D:PRN
which would be chunk size 1024, queue size 4, poll
delay 1, printer PRN. This is 32x faster than the
MS PRINT default and 128x faster than FreeDOS PRINT.

You can make FreeDOS PRINT 9x faster as described
above, though :-). More only with recompiling.

Note that every PRINT takes a filename as input, not
the actual data to be printed, so it should be easy
to write a FAKE PRINT tool which only grabs the file
and copies it to another file instead of actually
printing it :-). I hope you find one on WWW.


This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
Freedos-user mailing list

Reply via email to