VDUCHR

From BeebWiki
Jump to: navigation, search

Sends a character to the VDU driver. VDUCHR is the name given to this routine in Geoff Cox's annotated disassembly of MOS 1.20. It is also known as RAWVDU, expecially when using assemblers that can't start a label with a BASIC token. It is mentioned in the Advanced User Guide (p.104) but not in the New Advanced User Guide.

Contents

Specification

On entry:
A = ASCII value of character to print
On exit:
A undefined
X undefined
Y undefined
C = 1 if OSWRCH should send the character to the printer

Sends the character whose ASCII value is in A to the VDU (screen) driver. This may display it on the screen, start a VDU sequence, or add it to the current VDU sequence. When the sequence is complete, the routine will execute the VDU command it forms. The accumulator may contain any value from 0 to 255 depending on the purpose.

VDUCHR is called from the official routine OSWRCH, to update the display. It can be used as a shortcut to deliver VDU sequences without having to disable and re-enable other output devices. As such it makes the screen available as a 'standard error' channel when the OSWRCH stream has been redirected to a device.

This routine is the largest in the MOS ROM, taking some 40 per cent of the space. Please see the individual VDU command entries for their descriptions. If it does not recognise a VDU command it will redirect via VDUV (&0226).

While the display is turned off with VDU 21, VDUCHR continues to parse incoming VDU sequences. The only commands still acted upon are VDU 1 and VDU 6; all others are discarded. As usual if a stream of binary characters is printed, it may create a VDU sequence (a queue) that must be cleared with nine NULs before issuing the next command.

On exit, VDUCHR returns a hint intended for OSWRCH in the carry flag. After OSWRCH calls VDUCHR it will send the character on to the printer if the carry flag is set (or if the printer is forced on.) Under MOS 1.20 the carry flag is set if one or more of the following conditions are true, and cleared otherwise:

  • If VDU 2 is active, no queue is pending, and A is in the range 8 to 13, 32 to 126, or 128 to 255.
  • If VDU 21 is active, no queue is pending, and A is in the range 8 to 13.
  • If VDU 2 and VDU 21 are active, and the character in A is the parameter of a VDU 1 command.

Problems

From the above list, two problems are apparent in MOS 1.20, both arising while the display is disabled. Firstly, control codes 8 to 13 are flagged for printing even if the printer has been turned off with VDU 3. This is reported in the New Advanced User Guide, p.108. Secondly, the VDU 1 command prints the character twice, once by VDUCHR and again by OSWRCH. One workaround is to call *FX3 with a parameter of 64 or more, and then to do all printing through VDU 1 commands.

Calling from BBC BASIC

  • BASIC does not call VDUCHR

Entry points

  • BBC BASIC Entry Address: none
  • 6502 Entry Address: &FFBC
  • Z80 Entry Address: none
  • 6809 Entry Address: none
  • 80x86 Entry Address: none
  • 32000 Entry Address: none
  • PDP-11 Entry Address: none
  • ARM Entry Address: none

Implementations

This call is undocumented and applications should use OSWRCH instead. However the code at the entry point exists in MOS 1.20 and MOS 2.00. It is not implemented on non-6502 platforms and BBC BASIC does not emulate its entry point.

-- beardo 23:28, 23 September 2007 (BST)