Busch Microtronic 2090 — a programmer's guide

How to operate and program the 1981 Busch Microtronic 2090, written for the browser emulator, which runs the machine's original firmware. Everything described here was tried on that firmware. This is an independent guide in its own words. The original manuals, with many more programs and experiments, are available in English translation.

1. The machine

The Microtronic is a 4-bit teaching computer. Inside, a TMS1600 microcontroller runs a fixed program, the firmware, which makes the box behave like a simple imaginary computer with its own instruction set. That imaginary computer is what you program. Everything in it is a single hexadecimal digit, 0 to F: one nibble, four bits.

The Microtronic in the emulator
The Microtronic console in the emulator. Top right: the computer board with outputs, reset key, inputs and clock. Bottom: flag LEDs, display and keypad.

Programs cannot change the program memory, and data cannot be executed: instructions and numbers live in separate worlds.

Add-ons

The Microtronic was sold with a few companions, and many experiments in its manuals add small circuits to its terminals. The emulator draws or offers these:

Add-onWhat it isIn the emulator
2095 cassette interfaceA board that plugs in beside the computer and saves programs to, and loads them from, an audio cassette (PGM 2 and PGM 1).Drawn for completeness, but it does nothing: its start key is inert, and PGM 1 or PGM 2 waits for a tape forever (press reset). Use the Save and Open buttons instead.
Piezo buzzerA small sounder wired between an output and ground. It beeps while that output is on.The "Piezosummer" block, wired to output 1, 2, 3 or 4 (most of the manuals' games use output 1).
Tone circuitA two-transistor oscillator (astable multivibrator) built from parts of the Busch electronics kits, wired to all four outputs. The value on the outputs sets the pitch.The "Tongenerator / Multivibrator" block, switched on in the Sound panel. Values 4–F give twelve tones, 0–3 silence.
Red keys G and HTwo push buttons on the front panel, not connected to anything until you wire them to inputs (through a resistor from the supply).Wired to an input of your choice; the wires and the 4.7 kΩ resistor are drawn.
Patch cablesWires between terminals: most often the 1 Hz clock to input 4 (needed by the built-in clock), or an output to an input.Both, selectable in the Patch cable panel.
PicoRAM 2090A modern replacement for the program memory chip, with storage and extra functions such as sound.Only its sound instruction (50D) is emulated.

Loading a program from the emulator's library wires up what that program needs.

2. Operating it

When the machine is not running a program, the display shows an address at the left and the instruction stored there at the right: 00 F10 means address 00 holds F10.

Front panel
The front panel: red keys G and H, carry and zero LEDs, display, hex keys and function keys.
KeysWhat happens
HALT NEXT then two hex digitsGo to that address. HALT NEXT 0 0 goes to the start.
three hex digits, NEXTStores the instruction at the address shown and moves to the next address.
NEXT aloneMoves to the next address without changing anything: use it to read a program back.
C/CEDeletes the last digit you typed. NEXT only stores once three digits are there.
RUNRuns the program from the address shown.
HALTStops a running program. RUN then continues from where it stopped.
STEPCarries out one instruction and stops.
REG then a hex digitShows that working register, e.g. 1 9: register 1 holds 9. A further hex digit changes its value. HALT returns.
BKP then two hex digitsSets a breakpoint: a running program stops when it reaches that address. BKP 0 0 removes it.
PGM then a digitCalls a built-in function; see section 11.
the green reset keyRestarts the firmware. The program stays in memory; the registers and the clock are cleared.
Entering a program: HALT NEXT 0 0, then three digits and NEXT for each instruction. Starting it: HALT NEXT 0 0 RUN.

In the emulator you can skip the typing: pick a program and press Load & run, or click a line in the Inside panel and edit it. The whole keypad is also on the PC keyboard: H HALT, N NEXT, R RUN and so on, so H N 0 0 R starts a program.

3. The instructions

An instruction is three hex digits. The first says what to do; the other two say with what. In the table, s and d are register numbers (source and destination), n is a constant 0–F, and aa is a two-digit address.

CodeNameWhat it does
0sdMOV s,dCopy register s to register d.
1ndMOVI n,dPut the constant n into register d.
2sdAND s,dd := d AND s, bit by bit.
3ndANDI n,dd := d AND n.
4sdADD s,dd := d + s.
5ndADDI n,dd := d + n.
6sdSUB s,dd := d − s.
7ndSUBI n,dd := d − n.
8sdCMP s,dCompare register s with register d; only the flags change.
9ndCMPI n,dCompare the constant n with register d; only the flags change.
AsdOR s,dd := d OR s, bit by bit.
BaaCALL aaJump to the subroutine at aa, remembering where to come back to.
CaaGOTO aaJump to aa.
DaaBRC aaJump to aa if the carry flag is set.
EaaBRZ aaJump to aa if the zero flag is set.

Codes beginning with F are a second family without a source register:

CodeNameWhat it does
F00HALTStop the program.
F01NOPDo nothing.
F02DISOUTSwitch the display off.
F03HXDZConvert the hex number in registers D, E, F to decimal digits (section 7).
F04DZHXThe reverse: decimal digits in D, E, F to a hex number.
F05RNDPut random digits into registers D, E, F.
F06TIMECopy the clock into registers A to F.
F07RETReturn from a subroutine.
F08CLEARSet all working registers to 0.
F09STCSet the carry flag.
F0ARSCClear the carry flag.
F0BMULTDecimal multiplication (section 7).
F0CDIVDecimal division.
F0DEXRLSwap working registers 0–7 with memory registers 0–7.
F0EEXRMSwap working registers 8–F with memory registers 8–F.
F0FEXRASwap all sixteen.
FndDISP n,dFor n = 1 to 6: show n registers on the display, starting with register d at the right.
F7dMAS dCopy working register d to memory register d.
F8dINV dInvert all four bits of register d.
F9dSHR dShift register d one bit to the right; the bit pushed out goes to the carry flag.
FAdSHL dShift register d one bit to the left; the bit pushed out goes to the carry flag.
FBdADC dAdd the carry flag to register d.
FCdSUBC dSubtract the carry flag from register d.
FDdDIN dRead the four inputs into register d.
FEdDOT dPut register d on the four outputs.
FFdKIN dWait for a hex key and put it into register d.

4. First programs

The programs below are in the emulator's library under "Examples from the guide". They are written as address, code and name.

Show a number

00 150  MOVI 5,0   register 0 := 5
01 F10  DISP 1,0   show one register, register 0
02 C02  GOTO 02    stay here

The display shows 5 in its right-hand digit. Nothing appears until a program says what to show: DISP is a switch that stays set, so one DISP at the start is enough, and the display then follows the registers by itself. The last line is a loop on the spot. If a program ends with HALT instead, the display goes back to showing address and instruction, and you would look at the result with REG. Try it

A counter

00 F10  DISP 1,0
01 FE0  DOT 0      register 0 to the four output LEDs
02 B08  CALL 08    wait a moment (subroutine)
03 510  ADDI 1,0   register 0 := register 0 + 1
04 C01  GOTO 01

Register 0 counts 0, 1, 2 … 9, A, B … F and then starts again at 0, because a register only has four bits. The output LEDs show the same value in binary: output 1 counts 1, output 2 counts 2, output 3 counts 4, output 4 counts 8. The wait is explained in section 8. Try it

Reading the keyboard

00 F10  DISP 1,0
01 FF0  KIN 0      wait for a key, put it in register 0
02 FE0  DOT 0
03 C01  GOTO 01

KIN stops the program until a hex key is pressed. Try it

5. Carry, zero and decisions

The only way a program can decide anything is by the two flags. Their LEDs sit next to the display, so you can watch them.

After…Carry is set when…Zero is set when…
ADD, ADDI, ADCthe sum went past Fthe result is 0
SUB, SUBI, SUBCthe result went below 0 (a borrow)the result is 0
CMP s,dregister s is smaller than register dthey are equal
CMPI n,dregister d is greater than nregister d equals n
SHR, SHLthe bit shifted out was 1the result is 0
AND, ANDI, OR, INV(always cleared)the result is 0
MOV, MOVI(left as it was)the value is 0

A result that goes past F simply wraps round: 9 + 9 leaves 2 with carry set (18 = 16 + 2), and 3 − 5 leaves E with carry set.

A decimal counter

00 F20  DISP 2,0   show registers 1 and 0 as tens and units
01 B10  CALL 10    wait
02 510  ADDI 1,0   units + 1
03 9A0  CMPI A,0   have the units reached ten?
04 E06  BRZ 06     yes: carry over
05 C01  GOTO 01
06 100  MOVI 0,0   units := 0
07 511  ADDI 1,1   tens + 1
08 9A1  CMPI A,1   have the tens reached ten?
09 E0B  BRZ 0B
0A C01  GOTO 01
0B 101  MOVI 0,1   tens := 0
0C C01  GOTO 01

A register happily counts to F, so a decimal counter has to notice the ten itself and carry over by hand. Compare, then branch on the flag: that pair is the pattern behind every decision. Note that DISP 2,0 puts register 0 at the right and register 1 to its left. Try it

Dice

00 F1D  DISP 1,D
01 FF0  KIN 0      wait for any key
02 F05  RND        random digits into D, E, F
03 95D  CMPI 5,D   is D greater than 5?
04 D02  BRC 02     yes: try again
05 51D  ADDI 1,D   0–5 becomes 1–6
06 C01  GOTO 01

Random digits come as 0 to F. Throwing away everything above 5 and adding one gives a fair die. The randomness comes from how long you take to press the key. Try it

6. Inputs and outputs

The computer board
The terminal strip of the computer board: outputs 1–4 with their LEDs, the reset key, inputs 1–4, the 1 Hz clock.

DOT d puts the four bits of register d on outputs 1 to 4; an LED lights for each 1. DIN d reads inputs 1 to 4 into register d. An input with nothing connected reads 0; connecting it to a positive voltage makes it 1.

00 F10  DISP 1,0
01 FD0  DIN 0      inputs to register 0
02 FE0  DOT 0      register 0 to outputs
03 C01  GOTO 01

In the emulator there are three ways to feed an input: click an input jack to plug in a high level; hold the red keys G and H, which are wired to inputs of your choice; or run a patch cable from an output or from the 1 Hz clock. Try it

To test one input, mask the others away: FD0 then 310 (ANDI 1,0) leaves only input 1, and the zero flag tells you whether it is off.

The clock

The firmware keeps a clock, but it only counts if the 1 Hz output is connected to input 4. TIME copies it into registers A to F: seconds in A and B, minutes in C and D, hours in E and F.

00 F6A  DISP 6,A   show registers F…A
01 F06  TIME
02 C01  GOTO 01

The clock starts at 00 00 00 when the machine is switched on; set it with PGM 3. Try it

7. Decimal numbers and arithmetic

One register is one digit, so a longer number is spread over several registers, lowest digit in the lowest register. DISP shows them the right way round.

Hex to decimal

HXDZ takes the hex number in registers F, E, D (D is the lowest digit) and replaces it with its decimal digits. FF becomes 2, 5, 5. A number above 999 does not fit: the registers become 0 and the zero flag is set. DZHX goes the other way.

00 F08  CLEAR
01 F2D  DISP 2,D
02 FF0  KIN 0      first key
03 FFD  KIN D      second key
04 10E  MOVI 0,E
05 10F  MOVI 0,F
06 40D  ADD 0,D    D := D + register 0
07 FBE  ADC E      a carry goes into the next digit
08 F03  HXDZ       hex to decimal
09 F2D  DISP 2,D
0A C02  GOTO 02

Press 9 and 8 and the display shows 17; F and F give 30. The ADC is how numbers longer than one digit are added: add the low digits, then add the carry into the next one. Try it

MULT and DIV

Both work on decimal numbers of up to six digits, one in working registers 0–5 and the other in memory registers 0–5, and leave the result in the working registers.

00 F08  CLEAR
01 170  MOVI 7,0
02 F70  MAS 0      memory register 0 := 7
03 180  MOVI 8,0   working register 0 := 8
04 F0B  MULT
05 F20  DISP 2,0   shows 56
06 C06  GOTO 06

Both are done by the firmware through repeated adding and subtracting, so large numbers take noticeably long. Note that CLEAR clears only the working registers. Try it

8. Subroutines and delays

CALL aa jumps to a piece of program and RET comes back to the instruction after the CALL. Only one return address is remembered, so a subroutine cannot call another subroutine. The emulator's Inside panel shows the address RET would return to.

The Microtronic runs about 60 instructions a second, and there is no wait instruction. A pause is a counting loop:

08 18F  MOVI 8,F   start value
09 51F  ADDI 1,F   count up
0A D0C  BRC 0C     past F: done
0B C09  GOTO 09
0C F07  RET

Each round takes three instructions. Starting at 8 gives 8 rounds, about 0.4 seconds; starting at 0 gives 16 rounds, about 0.8 seconds. For longer pauses, nest two such loops. Because the machine is this slow, it pays to count instructions in anything that should feel responsive.

9. Sound

The Microtronic has no sound of its own. The emulator offers the three add-ons that were used with it (see also the add-ons table):

The Sound off button silences whatever is sounding.

10. Finding mistakes

Two classic mistakes: confusing MOV (copy a register) with MOVI (put in a constant), and forgetting that SUB and CMP take their operands in the order shown in the tables above.

11. Built-in functions

HALT PGM and a digit calls a function that is part of the firmware:

PGMFunction
0Self-test of display, keys and ports.
1, 2Load from and save to cassette. Not available in the emulator (they wait for the cassette interface; press reset).
3Set the clock: type hours and minutes, then HALT.
4Show the clock.
5Clear the program memory (every address becomes 000).
6Fill the program memory with NOP (F01).
7Load the built-in game Nim into memory; start it with HALT NEXT 0 0 RUN.

12. About the emulator

The emulator runs the Microtronic's original TMS1600 firmware, with the program memory chip, the display, the keypad and the ports modelled around it at the level of the individual pins. What it adds for convenience:

A .MIC file is plain text with one three-digit instruction per line; @ 20 continues at address 20, and text after # is a comment.

Quick reference

CodeNameCodeNameCodeNameCodeName
0sdMOV8sdCMPF00HALTF08CLEAR
1ndMOVI9ndCMPIF01NOPF09STC
2sdANDAsdORF02DISOUTF0ARSC
3ndANDIBaaCALLF03HXDZF0BMULT
4sdADDCaaGOTOF04DZHXF0CDIV
5ndADDIDaaBRCF05RNDF0DEXRL
6sdSUBEaaBRZF06TIMEF0EEXRM
7ndSUBIFndDISP (n = 1–6)F07RETF0FEXRA
F7dMASF8dINVF9dSHRFAdSHL
FBdADCFCdSUBCFDdDINFEdDOT
FFdKIN

Keys: HALT NEXT address · three digits NEXT stores · RUN · HALT · STEP · REG register · BKP address · PGM digit · C/CE deletes a digit.

Written with Claude Opus 5.5 (Claude Code) for the Microtronic emulator by Michael Wessel. The Microtronic and its firmware are © Busch GmbH. This guide is an independent description; for the original manuals see the English translation.