Privacy Policy Cookie Policy Terms and Conditions Sinclair ZX81 - Wikipedia, the free encyclopedia

Sinclair ZX81

From Wikipedia, the free encyclopedia

Sinclair ZX81
Sinclair ZX81
Type Home computer
Released 1981
Discontinued 1983
Processor Z80 @ 3.25 MHz (most machines used the NEC µPD780C-1 equivalent)
Memory 1 kB (64 kB max. 56 kB useable)
OS Sinclair BASIC

The Sinclair ZX81 home computer, released by Sinclair Research in 1981, was the follow up to the company's ZX80. The case was black, with a membrane keyboard; the machine's distinctive appearance was the work of industrial designer Rick Dickinson. Video output, as in the ZX80, was to a television set, and saving and loading programs was via an ordinary home audio tape recorder to magnetic audio tapes. It was very significant historically because it was the first home computer under $100 USD (in kit form), and therefore was a big volume seller. A US-only version was produced by Timex as the "Timex Sinclair 1000".

ZX81 interfaces
Enlarge
ZX81 interfaces
A 16K RAM pack that plugged into the rear of the ZX81
Enlarge
A 16K RAM pack that plugged into the rear of the ZX81
The optional ZX printer; a simple spark printer using aluminised paper.
Enlarge
The optional ZX printer; a simple spark printer using aluminised paper.

Contents

[edit] General description

As with the ZX80, the processor was a NEC Zilog Z80-compatible, running at a clock rate of 3.25 MHz. The system board had been redesigned with a custom chip and now had only four or five chips: a Z80A microprocessor, a custom logic chip (Ferranti ULA) or ASIC, a 2364 8Kx8 bit ROM chip, and either one 4118 1Kx8 bit or two 2114 1Kx4 bit RAM chips. The system ROM had grown to 8 KB in size, and the BASIC now supported floating point arithmetic. In the early days, Sinclair offered the ROM as an upgrade for the ZX80.

The base system as supplied (for approximately £70 in the UK or $100 in the US) had 1 kB (1024 bytes) of RAM. This RAM was used to hold the computer's system variables, the screen image, and any programs and data. The screen was text only, 32 characters wide by 24 high. However blocky graphics with a resolution of 64 by 48 pixels were possible by the use of the PLOT command, which ingeniously selected among a set of 16 graphics characters. To conserve memory, the screen bytes were stored as minimal length strings: for example, if a screen line was only 12 characters long, it would be stored as only those 12 characters followed by the code for a new line, the rest of the line being automatically assumed to be spaces. Using this knowledge, it was common to write programs that kept to the top left of the screen to save memory. As another memory-saving feature, BASIC keywords were stored as 1-byte tokens. If memory grew short, the number of lines displayed on the TV screen would be reduced.

Even with all these space saving measures the little machine's memory did not go very far, so the ZX 16K RAM (or Timex-Sinclair TS1016) expansion pack was available with 16K of RAM ($100 in the US). By mid-1982, third-party 32 kB and 64 kB expansion packs were available. These plugged onto the main circuit board expansion bus edge connector (the 16 kB Memopak from Memotech could be "stacked" with a 16 kB or 32 kB one) and were notorious for wobbling and losing the results of hours of programming.

The Sinclair ZX Printer was also marketed to accompany the ZX81; this was a spark printer (although it was sometimes misleadingly called a "thermal printer") in which a wire point sparked the dot pattern into 4-inch-wide silvery-grey aluminised paper, accompanied by a distinct odour of ozone. Due to FCC compliance issues, the ZX Printer was not marketed in the US, instead the Timex-Sinclair 2040 thermal printer was produced (also available in the UK as the Alphacom 32).

Even so, there were many games and applications that ran in the minimalistic 1 kB, including a basic game of Chess. It was not that hard to get to know, understand, and control the computer completely, something almost impossible today.

There were also a third-party RS-232 serial interface (at ~$140) and a Centronics parallel interface (at ~$105) that would allow the ZX81 to communicate to a standard printer, as well as a full-sized external keyboard (at ~$85).

DK'tronics sold a case and keyboard which, with considerable skill, could be used to replace the membrane keyboard and black "doorstop" case.

In the ZX80 and ZX81, the video output was generated by the Z80 chip. In the ZX80, when a program ran the screen blanked until the program paused again for input. An improvement of the ZX81 over the ZX80 was that the ZX81 had two modes of operation. The ZX81 could run in FAST mode like the ZX80, blanking while programs ran, or in SLOW mode (approximately ¼ as fast) in which the video was maintained since programs only ran during the blank top and bottom border area of the screen. Since a FOR-NEXT loop from 1 to 1000 took 19 seconds, it was common to run the machine in FAST all the time, even when editing a program, causing the TV to flash every time a key was pressed into the editor.

Another trait of the ZX81 was that it echoed the signal from the tape recorder to the screen whilst loading and saving programs using cassettes, causing the TV to display zigzagging patterns.

The ZX81 did not have the ability to make sound, but by clever coding it was possible to modulate the interference that the processor caused on the TV and create a VERY simple musical keyboard. (Producer Aphex Twin claims he was able to play music on a ZX81 when he had one at the age of 11. [1])

The ZX81 did not use ASCII but had its own character set. Character code 0 was space, codes 1–10 were used for blocky graphics, codes 11–63 corresponded to punctuation, numbers and upper case characters. Character codes 128–191 were reverse video versions of the first 64 characters. Other codes represented BASIC keywords and control codes such as NEWLINE. There were no lower case characters.

Because the display was generated primarily by software in the ZX81 ROM, it was possible to override the interrupt service routine and generate the display oneself. Several "hi-res" (meaning, 256×192, rather than 64×48) games did this, notably from a company called Software Farm.

There was a notorious bug causing some ZX81s to give the square root of 0.25 as 1.3591409 rather than 0.5. Sinclair's reputation for poor quality control was due less to the existence of the bug in some machines, and more to the time it took to react once the bug had been reported. Conversely, an article in BYTE of the time, comparing mathematical accuracy of several mainstream and much more expensive computers of the time, reflected positively on the ZX81.

The ZX81 sold in large numbers, until it was replaced by its greatly upgraded successor, the ZX Spectrum.

The Sinclair ZX81 was sold in the U.S. by Sinclair itself (from its facility in Nashua, New Hampshire) and also by Timex as the Timex Sinclair 1000. The TS1000 shipped with twice as much RAM (2 kB!)

The BASIC interpreter was fully proprietary, unlike most microcomputers of this era (except the original Apple II) which used a series of similar but incompatible Microsoft BASIC variants. This meant that there was no need to comply with ASCII or any other existing standards.



[edit] ZX81 internal workings

The technical means used to implement the display and other parts of ZX81 was quite original — at a time when the entire "home" class of computers was in its infancy. The system operated as follows:

[edit] Hardware overview

Manually designed ZX81 printed circuit board (ISSUE ONE), later versions were made using CAD tools.
Enlarge
Manually designed ZX81 printed circuit board (ISSUE ONE), later versions were made using CAD tools.

[edit] The integrated circuits

The ZX81 contains (depending on RAM type) four or five chips; ROM, CPU, SRAM, and a Ferranti Gate array (or ULA – Uncommitted Logic Array). The ROM occupies addresses 0–8191 (but also addresses 8192–16383, due to minimal decoding hardware). The 1 kB (or 2 kB for Timex) SRAM is placed at address 16384 (but repeats up to address 32767). A15 is used for display purposes (see below), and the upper 32 kB memory area is therefore unusable for code execution. It may still be used to store data, such as BASIC programs or large arrays, however. Unless more than 16 kB RAM is installed, this upper 32 kB area is mirroring the lower 32 kB (except for code execution).

[edit] Character display

The computer uses a resizable display-file (screen buffer) meaning that it can be expanded or shrunk depending on the amount of installed memory and the amount of free space at the moment.

There is also a completely non-standard (non-ascii) character set in which 0–63 are printable characters and 128–191 the same characters in reverse video. Bit 6 has special meaning here as, under normal circumstances, the only value with bit 6 set that should be written to the display file is 118, which is a NEWLINE (and also the opcode for HALT!). Placing any other byte with bit 6 set into the display-file would cause unexpected results and may cause the machine to crash.

The ZX81 has the bitmaps (patterns) of the character set stored in the uppermost 512 bytes of its 8 kB BASIC ROM.

[edit] Multiplexing

Resistors function as cheap multiplexers and are placed in series with the data lines (CPU & ULA on one side, ROM & RAM on the other) allowing the ULA to override data when the CPU reads from memory (see below).

There are also resistors in series with address lines A0–A8, separating the ROM and ULA from the CPU (and from any add-on hardware) on those lines; this is used by the ULA to read pixel patterns out of the ROM by overriding address bits A0–A8, while allowing the CPU to control address bits A9–A12 (see below).

[edit] The Z80

The conversion of the character codes into pixels on the TV screen employs both well known and other Z80-specific capabilities, most notably the use of the R and I registers:

The register R is intended as a dynamic RAM refresh counter; during the last part of each opcode fetch, the value of this counter is fed onto the lower portion of the address bus, and the RFSH control signal becomes active. However, also the interrupt vector register, I, is output* during the refresh cycles, but on the upper portion of the address bus.

The HALT instruction is also of central importance in the ZX81, it's necessary to know that a halted Z80 executes repeated NOPs until an interrupt occurs, and that these NOPs causes the refresh counter to tick, just as normal NOPs do.

* Undocumented by Zilog and other manufacturers (such as NEC) at the time.

Screenshot of ZX81 displaying its own printable character set
Enlarge
Screenshot of ZX81 displaying its own printable character set

[edit] Keyboard scanning

The membrane keyboard is scanned during (and closely coupled to) the vertical retrace interval. The scan patterns is laid out by the upper* eight bits of the unbuffered address bus and read back through five TTL inputs (8×5 = 40). It thus takes eight readings to determine which "keys" are being pressed. Decoding and debounce are done in software.

* This exploits the undocumented feature that (for instance) IN A,(C) actually puts the whole BC register pair on the address bus.

[edit] TV picture generation

The I register is normally set to point to the base of the character set bitmap table in ROM. The refresh counter, R, is used to count the 32 character positions on the screen during each scan line. The program counter, PC (see below), counts actual character codes, which may be less than 32 due to the fact that the display-file is dynamically sized.

During each scan line, the CPU enters a HALT state as soon as it encounters the NEWLINE (HALT) that terminates each line of characters in the display-file, and when the R register has counted all 32 positions, a maskable interrupt or INT is generated to bring the processor out of the HALT state just in time to prepare for another raster line.

[edit] SLOW mode

During the upper and lower blank parts of the screen, the computer executes application code (i.e. BASIC or machine code), but a non-maskable interrupt (or NMI) briefly interrupts even this, once every HSYNC period; a counter is updated by the NMI-routine, so it can decide whether it's time to go back and produce character patterns again.

Unfortunately, the use of the SLOW (smooth multitasking mode) slows all other processing by approximately 75% compared to the FAST (flickery mode).

[edit] Executing characters

To actually produce a TV raster scan line of 256 pixels, the interrupt routine literally jumps to the start of the currently scanned line of characters in the display file, but with address line A15 set (i.e. 32768 added); the Z80 control line M1 is also active (indicating an opcode-fetch), and this combination is detected by the ULA:

The CPU fetches the character codes (as if it were opcodes), enabling the ULA to easily latch the values; by forcing a NOP (all zeros) onto the Z80 data bus after each retrieved byte, the ULA ensures that "nothing happens" except that the R register keeps track of the character positions on the line, and that the program counter functions as an auto incrementing pointer into the display file.

As long as the retrieved data has bit 6 reset (a character), the CPU will continue "executing" characters (as NOPs), helping the ULA reading character codes out of the display file. When the ULA detects the HALT (bit 6 set), it allows the Z80 to execute it normally; the processor stays halted and executes NOPs until the R-register wraps around to zero and thereby generates an INT — this works because INT is hardwired to A6.

This process is repeated eight times for each line of characters, and 192 times for a full TV frame.

The ZX81 makes extensive use of rather intricate "instruction timing", in the ROM program, as well as some small but delicate hardware fixes to fine-tune this system and avoid glitches and jitter in the generated video picture.

[edit] The interrupts

The INT routines are not proper interrupt routines, in that they mostly do not return. Instead, the return address is constantly discarded so that each interrupt can (technically) "interrupt" the previous, without causing stack overflow. Only once every eight lines is the pushed address used; it then points to the next line of characters in the (possibly) irregular display file, directly after the HALT instruction.

The NMI interrupt, however, always makes traditional "returns" to the application code during (the greater part of) each line in the upper and lower parts of the screen (the borders). However, when it's time to initiate the character pattern display, it turns the NMI generator off, and transfers control to the INT routines (and vice versa).

[edit] More details and timing

Due to the refresh-mechanism, the Z80 opcode-fetch consists of four clock cycles, which (during generation of eight pixels) are spent as follows:

During the first and second (the opcode fetch), the processor attempts to fetch a character code (as if it were an instruction), but the ULA latches the actual data, while forcing a NOP onto the Z80-bus, as described above.

During the third and fourth (the DRAM refresh) the ULA composes the address to the actual byte of pixel-data; bits 0–5 of the latched code is fed onto bits 3–8 of the ROM address (selecting one of the 64 different character patterns); the interrupt vector register supplies the base address (bit 9-12), while bits 0–3 comes from a modulo 8 counter (in the ULA) clocked by HSYNC and thereby selecting one of the eight pixel-rows for all characters on a line simultaneously.

The byte from the ROM is then fed into a shift-register, controlled by the same "crystal" as the CPU, and clocked out to the TV set at twice the CPU frequency (8 pixels during the 4 cycle NOP).

TV syncronization pulses (HSYNC and VSYNC) are output by the ULA and mixed with the video signal such that white=5V, black=2.5V, and SYNC=0V and fed to the HF-modulator. HSYNC is autonomously generated in hardware, while VSYNC is generated under CPU control in connection with keyboard scanning.

Bit 7 from the original character byte is read by the ULA and controls inverse-video on a per-character basis. The video syncronization pulses uses the same individual I/O bit as is used to generate the output for the 250 bit/s cassette recorder interface. This is the reason for the strange patterns displayed on the TV while saving or loading programs.

[edit] RAM pack & add-ons

[edit] I/O-addressing

The lower eight I/O address bits were used as individual chip selects for individual I/O devices within the ULA. Every lower address bit except that selecting the desired device would therefore have to be one, theoretically allowing up to eight I/O devices. In the standard configuration, the only I/O present (unless the optional external ZX Printer was plugged into the 40-pin bus edge connector) was one bit for the cassette input, one bit for the cassette/video sync output, a five-bit word of input from the keyboard (which resembled a car bumper sticker more than it resembled a proper keypad) and whatever control registers were required to enable the ULA itself for video generation. This meant that not all eight bits were used, allowing some limited room for external expansion.

[edit] ZX 16K RAM pack

The 16K RAM pack tied the RAM-CS line on the 40-pin edge connector to +5V to disable the internal RAM. It used eight 4116 16 K x 1 bit dynamic RAM chips contained in 16-pin dual inline packages (1 data pin and 7 multiplexed address pins with /RAS, /CAS, /WE, and power). These old chips required +12 V, +5 V and -5 V so the RAM pack contained an oscillator and some inductors to convert +5V into the other required voltages as well as circuitry to multiplex the address lines, adding significantly to its internal complexity.

The ZX81's internal voltage was regulated by a simple 7805 5V linear regulator attached to a small heatsink. This could became rather warm as the voltage into the 3.5 mm jack could vary within an approximate 9V-18V range depending on factors such as actual load (RAM pack, printer, etc) and line voltage variations.

Unfortunately the 40 pin bus edge connector itself was not gold-plated (the contacts were covered with plain solder) and was very prone to oxidation. In addition the design of the Sinclair RAM pack was mechanically insecure, which rendered the upgraded ZX81 system very crash-prone. This would become annoying as it would take eight minutes to reload the full 16 kB RAM from an (often-unreliable) cassette tape. Home-brew "kludge" solutions to this problem varied from physically bolting the computer and RAMpack to a solid substrate to placing the whole works in a larger case with a proper surplus keyboard in place of the original.

[edit] User defined charset and hires

Another less-common upgrade made by some end-users was to connect static RAM (as "pseudo-ROM") in place of the ROM mirrored at addresses 8192–16383. This RAM would need to be connected to the same side of the data bus resistors as the ROM itself so that it could be used to store a user-defined character set of up to 64 characters. One variant on this theme added a one-bit latch to latch the high data bit of the original character (when M1 and A15 were both active) in order to use it to drive one of the address bits, allowing all 128 character bitmaps to be redefined.

As the main RAM was on the wrong side of the data and address bus resistors for this to work, the extra static RAM was required for this approach. Loading the I register to point to the main RAM would not produce the desired result, instead displaying garbage as pixels.

[edit] Clones

The ZX81 was cloned for sale outside Europe, with Timex Sinclair, a joint venture, producing the TS1000 for the US market.

The ZX81 was also cloned in the Brazilian Market by many local companies, among them: Apply, Ritas, Microdigital and Prológica (these two being the main competitors for the market). Microdigital produced several ZX80 clones (TK 80 and TK 82/82C), a ZX81 clones (the TK 83), a TS1500 clone (TK 85), and two ZX Spectrum clones (TK 90X and TK 95)[2]. Prológica produced NE-Z80 (ZX80 clone), NEZ-8000, CP-200 and CP-200S (late cheaper version).


[edit] External links

Commons logo
Wikimedia Commons has media related to:


Sinclair computers, derivatives, and clones (ZX80/81, ZX Spectrum, and QL clones)

By Sinclair ResearchZX80 | ZX81 | ZX Spectrum, Spectrum+, Spectrum 128K | Sinclair QL
By AmstradSpectrum +2, +3
By Timex SinclairTS 1000 | TS 1500 | TS 2048 | TC 2048 | TS 2068, TC 2068
By others:  Jupiter ACE | SAM Coupé | Didaktik | Dubna 48K | Hobbit | Pentagon | Scorpion | Sprinter

THIS WEB:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2006:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu