Return to Menu


The DUO Adept is an 8-bit TTL machine. Its input is a keyboard. The output is a black and white monitor and a speaker. An infancy front panel is used to enter initial software into the machine.

Machine code and all long-term data are stored in 64 KB of main memory. Commands follow this format:

[opcode] [argument 1?] [argument 2?] [argument 3?]

The opcode is divided into the following sections:

[1 bit: does the command modify RAM?]
[3 bits: destination of operation OR which operation to execute]
[1 bit: does the command accept 2 or 3 arguments?]
[3 bits: which arguments should be substituted by data in RAM address?]

There are only 256 bytes of RAM. When one of the last three bits in the opcode is set to one, the respective argument represents an 8 bit RAM address instead of an 8 bit value. The processor will find the data at that address in RAM and use it instead as the value of the argument.

About 6 KB VRAM is constantly dumped onto the black and white monitor. The resolution is 208 pixels by 240 pixels. The composite video signal consists of 4 "blocks" of signals:

[lines] [6 pre-equalizing pulses] [6 long pulses] [6 post-equalizing pulses]

There are 263 lines total. Only 240 lines are visible; the first 23 lines are blank. Each line contains the following signals:

[horizontal sync pulse] [back porch] [video data] [front porch]

Video data contains 208 pixels in each line. Signal times are below:

3 registers store musical notes to be generated: 2 square wave channels and 1 noise channel.

A 2 byte shift register accepts input from a PS/2 keyboard.

A 2 byte timer constantly counts up at a rate of 64 beats per second. The timer is used for creating regular program pacing and music tempo.


The group of commands below do not modify RAM, so their first opcode bit is 1.

10000XXX: STM [number] [number] (set timer)

10001XXX: SMM [address] [address] [data] (set main memory)

10010XXX: SNT [channel] [note] (set note)

10011XXX: CGO [address] [address] [boolean value] (conditional goto; goto address if value is 0)

10101XXX: SVM [address] [address] [data] (set VRAM)

The following commands do modify RAM; hence their first opcode bit is 0. Note that the last argument is always a RAM destination address.

00000XXX: GVL [data] [destination] (get value)

00001XXX: GMM [address] [address] [destination] (get main memory)

00010XXX: GTM [which byte] [destination] (get timer)

00011XXX: GVM [address] [address] [destination] (get VRAM)

00100XXX: GIN [which byte] [destination] (get input)

00101XXX: ADD [number] [number] [destination] (add)

00111XXX: EQU [number] [number] [destination] (equal)

01001XXX: GRE [number] [number] [destination] (greater than)

01011XXX: BGT [byte] [which bit] [destination] (bit get)

01101XXX: BON [byte] [which bit] [destination] (bit on)

01111XXX: NOR [byte] [byte] [destination] (nor)

Return to Menu

Return to the Ostracod Pond