Vector-06c
The Vector-06c (Вектор-06Ц) is a 1987 Soviet home computer built around the KR580VM80A — a clone of the Intel 8080 — and famous for its 256-colour palette, wide for its day. This is svofski/vector06js, an original hand-written JavaScript emulator by Viacheslav Slavinsky running on Alexander Demin's i8080.js CPU core; it boots straight to Vektor BASIC in the browser, and because the machine is plain JavaScript objects the shared debugger single-steps authentic 8080 code, sets breakpoints and write watchpoints, and inspects the full 64 KB address space live.
Runs on: Web browser
Vector-06c Online Emulator
Play Vector-06c using JavaScript directly in your browser.
Controls
Configurations
| Configuration | Emulator | Machine | OS | Legal | |
|---|---|---|---|---|---|
| Vektor BASIC 2.993 | Vector-06c | Vector-06c | grey | Open ⛶ | |
| boots v3.0 loader | Vector-06c | Vector-06c | grey | Open ⛶ | |
| Test pattern demo | Vector-06c | Vector-06c | open | Open ⛶ | |
| Hardware scroll test | Vector-06c | Vector-06c | open | Open ⛶ | |
| Border / palette raster test | Vector-06c | Vector-06c | open | Open ⛶ | |
| Video sync test | Vector-06c | Vector-06c | open | Open ⛶ |
Machine
Chips
Notes
Embedding
The core is svofski/vector06js, an original JavaScript Vector-06c emulator, running on Alexander Demin's i8080.js CPU. It is a set of plain constructors — Memory, IO, I8080, Vector06c — with no wasm heap, so everything the debugger needs is a field or method on a live object.
Boot. Wire the machine exactly like the vendored main.js, but instead of the core's self-scheduling oneFrame() loop, own a requestAnimationFrame loop that calls oneInterrupt() — one TV field (one interrupt period) per call — then displayFrame():
var memory = new Memory();
var io = new IO(keyboard, timer, memory, ay, floppy, tape);
var cpu = new I8080(memory, io);
var v06c = new Vector06c(cpu, memory, io, ay, tape);
memory.attach_boot(bootRom); // 2K on-board boot loader at $0000
blkSbr(true, false); // reset: pc=0, init the i8253, boot
(function loop(){
v06c.oneInterrupt(true); // run one field, or until a breakpoint
v06c.displayFrame();
requestAnimationFrame(loop);
})();
A .rom image loads at 00 and is entered via a NOP-slide from $0000 (sp = $C300), the way the machine's own loader launches programs.
| Member | Kind | What it does |
|---|---|---|
cpu.instruction() | method | Execute exactly one 8080 instruction. The single-step primitive. |
cpu.pc / cpu.sp / cpu.iff | field | Live program counter, stack pointer and interrupt flag (plain writable numbers). |
cpu.a()…cpu.l() / cpu.set_reg(r,v) | method | The 8080 register file (A B C D E H L); flags are cpu.sf .zf .hf .pf .cf. |
memory.read(a) / .write(a,v) | method | The banked address space the CPU sees — side-effect-free, safe to poll live. |
v06c.oneInterrupt() | method | Run one TV field; internally steps the CPU and shifts pixels through the palette. |
Debugger integration
The plug-in (vector06c-debug.js) describes the machine to the shared debugger; the controllable loop lives in vector06c-machine.js:
- Registers are read live from the 8080 core each refresh (A, B, C, D, E, H, L, SP, PC, IFF and the S Z H P C flags) and written straight back through
set_regand the flag fields. - Disassembly uses the shared
z80decoder: the Z80 is a superset of the 8080, so it renders KR580VM80A code correctly, mnemonics and all. - Memory is the full 64 KB CPU view plus the 2 KB boot-ROM overlay, read side-effect-free.
- Single step is one
cpu.instruction(). Breakpoints reuse the core's own once-per-instruction hook (v06c.dbg.check_breakpoint()) against a PC set. Write watchpoints wrapMemory.write— the one path every CPU store passes through — and pause on a store to a watched address.
Architecture
The Vector-06c (Вектор-06Ц, 1987) is a Soviet home computer designed by Donat Temirazov and Alexander Sokolov. Its CPU is the KR580VM80A (КР580ВМ80А), a Soviet clone of the Intel 8080 running at 3 MHz.
- Video — a bit-plane framebuffer (four 8 KB planes) shifted through a 16-entry palette selected from 256 colours, with hardware vertical scroll and a coloured border. The palette and border can be rewritten mid-scanline, which the pixel filler models cycle-accurately.
- I/O — two KR580VV55 (Intel 8255) parallel interfaces drive the keyboard matrix, border, video mode and palette latch; a KR580VI53 (Intel 8253) timer feeds the sound; an AY-3-8910-style chip and a Covox add audio; a KR1818VG93 (FD1793) handles floppy disks.
- Memory — 64 KB RAM with a bank-switched extension (the "quasi-disk"), overlaid at reset by a 2 KB boot ROM. This build boots to Vektor BASIC by default, with the on-ROM "boots" loader and a set of raster/palette test programs as extra configurations.
Sound
The vendored core already carries a complete audio path: sound.js's Soundnik owns its own AudioContext and mixes every source of the machine — the AY-3-8910 (ay.js), the KR580VI53 (i8253) timer beeper, the Covox, and the WAV/tape player — down to a single gainNode that feeds the audio destination, driven each TV field by oneInterrupt()'s soundStep(). So there is nothing to emulate or re-route; the finished mix is already correct.
To fit the shared Sound button we simply gate that whole mix rather than any single voice. vector06c-machine.js holds a muted flag (true at boot) and an applyMute() that opens or closes the core's own gainNode and suspends/resumes its AudioContext, then exposes isMuted/setMute on the transport. It starts silent (browsers block audio before a gesture) and unmutes from the button's real click. The shared /debugger/src/audio.js sink is not loaded — the core drives its own output.
var muted = true; // start silent, needs a gesture
function applyMute() {
var snd = v06c.soundnik; // the vendored mixer
snd.mute(muted); // gainNode.gain = muted ? 0 : 1 (the whole mix)
var ac = snd.audioContext;
muted ? ac.suspend() : ac.resume(); // gate the core's OWN context
}
transport.isMuted = function () { return muted; };
transport.setMute = function (m) { muted = !!m; applyMute(); };