Hosted by

Description | Download | Changes


(screenshot of ZCN's `zap')


ZCN is a free operating system for the Amstrad NC100 (Notepad) and NC200 (Notebook). It's largely compatible with CP/M 2.2. It runs most CP/M 2.2 programs, including VDE, QTERM, Mallard Basic, and Hitech C. It can also run the NC100's ROM BBC Basic as if it were a native ZCN program. You need an NC100 (or NC200) and at least one PCMCIA memory card to use it, and a separate computer (perhaps a PC) and a serial lead to get the system code to it for the first time.

ZCN isn't just some random hack; it comes with serious amounts of documentation, including a guide to programming CP/M and ZCN, and has optional online help.

You should probably consider using ZCN if you like the idea of a portable CP/M box, or want to use the NC as something a bit closer to a `real computer'. It comes together with many custom-written utilities, as well as various free CP/M programs.

Jameel Siddiq wrote quite a good (if brief) introduction to ZCN on Tim's Amstrad NC Users' Site.

If you want to try ZCN but don't have an NC :-), you could try running it in my (Linux/Unix-based) NC100/NC200 emulator, nc100em. DOS/Windows users may be able to use more recent versions of MESS, which have NC100/NC200 emulation. (Getting programs across to the emulated NC was rather tricky when I last tried it, but things have apparently improved since.)


The current version is 1.3, available here as


This excerpt from NEWS lists the changes from ZCN 1.2 onwards.

Changes in ZCN 1.3

Some important bug fixes:

(The first three were also fixed in, so they probably won't be `new' fixes to most people)

man was totally broken; it would mysteriously die without giving any reason, which would lead to subtle crashes later on. This was due to the most stupid thinko I think I've ever perpetrated. :-(

A less stupid, but still significant, thinko meant that only 1992 and 1996 were treated as leap years. (2000, 2004, etc. weren't.) ZCN now has no Y2K problems (it's ok until 2099). But be sure to set the time and date before 2004 so it has a chance to fix the old problem. :-)

Previously, if you asked rrxfer for a list of the ROM files and there were none, it crashed (ouch!).

In the context-restore routine, the stack pointer was pointing at the TPA at a Bad Time when restoring things, meaning that memory in the B1F8h-B1FDh range (6 bytes) got blasted. Not the sort of bug you'd usually notice easily, but it happened to break wade.

The context-restore rewrote 0038h-003Ah despite not needing to, which could probably have broken wade in some (relatively unusual) circumstances.

spellwd used to crash when run without args, when spellwd wasn't the last command you'd run.

zcnpaint's eraser tool previously drew horizontal/vertical lines when used right at the top/left of the screen.

And, incredibly, there's some non-bugfix stuff too... :-)

The `kernel' now assembles into two versions - the original zcn.bin for NC100s, and a new zcn200.bin for NC200s. The NC200 version still has some rough edges, but supports most of the hardware except for the disk drive. Thanks to Ian Miller for helping a *lot* with testing the NC200 support (as I don't actually have an NC200).

Added `serial' command, which allows you to disable/re-enable the serial line driver. It's enabled by default (just as in previous versions of ZCN), but disabling it should prolong battery life. Thanks to Emmanuel Roussin for bringing this up.

`bigv' views a single file in much the same way as with `man's viewer. It uses a large, proportionally-spaced font - the intent is that bigv be comfortable to read from, especially for large texts such as online books (`etexts'). Thanks to Steven Flintham for the inspiration behind this.

Some minor speed optimisations in a BDOS hotspot (the crawling horror that is `matchfcb' :-)).

`keyb' changes the keyboard map. Currently this only supports the default UK map, and Dvorak for the UK layout. Thanks to Ian Miller for suggesting Dvorak support.

`lfconv' converts Unix-format text files to CP/M (CR/LF) format.

VDE has replaced ZDE as the text editor included with ZCN, mainly because it's the more widely-used version (ZDE is a VDE derivative), and it comes with full documentation. But don't worry, your old copy of ZDE will obviously still work if you'd prefer to stick with that.

Removed nswp from distribution.

Changes in ZCN 1.2

Decent online help. This comes in the shape of `man', a Unix-man-like program, and *many* man pages for it, documenting every ZCN command and most third-party ones bundled with ZCN, taking roughly 55k for the lot. The `help' program has been removed, as man makes it obsolete.

`zap', a graphical program-launcher.

`spell', an interactive spellchecker (which uses the ROM), a bit like a cross between `ispell' and the ROM wp's spellchecker.

`rrinit.bin' now compensates for the ROM OS's stupid ^Z-stripping code, which broke it in ZCN v1.1.

`cal', a calendar program like Unix `cal' - it's a Z80 port of a public domain C program by Martin Minow.

`expr', a sort-of-clone of Unix `expr' - a Z80 port of a PD C program by Erik Baalbergen.

Keyboard-reading code should now fully work around the bugs in the NC100's keyboard hardware (see top of src/keyread.z for full details of what the bugs are).

ZCN now uses IM2 by default, and can no longer be made to use IM1. So the `useim2' command has been removed.

`setbaud' replaced with `stty'; e.g. `setbaud 7' translates to the slightly more meaningful `stty 19200'.

New `cd -' (or `user -') command, go to last user area selected.

`note', a simple type-text-into-file internal command.

Zcnclock is now much nicer, and there's also `dclock', a new cut-down version which fits in 1k.

`dir' now looks more like CP/M's dir.

Printer bug fixed - previously printing turned off the serial line driver which, er, wasn't ideal. You'd never guess I hardly ever print from ZCN, would you? :-)

Corrected serious bug in documentation. (The NC100's Z80 *DOES NOT* run at 6MHz (it's more like 4.6MHz), even though it's a 6MHz-capable chip! Also, ZCN isn't actually much faster than the ROM OS. It's still better though. ;-))

Cursor move control code (^P) now uses 20h+y rather than the old (and rather bizarre) 46h+y. 46h+y is still supported for now, but may not be in future.

`ruler', displays a ruler onscreen.

`slide', a slide-rule emulator. Terribly useful. :-)

`calc' should now work on all ROM versions.

New `cboot' internal command cold-boots ZCN from the memory card.

New `capsctrl' internal command, swaps functions of Caps Lock and Control keys if you do `capsctrl 1'.

New `crlf' internal command (not *another* internal command!) lets you disable/re-enable the usual CP/M-ish line-break (CR/LF) after each command finishes. Mainly intended for use in SUB files.

New `vdu' internal command (AIEEEE! :-)) prints one or two characters, given their ASCII values. For example `vdu 1' clears the screen, and `vdu 13 10' prints CR/LF.

You can now change the default LISTO setting for `bbcbas'. You have to edit the executable, which isn't ideal, but zcn.txt demonstrates how to do it with wade.

Some additions to zcnlib's 32-bit integer routines.

You can now change the address of the font used by ZCN. This lets ZCN-aware programs effectively use UDGs and the like.

New `off' internal command, does what you'd expect. :-)

`bmp', a way of printing such UDGs (and bitmaps generally) from SUB files. There's also utils/pbmtosub.c, which converts PBMs into `bmp'-using SUB files.

ZCN checks for internal commands more quickly than it did before (though to be fair, this was near-instant anyway :-)).

Removed the copyright message displayed when you boot ZCN. It may be a traditional CP/M thing to have, but frankly even *I* found it slightly irksome. Now when ZCN boots, it just displays what the `ver' command does.

Esc as a prefix to a CR/LF now causes ZCN to ignore it. It's not clear how useful this is, though... :-)

Fixed two .sub-related bugs. First, if a $$$.sub didn't contain a ^Z it wasn't deleted after ZCN finished running it. Second, it assumed (when deleting it) that $$$.sub remained in the current user, which isn't always the case.

Fixed so things like `a:dir' (internal commands with drive specs) don't run the internal command - now ZCN (in this case) tries to run `' or `dir.sub' on drive A:.

Last updated 2001 Jun 7