CP/M pages
Home -> CP/M -> Mallard BASIC notes

Mallard BASIC notes

Known versions

I've seen the following versions of Mallard BASIC 'in the wild':

1.11 (run-only)Supplied with CP/M for the BBC Micro
1.29Supplied with PCW 8000 series
1.39Supplied with PCW 9512
1.44Supplied with Spectrum +3 CP/M
1.47Supplied with PcW 9256/9512+
1.47 (16-bit)Sold for the PC
1.48Supplied with PcW 10
1.50 (16-bit)Sold for the PC

It does make me wonder how the numbering system worked; if it was just a straightforward increasing sequence, there should be versions 1.30 to 1.38 out there somewhere, for example. Or possibly they were for other platforms; the manual mentions versions for the 8080 processor, and for CP/M-86, for example.

Magic Numbers

Files saved by Mallard BASIC begin with a 3-byte header:

	defb	0FCh	;Magic
	defb	ver	;Version
	defb	prot	;Protection scheme, 0 meaning none

In practice, ver is always either 3 (in files saved by v1.11) or 4 (all other versions). And prot is always 0 for none, or 1 for the only protection scheme. So the magic number sequences are:

FC 03 00 - Unprotected, saved by v1.11
FC 03 01 - Protected, saved by v1.11
FC 04 00 - Unprotected, saved by v1.29+
FC 04 01 - Protected, saved by v1.29+

The main difference between the versions is that a version 3 file may not contain the tokens for VERSION, CVIK, CVUK, MKIK$, MKUK$, CONSOLIDATE, or RANKSPEC.

The Jetsam keyed-access file system creates pairs of files -- a data file containing the actual records, and an index file containing a B*-Tree index. Each file has a 128-byte header; the index file begins with the signature 'Jetsam0', the data file with 'MIOPEN'.

Patch Area

Near the start of the Mallard BASIC executable is a 6-byte area containing installation data:

	DEFB	runonly		;0 for full BASIC, 1 for run-only BASIC
	DEFB	compress_spaces	;Nonzero to remove unnecessary spaces from
				;lines as they are entered.
	DEFB	ver		;Version of install program required to 
				;install this program
	DEFW	screen_details	;Address of the screen descriptor
	DEFW	keyb_details	;Address of the keyboard descriptor
				;(not present in run-only versions)

In 8-bit versions, the table is at offset 001Fh from the start of the .COM file. In the MSDOS version, it is at 0023h, and in the CP/M-86 version it is at offset 01A3h (because the code segment is preceded by an 80h-byte header and a 100h-byte Zero Page).

The screen descriptor has this format:

	DEFB	screen width	;First argument to WIDTH command
	DEFB	screen auto-cr 	;Second argument to WIDTH command
	DEFB	editor		;0 for the 'command' (dumb terminal) editor
				;0FFh for normal cursor-keys editor
	DEFS	6		;ESCape sequence to move cursor left
	DEFS	6		;ESCape sequence to move cursor right
	DEFS	6		;ESCape sequence to move cursor up
	DEFS	6		;ESCape sequence to move cursor down
	DEFS	6		;Carriage return, line feed

(In run-only versions of BASIC, this descriptor is only two bytes long, containing the two width values.)

Escape sequences are held in Pascal format, as a length byte followed by the bytes to print. If the first byte of the sequence is 0FFh, the next two bytes are treated as the address of a machine-code subroutine to call.

The keyboard descriptor lists the codes returned by cursor keys. Again, these are held in Pascal format, with a length byte followed by 1-3 ASCII values:

	DEFS	4		;Cursor left
	DEFS	4		;Cursor right
	DEFS	4		;Cursor up
	DEFS	4		;Cursor down
	DEFS	4		;Find character
	DEFS	4		;Delete right
	DEFS	4		;Delete left
	DEFS	4		;Delete to character
	DEFS	4		;Toggle insert/overwrite
	DEFS	4		;Abandon editing line
	DEFS	4		;Finish editing line

(Run-only versions do not have a keyboard descriptor).

Protection Keys

The protection algorithm used by SAVE "filename",P uses three values as keys; if two copies of BASIC.COM have different keys, they cannot share protected programs.

The three keys are:

Return to archive listing