VDU 3

From BeebWiki
Jump to: navigation, search

Ends a print job.

VDU 3
Syntax VDU 3
Keyboard equivalent CTRL C
Character stream (hex) 03
Description Ends a print job, subsequent characters are not sent to the printer.

Description

VDU 3, or CTRL C, ends a print job. From this point onwards, characters 'printed' on the screen are no longer echoed to the currently selected printer device. Note that this is a distinction from disabling printer output, which is controlled with OSBYTE &03.

The VDU drivers must be enabled with OSBYTE &03 before VDU 3 is issued, otherwise the print job will not be terminated. Printer output must not be independently selected with OSBYTE 3 until another VDU 2 is sent.

VDU 3 and OSBYTE 3

You shouldn't use VDU 2/VDU 3 to select printer output, you should use OSBYTE 03. If you use VDU 2/3, unexpected things may happen. The currently selected printer driver has the complete right to do absolutely anything between a VDU 3 and a VDU 2. This includes, but is not limited to, such things as sending a form feed, printing a header and footer, putting the kettle on, burning the toast, kicking the cat, etc.

  • VDU 2 should be sent to OSWRCH with VDU drivers enabled to start a print job.
  • To output to both the screen and the printer, characters should be sent to OSWRCH with the VDU drivers enabled and the printer driver enabled, by clearing bit 1 and bit 2 of OSBYTE 3.
  • To output to just the screen, the printer driver should be disabled by setting bit 2 of OSBYTE 3.
  • To output to just the printer, the VDU driver should be disabled by setting bit 1 of OSBYTE 3, and the independent printer driver should be enabled by setting bit 3 of OSBYTE 3.
  • VDU 3 should be send to OSWRCH with VDU drivers enabled to end a print job.
  • You should never enable the independent printer driver, or issue a VDU 1,n sequence, without first starting a print job by sending VDU 2 to the VDU driver.

Example code

   OSCLI "FX3,0" :VDU 2:REM Start print job
   OSCLI "FX3,4" :PRINT "SCREEN ONLY"
   OSCLI "FX3,10":PRINT "PRINTER ONLY"
   OSCLI "FX3,0" :PRINT "SCREEN AND PRINTER"
   OSCLI "FX3,0" :VDU 3:REM End print job

Note that you should really read the current output destination and change only the bits you require, and then restore the destination afterwards. OSBYTE 3 also returns the old status which can be used later to restore it.

   A%=FNbyte(3,FNbyte(236,0,&FF) AND &FD,0) :REM Enable VDU driver
   A%=FNbyte(3,FNbyte(236,0,&FF) OR 4,0)    :REM Disable printer driver
   A%=FNbyte(3,FNbyte(236,0,&FF) OR 10,0)   :REM Disable VDU, enable printer

Jgharston 13:16, 13 December 2007 (UTC) -- beardo 21:55, 19 September 2007 (BST)