Sections

2024-02-23

GISA - Getman Instruction Set Architecture

NOT FINAL

Why another ISA?

To have one that can be written like Protrackter MODs, that is the opcode, registers, and immediates are clearly apparent from the machine code without the need for a disassembler, and also the machine code can be written directly without the need for assembler, meaning it can be easily cross-checked. Back in 2018 I had to use all 3 attempts at the exam from MIPS assembler with pipelining, branch prediction, hazard detection and stalling, so I'll make my own ISA where I don't have to deal with this, making the scheduler by my own later.

Also I don't like RISC-V being primarily little endian and missing an official 16-bit variant. Little endian is confusingly notated in hexadecimal in mixed endian actually, so it's like reading Kharoshthi or Tamil. Network byte order is big endian, therefore a big endian ISA is better suited for devices connected to the Internet, or so called IoT. Microcontrollers don't need to be 32-bit, and while the 8 bit segment is served by the well-known 6502 and Z80 alredy, the 16 bit segment is somewhat lacking in widely famous architectures, mostly PIC, AVR, some TI chips, expanded 8-bit designs like 65816 and Z180, and proprietary console chips.

On the other side of the bit count, RISC-V is reluctant to fully specify its 128-bit variant, and is entertaining the idea of having near and far pointers again, after all that 80286 segment nonsense. In GISA, everything is the same amount of bits, so the floats would also be 128 bit, which is useful.

Furthermore, you need to pay membership fees to the RISC-V foundation to be able to have your products boast about using RISC-V, just like with Khronos Group and Vulkan. It might be cheaper to just copy LoongArch like Loongson did with MIPS. I prefer to call things what they really are, be it someone's trademark or not.

There are no privilege levels, there is no MMU, everything runs with full access to everything, just like YHWH/Gospodin/Allah intended, and just like it was on the Amiga and DOS. This is a better approach for real-time embedded systems than having to deal with some address translation and prolonged context switching. Remember the connection to music making. Note that as per hadith, only "vain entertainment" music is haram, and MODs are nerdy music.

Eventually I plan to write a B compiler for word-address variants, tentatively called HornyB or HoneyB, and write my own TempleOS or Oberon, tentatively called MosqueTOS, but it may end up more like SerenityOS because POSIX. The byte-address variants get a C compiler and a port of Plan9/Inferno, MINIX 1/2 or uClinux, and may thus run something actually useful. All BSDs ever since 386BSD require MMU. Porting HelenOS, MINIX 3, Mach/Hurd or other microkernel OSs to this noMMU architecture could probably net me a honorary PhD from MatFyz, VU or MIT, but RTOSes would be more fun and demoscene-y, and Selbstgesamtkunstwerke yield more to monolithic kernels. Should the compilers be too difficult, an assembly port of Workbench/AmigaOS or BASIC may be a possiblity.

Lest I be accused of creating a bytecode instead of an ISA, most bytecodes are stack-based and intended to be emitted by high-level object-oriented language compilers, whereas GISA has full access to entire memory and is made to be written directly, just like the olden days.


Different variants

Variants with different bit widths aren't binary compatible. Everything in them is that bit size, registers, instructions, and address space. There can be some jumpers for emulation of smaller sizes, but that's a sillicone wastage.

The B variants differ from the regular variants by having byte-addresible registers and memory with a byte select mask appended to every register number. This dramatically reduces the number of registers and the byte size of address space, however permits better string manipulation and struct packing, and allows more data types than just int, uint, and float. It would make sense to make these variants little endian, but that would be confusing.


GISA-8 - 4 opcodes, 3 registers, 256 B address space (W/B is redundant)

GISA-16W - 16 opcodes, 16/31 registers, 64k 16-bit words address space (128 kB)

GISA-16B - 16 opcodes, 3 registers, 64 kB address space

GISA-32W - 256 opcodes, 255 registers, 4G 32-bit words address space (16 GB)

GISA-32B - 256 opcodes, 16/31 registers, 4 GB address space

GISA-64W - 65536 opcodes, 65535 registers, 16E 64-bit word address space (128 EB)

GISA-64B - 65536 opcodes, 256/511 registers, 16 EB address space

GISA-128W - 4G opcodes, 4G-1 regs, 268435456Q 128-bit w addr space (4294967296 QB)

GISA-128B - 4G opcodes, 65536/131071 regs, 268435456 QB address space


I prefer 16W over 16B and 64B over 64W, but I am quite split on 32W and 32B. RISC-V has both RV32E and RV32I defined. Some may question the presence of 8 and 16 bit variants, but their paedagocial value is greater than the possibly too large 32 and 64 bit variants.

Each architecture can be harvardized, that is the program counter points to a completely different XOM, maybe on an EEPROM. This seems secure, like W^X, and also doubles the total memory size, but smells of console DRM, and gets rid of the fun self-modifying code provides. There is still a way to extract the contents from within using instruction recovery attack: https://arxiv.org/pdf/1909.05771.pdf . The bootstrap process of the von Neumann version is blit the code into RAM and set the program counter to the entry point.

Once I come up with a way to generate 4 milliards of instructions, I'll specify 128W and 128B, but I don't think there will be ever need to have more than 16 EB or address space at home, and datacenters won't be using some weird guy's embedded ISA.



GISA-8

This one is extremely simple, and could be fun for curious elementary school kids to implement in Minecraft, assuming they are being taught proper discrete mathematics instead of how to be walking calculators. It's not very much capable for a load-store architectiure, possibly try OISC, which means dump the registers. However if I can write a brainfuck interpreter, it means it's linearly bound Turing complete. Good luck fitting the program into 256 B and not overwriting it. Self-modifying code is needed.

Each instruction word is 8 bits and has 4 fields, each of 2 bits. The 1st field is always the opcode. The instruction types are RRI only. There are only 4 opcodes, so this is a FISC. Exceptionally, binary notation is preferred.

Opcodes:

00: AI  dest  src  imm   Add Immediate (signed)  dest = src + imm
01: LA  dest  src  imm   Load from Address       dest = mem[src+imm]
10: SA  dest  src  imm   Store to Address        mem[dest] = src + imm
11: BN  dest  src  imm   Branch if not Zero      pc += (!src) ? dest+imm : 0

Due to there only being 2 bits for the immediate, only values -2, -1, 0, and 1 are possible. After executing BZ, program counter still gets incremented, so you can skip over a instruction with 1.

Registers:

00: r0, zero
01: r1, sp
10: r2, s1
11: r3, s2

There is also a separate program counter, which physically occupies the space where the zero register would be, but isn't connected to the usual read and write circuitry.

There is no interrupt, you have to poll the I/O.

GISA-8 is much more of a Zachtronics puzzle than an actually usable architecture, and is provided mainly for completeness and paedagogy, illustrating the principles of larger GISAs.


Brainfuck interpreter for GISA-8

This is to prove that GISA-8 is linearly bound Turing complete. P" would be enough, but we can do some I/O at least. This is assuming a Harvardized version where the interpreter code itself is in a separate 256 B XOM addressed by the program counter.

Memory map:

00000000 ~ 01111111: Brainfuck Memory (128 B)
10000000 ~ 11110111: Brainfuck Program (120 B)
11111000: Program length; Counter; Code pointer; Data pointer 
11111100: Keyboard Input Data
11111101: Keyboard Input Advance Signal 
11111110: Terminal Output Data
11111111: Terminal Output Advance Signal

Register map:

00: ze      zero
01: mp      brainfuck memory pointer
10: ac      accumulator
11: pp      brainfuck program pointer
--: pc      machine program counter

The Brainfuck program can be self-modifying. Due to extreme space constraints, the syntax may have to be extended to allow numbers to be used for long runs of symbols, so insted of 50 pluses which would take 50 B, you would write "50+", which takes just 3 B. Most sample programs tend to fit within 120 B, though.

Brainfuck command interpretation in assembly:

+   LA ac mp 0 ; SA mp ac 1
-   LA ac mp 0 ; SA mp ac -1
>   AI mp mp 1
<   AI mp mp -1
[   LA ac mp 0 ; BN ze ac 7 ; (ascertain next ] location, put in ac) ; AI pp ac 0
]   LA ac mp 0 ; BZ ze ac 7 ; (ascertain prev [ location, put in ac) ; AI pp ac 0
,   AI ac ze -2 ; AI ac ac -2 ; SA mp ac 0 ; AI ac ac 1 ; SA ac ze 1 ; SA ac ze 0 
.   AI ac ze -2 ; SA ac mp 0 ; AI ac ac 1 ; SA ac ze 1 ; SA ac ze 0

(init)   LA mp ze 0 ; LA pp ...  (obtain value 128 somehow)
(next)   AI pp pp 1 ; LA ac pp 0 ; BN ze ac 1; BZ ze ze -1; (loop upon reaching \0)

The [ and ] would be much easier when implementing a compiler instead of an interpreter, which would have figured out the jump addresses at compile time. It's also annoying that there's no space for logic, and I haven't decided upon which condition to branch.



GISA-16W

This width conveniently comes out as exactly 1 hexadecimal digit for opcode and registers. This makes it highly resemble a Protracker channel, just missing the note column.

There's some VLIW potential of programming 4 cores independently. A possible nickname for GISA-16W-VLIW4 is PTISA, a pun on Interslavic "ptica", GISA-16W-VLIW8 could be OCTISA after Octalyzer, GISA-16W-VLIW16 could be STISA after Scream Tracker 3, and GISA-16-VLIW32 could be MTISA after Multitracker, for cores sitting on many I/O devices, as there would be only 8 kB per core. This is intended for controlling stage hardware without MIDI.

I'm indecissive of how to indicate hexadecimal - $AB like 6502, ABh like Intel, 0xAB like AT&T, or xAB like laziness.

Effects Opcodes:

0: ADD      dest src1 src2     Add
1: AND      dest src1 src2     And
2: OR       dest src1 src2     Or
3: SUB      dest src1 src2     Subtract (compare)
4: ADDI     dest src  imm      Add immediate
5: SLAI     dest src  imm      Shift left arithmetical immediate
6: SLLI     dest src  imm      Shift left logical immediate
7: SRI      dest src  imm      Shift right immediate
8: XOR      dest src1 src2     Exclusive or
9: XAND     dest src1 src2     Exclusive and (if and only if, exclusive not or)
A: LA       dest imm           Load address
B: SA       src  imm           Store address
C: BEZ      dest imm           Branch on equals zero
D: BNZ      dest imm           Branch on not zero
E: J        dest imm           Jump reg+imm
F: JAL      dest imm           Jump and link

The operations are inspired by school MIPS lessons. I'm not sure how much of a Turing tarpit is this selection. May need to fit interrupts somewhere, but they are basically a jump to a table offset, that says jump to a handler.

Note to self: TIS-100 has MOV, ADD, SUB, NEG, JMP, JEZ, JNZ, JGZ, JLZ, JRO.


Registers:

0: r0, zero
1: r1, sp
2: r2
3: r3
4: r4
5: r5
6: r6
7: r7
8: r8
9: r9
A: r10
B: r11
C: r12
D: r13
E: r14
F: r15

Because there is no byte addressibility, the address space spans 128 kB instead of usual 64 kB. This yields to UTF-16 instead of UTF-8, and the bit wastage isn't that high because 42069 (A3F3h) is a perfect 16-bit number.

The regular von Neumann version may be a good place for porting Wozmon, as those 256 B of dense 6502 code wouldn't fit in the address space of even Harvardized GISA-8 while having to express that with just 4 different types of instructions.



GISA-16B

There is no byte addressible VLIW version. 64 kB of RAM would only fit 8k VLIWs for 4core, or 1k VLIWs for 32core.

The register fileld is broken up into 2 evenly sized parts. The higher crumb determines the register, and the lower crumb represents a byte select mask. This leaves us with 4 registers.

There are 2 bytes in 16 bits, and so the bytemask is 2 bits.

00: no byte selected / the other register file (O)

01: low byte selected (L)

10: high byte selected (H)

11: all bytes selected (X)

Being able to select no bytes alleviates the need for a hardwired zero register, however there are now number of registers way to specify zero, so optionally there can be another set of registers minus one that will now be the only zero, this time without byte subdivisions, like for addresses, integers, UTF-16 and stuff. This will increase the number of registers to 8, at the expense of unnecessary complexity for a 16-bit processor, unlike the plain simple 16 16-bit only registers.

Intel's 4 general purpose registers come to mind here, so I'll use their letters.

Registers:

0: AO, r0, zero
1: AL, r4l
2: AH, r4h
3: AX, r4
4: BO, SI, r5 *
5: BL, r1l
6: BH, r1h
7: BX, r1, sp
8: CO, DI, r6 *
9: CL, r2l
A: CH, r2h
B: CX, r2
C: DO, BP, r7 *
D: DL, r3l
E: DH, r3h
F: DX, r3

* optional register, act as r0 if not implemented, or maybe halt and catch fire


Wozmon for GISA-16B

Wozmon is a memory editor and assembler for 6502, that Wozniak of Apple has managed to cram in zeropage, that is in 256 B. We only have 256 B of memory address space on GISA-8, and also none of that instruction compactness, so it would't fit there.

Porting of this needs to find a way around the lack of interrupts. It will finally use von Neumann memory architecture. The 6502 had 3 8-bit registers, here we have at least 4 16-bit ones.



GISA-32W

This is the smallest GISA to have float support, as the number of opcodes started to allow it. The float registers are separate from integer registers. There is now a full byte for each opcode and register. I would consider this to be the base ISA, other widths are mostly derivations.

Following the tracker inspiration, GISA-32W-VLIW32 could be called FTISA (ptica with a lisp, after FastTracker 2), GISA-32-VLIW64 ITISA after Impulse Tracker, and GISA-32W-VLIW128 MPTISA after (Open)ModPlug Tracker. Having 128 cores with just 16 GB of memory would still be quite silly (512M per core), but at least you can race condition the entire memory.

There was this unreadable opcode diagram I made in 2019:


May need some adjusting and rethinking, mainly regarding unsigned.


Opcodes, column is the 1st nibble, row is the 2nd nibble:

     0    1   2   3    4   5   6   7   8   9   A   B    C    D    E    F

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F


The instruction format is in the least significant bits of the opcode, as we the people don't see ADD as too different from ADDI, and unlike RISC-V, which is for machines, GISA is for people, at least those like me.


Registers:

00: r0, zero
01: r1, sp
02: r2
etc.
FF: r255


Floating point registers are a separate file. They can be combined to make vectors, but that's more of a compiler, scheduler and thermals thing. Naturally only IEEE single precisstion is supported.

The main programming language for GISA-32W is B. The sinuglar word type can get interpreted either as an uint32, int32, float32, char32, or pointers to such. Most importatntly, pointers in B are in words, so *(0xFFFFFFFF) points to the last word, which would be *(0x3FFFFFFF0) read size 4, on a byte addressible architecture. If somehow wanting to use C, you get only int, unsigned, float, wchar. Software packing of 16-bit and 8-bit types is possible, but then the pointers would have to be in bytes, so quarter of memory would be unreachable.


There it may make sense to have some control and status registers, which could even switch between GISA-W and GISA-B, as well as emulate GISA-16 and GISA-8.


GISA-32B

The byte for specifying register is split into 2 nibbles, therefore there are 16 registers with 16 possible modes of access using an agruably INTERCAL inspired select mask:

0: 0000: zero or alternate register file
1: 0001: the lowermost byte -> 8b
2: 0010: lower middle byte -> 8b
3: 0011: lower half or lower word -> 16b
4: 0100: upper middle byte -> 8 b
5: 0101: upper middle and lowermost byte -> 16 b
6: 0110: upper middle and lower middle byte -> 16 b
7: 0111: all but the uppermost byte -> 24 b
8: 1000: the uppermost byte -> 8 b
9: 1001: the uppermost and lowermost byte -> 16 b
A: 1010: the uppermost and lower middle byte -> 16 b
B: 1011: all but upper middle byte -> 24 b
C: 1100: upper half or upper word -> 16 b
D: 1101: all but lower middle byte -> 24 b
E: 1110: all but the lowermost byte -> 24 b
F: 1111: all bytes -> 32 b

The discontinuous selects can be slid together or continuous selects can be pulled apart using a different select mask on the destination register. If the number of selected bytes in the destination mismatches with number of bytes selected in the source, the result depends on endianess, but GISA should be big-endian. There are too many little endian ISAs already. This is basically connecting part of registers to the parts of the bus to make lesser sized reads.

This allows for some intersting string manipulation:

DB 400h "AZOV"
DB 404h "KRYM"
LI r2mf, *400h
LI r3mf, *404h
ADD r3mf, r3mc, r2m3  ; "KROV"
SA r3mf, 408h

Whereas on 32W you would need to make 2 ANDs and 1 OR instead of 1 ADD, and consume 1 more register.

It also makes it possible to implement 3 byte or 24 bit integers directly in hardware, and use the leftover byte for some char or bool, or to implement some rudimentary vectors.

Byte selector works also on floating point registers too, but casting is not so straightforward. 8-bit and 24-bits float are handled as truncations of 16-bit and 32-bit floats, until I come up with a useful format or control registers to change bit allocations to your liking.

The C types would be:

char - 8 bits

short short float - 8 bits (compiler hack)

short short - 16 bits (compiler hack)

short float - 16 bits (an old C++ proposal)

short - 24 bits

int - 32 bits

float - 32 bits

wchar - 32 bits

long - 64 bits (paired registers)

double - 64 bits (float-float or software)

long long - 128 bits (4 registers)


GISA-64W

This is in fact more of a CISC architecture, because there are 65536 opcodes, which is around the number on x86 with all those extensions. Some of the 16 bits in the opcode could correspond directly to ALU controls, and other could clearly encode the instruction format. Collecting all the instructions on all the CISC CPUs and adapting their format to RISC would be just like collecting roots for GeSeL.

For the intents of vector instructions, the register file is all zero registers beyond FFFF.

The memory addressed is 128 EiB or 2^67 B. This is about the maximum I expect consumer devices to ever reach. Such amount of sillicon atoms for the perfectly miniaturized memory cells would fill an entire room.

There is no VLIW because no tracker implements more than 256 effects. But if I finally finish ReTeMuS (Renderer/Redactor of Text Music Sequences, also called vitracker, MT637, GSS etc.), then there may be a 256core version, that is only 256T VLIWs in RAM.


GISA-64B

Much more preferable, since no one is willing to devote the sillicon space to 65536 64-bit registers (8 Mb). 256 of them is much more acceptable, with 256 different byte masks.

This makes it possible to directly implement also 5 byte (40 bit), 6 byte (48 bit), and 7 byte (56 bit) integers and floats, in addition to 3 byte (24 bit) intergers and floats from GISA-32B. For floats, default behavior is to truncate the mantissa of the next higher IEEE standard, however there are many bespoke extended precision float formats, notably the 40-bit one used by BASIC.

As usual, there can be another set of non byte-addressable registers for when accessing them with a zero mask, bringing the total to 512. To reiterate, float registers have their separate file, that too can have alternate file for zero select mask, so there can be 1024 total registers.

There is still no MMU, so porting TempleOS is made easier. This is not meant to run regular operating systems, where the kernel controls hardware-assisted memory management. User is considered smart enough to know where they are writing to or where they are reading from, like some MMIO device, and also when to not cause a race condition.

The C types would be:

char - 8 bits

short short float - 8 bits (compiler hack)

short short - 16 bits (compiler hack)

short float - 16 bits (an old C++ proposal)

short - 24 bits

int - 32 bits

float - 32 bits

wchar - 32 bits

short short short long - 40 bits (compiler hack)

short short short double - 40 bits (compiler hack)

short short long - 48 bits (compiler hack)

short short double - 48 bits (compiler hack)

short long - 56 bits (compiler hack)

short double - 56 bits (compiler hack)

long - 64 bits

double - 64 bits

long long - 128 bits (paired registers)

long double - 128 bits (double-double or software)

long long long - 256 bits (4 registers, compiler hack)


GISA-128W

There are 32 bits for the opcode, so each of them can be directly assigned to a control somewhere down the instruction decoder and ALU config. This can create many "undocumented" instructions, like with the 6502. I'll just need to decide on the topology. Also you won't need any cache with 4 milliard registers.

The address space without byte addressability is humongous. 2^132 B, with Harvardized program counter even 2^133 B. There are no SI prefixes for that, not yet approved QiB is only 2^100, 3 more prefixes are needed. Don't you ever come at me with this not being enough. There's barely enough sillicon atoms in the entire Earth for a milliard of such memory kits, less than 1 per 8 people.


GISA-128B

4G registers is so many it could be construed as a direct 32-bit addressing of the memory. Therefore it's highly advisable to reduce it to 65536 with 16 individually addressible bytes or their combinations. And yes, there is the option to have another 65536 non-byte addressible registers if that's too little now.

In addition to GISA-64B, there can be 9 to 15 byte (72 to 120 step 8 bits) integer and float types alike. A specific consideration should be made for 80-bit extended precission most notably known from Intel 8087, 72 bit float being truncation thereof.

The C types are the same as GISA-64B, but there are additionally these hacks:

short short short short short short short long long - 72 bits

short short short short short short short long double - 72 bits

short short short short short short long long - 80 bits

short short short short short short long double - 80 bits

short short short short short long long - 88 bits

short short short short short long double - 88 bits

short short short short long long - 96 bits

short short short short long double - 96 bits

short short short long long - 104 bits

short short short long double - 104 bits

short short long long - 112 bits

short short long double - 112 bits

short long long - 120 bits

short long double - 120 bits

long long double - 256 bits (quadruple-quadruple or software)

long long long long - 512 bits (4 registers)

But using int###_t and float###_t is probably better. The compiler is to manage the register splits and masks, but it may be a good idea to hint it with proper declaration order.


There is unlikely to ever be a need for an address space bigger than 128-bit, since there is not enough sillicon atoms in the Earth to make this much memory. Or would you like to mmap all the Internet? If you have read everything up to here, you could very well extrapolate GISA-256W and GISA-256B, but there would be nothing new, everything just would be wider with more dead space. You would get octuple precission floating point, though.




2024-02-18

OpenStreetMap Tile Layers for KDE Marble

I've started to disagree with the featured tile layers on openstreetmap.org. First, whoever makes the decisions decided to feature Tracestrack Topo, which is broken when HTTP Referer header is disabled, therefore it doesn't work in Librewolf by default, and neither does in KDE Marble. There's already OpenTopoMap, which handles depressions way better (Z0 to Z10). Way odd for a company from the Netherlands to make their home country look so ugly, but it's even more apparent at the Caspian sea. The Z9 to Z11 of Tracestrack Topo are quite nice, though. The Z12 to Z19 are however too similar to the default Carto, and buildings are gone until Z15 inclusive, which makes it less usable.

Secondly, they removed my favorite ÖPNVKarte, which was miles better than Thunderforest's Transport. Supposedly it was months out of date, but the only out of date thing important for me were some missing tram line extensions, which started to pop up quite frequently considering how long it takes to legally build anything in Czechia, to the point it's easier to do it illegally and bulldoze it years later when you finally actually have to. Prague Metro has been the same since 2015, and bus routes are volatile by design. I have paper maps 20 or even 100 years out of date, a few months is nothing.

In August 2025, 2 vector tile layers have been featured, Shortbread (MVT) and OpenMapTiler (PBF). However I now have an 5120x1440 ultrawide monitor, which is wider than the HTML canvas can handle, so it's blurry. Shortbread was like F4map and tried to respond to dark mode with a simple luminance inversion, now it has a different always light design. Transport has an actual dark variant and is now also vectorized. OpenMapTiler is basically a vector version of Carto. The zoom is still discrete.

I've been collecting other tile layer URLs, as far as they were working, also stealing some API keys with them from the F12 devtools, originally intending to make a beefed up version of montage.sh from OpenTopoMap to scrape all tiles at all zooms to stitch together and print various territories to avoid relying on my phone's rapidly depleting battery, given the need to increase brightness. But I've discovered that KDE Marble can import those tile layer URLs and project them onto the globe, so there goes the silly Mercator Greenland and Siberia exaggeration. Printing the view is supported too, and just like with web maps, 4K display is recommended for A4, as 2160 px * 2.54 cm/in / 17.3 cm = 317 DPI. Do not confuse KDE Marble with Marble Maps, which is a differnet app with buggy UI (you can't exit settings, you have to restart), that doesn't support importing custom tile URLs.

I have intentionally omitted US-focused layers, yet kept European focused ones. As a European, I don't really care about the USA, for I am not likely to set foot in there unless public transit gets decent (see ÖPVNKarte and OpenRailwayMap), and American OSM data is not quite up to the European levels of quality. There will always be better data for the US on proprietary American maps, like Bing Maps, Google Maps, Yahoo Maps etc., just as there is better data for China on Baidu and for Russia+CIS on Yandex. OSM is mainly a European project with some activity in the 3rd world as per humanitarian efforts.

While Google Earth Pro can be made to display tile overlays too, the 3D terrain and buildings interfere heavily, and besides being proprietary, it requires perfectly functioning 3D graphics, which wasn't the case with Intel GMA on Linux, and may not be necessarily the case with nVidia. It occasionally crashes, and instead of fixing it, Google has decided to nix it in lieu of the web version, killing the old 3D buildings for good. For viewing flat 2D tiles on a globe, KDE Marble consumes much less resources, and with a hybrid tile layer looks quite close to Google Earth. Also there are multiple projections to choose from, even Azimuthal to appease Discworld LARPers, but Gnomonic is the best for determining Qibla.

There are however some limitations. Non-Mercator projections aren't that smart with regards to reading the file header and assume the dimensions from the config file, which defaults to 256x256, which needs to be edited manually. Non-power-of-2 sizes do seem to work, but are omitted to reduce clutter except Yandex Labels 10x, that is 2560x2560, which was the largest offered size. The tiles are somewhat blurry at the standard density, however the font size of some of those tiles is now at least properly readable on 8K Big Brother telescreens. Also, the projections maintain the same pixel density for a given zoom, so when actually specifying their correct resolution, they look actually less detailed, except HERE, which corrects for this by providing a zoom level 1 deeper for 512x512 tiles. If the size is kept declared as 256x256, the Mercator projection detail increases as intended, but other projections display patchwork. Possibly on Hi-DPI monitors the base size looks unreadably tiny or Marble respects DPI settings and adjusts the target pixel density. Furthermore, Bing uses some sort of quadtree index, which is way above the capabilites of {x} {y} {zoomLevel} placeholders and reminds me of INTERCAL mingle operator. Some tile providers may also use the correct ellipsoidal Mercator projection formulas instead of spherical misinterpretation of WGS84 data (namely Yandex), shifting things alongside a merididian by up to 40 km. Webcator is in fact so shitty that the US DoD NGA said it sucks and the popularity of it is dangerous, and EPSG long refused to assign a SRID to it, therefore it works better than China's offical coordinate scrambling algorithm GCJ-02 and its bespoke Baidu BD-09 variation (which also seems to use some weird tile indexing). Also, the default zoom range only suffices up to zoom 19. Some tilesets, namely the ESRI World Imagery, go up to zoom 23 (not everywhere), Voyager/DarkMatter/Positron go up to 20 with 8x making it effectively 23, and Yandex Labels go up to 21 with 10x making it effectively 24.25. However expanding the zoom range causes the view to glitch to a different position when zooming too quickly too deep.

Editing of the imported tile layers properties is very clumsy. There is no GUI for it. You have to manually edit XML in $XDG_DATA_HOME/marble/maps/earth/${mapname}/${mapname}.dgml , $XDG_DATA_HOME being usually ~/.local/share , ~ being usually /home/$(whoami) , therefore full path is most likely /home/$(whoami)/.local/share/marble/maps/earth/${mapname}/${mapname}.dgml . If you somehow still use that spyware proprietary software bootloader, then %LOCALAPPDATA%\.marble\data\maps\earth\%mapname%\%mapname%.dgml , %LOCALAPPDATA% being usually %HOMEPATH%\AppData\Local , %HOMEPATH% being usually %HOMEDRIVE%\Users\%username%, and %HOMEDRIVE% being usually C:, therefore the full path is most likely C:\Users\%username%\AppData\Local\.marble\data\maps\earth\%mapname%\%mapname%.dgml. Note that ancient versions of Windows NT use "Application Data" for AppData and "Documents and Settings" for Users, as to make sure the MAX_PATH limit of 260 is hit more often.

Deleting hard disk cache from the GUI doesn't work properly on these custom indexed tile layers, you have to delete all numbered directories manually. This can be achieved by a bash one-liner:

for Z in {1..24}; do find "$1" -type d -name "$Z" -exec rm -rf {} + ; done

Don't delete the ${mapname}/0/0/0. files. They are somehow load-bearing. The default cache validity is a year, which seems quite long, but there is also a size limit configurable from the GUI, which is to be reached instead. The providers shouldn't be spammed with tile requests repeatedly, and new motorway stretches usually open in December or around election time.

Since then, most of the work went into upstreaming the Qt6 port for KDE 6 instead of making it behave better.


Here is the link to the tile layers, finally:

https://drive.google.com/file/d/1mKJGLWdU5LI7Eh-YENAM_DV0R3_RTB1C/view?usp=drive_link

Extract this archive into ~/.local/share/marble/maps/ or %LOCALAPPDATA%\.marble\data\maps\ , so that the earth directory in the archive merges with the earth directory already present there. Depending on your distribution, actual path may differ. Preferrably, restart KDE Marble. Some tile layers don't work on the outdated Windows version from 2015, mainly the high DPI and non PNG8 or JPG ones. Possibly it has to do something with missing filename extension, as the tiles end with a mere dot due to URL rewrites containing none, but for the love of Allah, please stop using such shitty operating systems where a file name ending in a dot is a problem.

Licensing note: There are some proprietary tile layer URLs included with some low zoom pre-cache tiles. These are provided for evaluation, comparison, personal, or private use. Don't use them in any situation where you wouldn't use the Webcator projection. Especially don't abuse those with API keys included in them. I was too lazy to fill in attribution text, for what is essentially a sophisticated URL collection. Usually the provider is included in the name.

There is no warranty, tile providers may start Referer and Origin checking or even stop providing the tiles altogether, KDE Marble may freeze, SSD may lock to read-only mode due to cache thrashing exhausting write cycles (there are a lot of small files being downloaded), Internet bill may force you to declare bankruptcy, tyrannical government may prosecute you for using foreign maps with wrong borders (see Yandex which removed them), you may simply dislike the appearance of some tiles or presence of some tile layers, and so on and so on.

Last updated on 2026-05-10 (ISO), 10.05.2026 (Central-East Europe), 05/10/2026 (USA), 2026\10\05 (US-occupied Middle East).


Tile layers available from the "store" or shipped by default:

OpenTopoMap
OpenStreetMap Carto
OpenSeaMap //overlay on top of OpenStreetMap Carto
OpenFireMap //overlay on top of OpenStreetMap Carto, DACH only
Hike and Bike Map //RIP
Thunderforest OpenCycleMap //API key watermark
ÖPVNKarte (Public Transport) //aka OpenBusMap


Included tile layers (bold works on the old 2015 ₩i₦₫o₩$ version):

BVG //mixed 512x512 and 256x256; config 512 crashes, 256 non-Mercator patchwork 
Bergfex OSM //1x, 2x
Carto Dark (Dark Matter) //1x, 2x, 4x, 8x
Carto Light (Positron) //1x, 2x, 4x, 8x
Clockwork Micro Aspect //512x512 only
Clockwork Micro Hillshade //512x512 only
Clockwork Micro Raw //512x512 only
Clockwork Micro Slopes //512x512 only
Clockwork Micro Streets
CyclOSM
DeepStateMap //1x, 2x; only NE semihemisphere; also .webp, but not supported
DeepStateMap Dark //1x, 2x
DeepStateMap Satellite //512x512 only; only Ukraine, Moldova, and Romania
ESRI World Boundaries & Places //ESRI tiles have highly variable available zooms
ESRI NatGeo World Map
ESRI Ocean Basemap
ESRI World Imagery
ESRI Light Gray Base
ESRI World Physical Map
ESRI World Shaded Relief
ESRI World Street Map
ESRI World Terrain Base
ESRI World Topo Map
ESRI World Transportation
F4map
Facebook Dark
Facebook Light
Freemap //A, C, K, T; Slovakia and boderlands only
Freemap Ortofotomozaika //Slovakia only
Freemap Outdoors //only Central-South Europe
GBIF Classic //1x, 2x, 4x; GBIF tiles have double² resolution, 1x is 512x512 etc.
GBIF Dark //1x, 2x, 4x
GBIF Light //1x, 2x, 4x
GBIF Middle //1x, 2x, 4x
GBIF Geyser //1x, 2x, 4x
GBIF Tuatra //1x, 2x, 4x
GBIF Violet //1x, 2x, 4x
GBIF Natural //1x, 2x, 4x
GBIF OSM Bright //1x, 2x, 4x
Geofabrik Basic Color
Geofabrik Basic Greys
Geofabrik Basic Pastel
Geofabrik German //now 512x512
Geofabrik Topo //now 512x512
Kartogiraffe //RTL scripts are rendered LTR with glyphs unmirrored
LiveUAMap //indispensable for illiterates in non-Latin scripts
MTBmap //only Europe
Mappy //only Europe and Russia at high zooms
Maptoolkit Topo
Michelin Labels (hybrid)
Michelin Light (viamichelin)
Michelin Simplified (light)
OSM Basque (euskara)
OSM Breton
OSM Occitan
OSM DE //Böhmische Dörfer endlich auf Deutsch
OSM DE Truck //only Europe, Georgia and Turkey, only past Stalingrad
OSM FR
OSM GPS Trails
OSM Humanitarian
OpenGeoFiction Carto
OpenGeoFiction CyclOGF
OpenGeoFiction Topo
OpenRailwayMap Maximum Speed
OpenRailwayMap Signalling
OpenRailwayMap Standard
OpenRiverBoatMap
OpenStreetMap PL (osmapa.pl) //RIP domain (August 2026)
Outdooractive Summer
Outdooractive Winter
Prahou na kole (Městem na kole) //Czechia only
SafeCast
Serbiamap Cyrillic
Serbiamap Latin
Sherpa Map //no hillshade backgroud, .webp not supported
Sherpa MapBox //512x512 only
Sigma Cycle
Sigma Topo
Skobbler Day //1x, 2x
Skobbler Light //1x, 2x
Skobbler Night //1x, 2x
Skobbler Outdoors //1x, 2x
Spinal Map //1x, 2x
Thunderforest Atlas //1x, 2x
Thunderforest Landscape //1x, 2x
Thunderforest Mobile Atlas //1x, 2x
Thunderforest Neighbourhood //1x, 2x
Thunderforest OpenCycleMap //1x, 2x
Thunderforest Outdoors //1x, 2x
Thunderforest Pioneer //1x, 2x
Thunderforest Transport //1x, 2x
Thunderforest Transport Dark //1x, 2x
TopPlusOpen Color
TopPlusOpen Grau
UMP-pcPL //only Europe, mainly Poland; retro style, old data outside Poland
Voyager //1x, 2x, 4x, 8x
Wanderreitkarte
WayMarkedTrails Cycling
WayMarkedTrails Hiking
WayMarkedTrails MTB
WayMarkedTrails Riding
WayMarkedTrails Skating
WayMarkedTrails Slopes
Waze //now 512x512
WhereGroup Lyrk
Yandex Labels //1x, 2x, 4x, 8x, 10x; true Mercator
Yandex Satellite //true Mercator


Excluded tile providers due to too nosy HTTP header checking:

Mapy.cz
OpenSnowMap
Stadia (including Stamen)
Tracestrack


Appendix - Size table:

Useful for determining processing and render limitations. For DimPixels and Pixels, standard density is assumed. For RawBytes, a 4-Byte (32-bit) color format like ARGB8 or A2RGB10 or R11G11B10 is assumed. Ocean tile ranges (70 % of Earth) can be optimized by hardlinking to a single ocean tile. NTFS, ZFS and XFS seem to be better than ext4 and FATs, but ReFS, btrfs and bchachefs are even better.


SI PREFIXES IN THE TABLE BELOW ARE BINARY!

z     2^z      2^(2z)  2^(z+8)  2^(2z+16)  2^(2z+20)
Zoom  DimTiles  Tiles  DimPixels  Pixels  RawBytes  Comment
  0         1      1        256      64K      256K  single tile
  1         2      4        512     256K        1M  quarterglobes/čtvrtkoule
  2         4     16          1K      1M        4M  like Blue Marble 2005
  3         8     64          2K      4M       16M  chessboard
  4        16    256          4K     16M       64M
  5        32      1K         8K     64M      256M
  6        64      4K        16K    256M        1G  may work as wallpaper
  7       128     16K        32K      1G        4G  32b viewers limit
  8       256     64K        64K      4G       16G  Tiles = DimPx; FAT32 sg
  9       512    256K       128K     16G       64G  expensive GPU VRAM
 10         1K     1M       256K     64G      256G  exFAT single dir limit
 11         2K     4M       512K    256G        1T  ext4 sg dir (no largedir)
 12         4K    16M         1M      1T        4T
 13         8K    64M         2M      4T       16T  8.3 name single dir limit
 14        16K   256M         4M     16T       64T  FAT32 total files
 15        32K     1G         8M     64T      256T 
 16        64K     4G        16M    256T        1P  NTFS sg,FAT32 per,ext4 Σ
 17       128K    16G        32M      1P        4P  OpenTopoMap
 18       256K    64G        64M      4P       16P  ÖPNVKarte & OSM DE
 19       512K   256G       128M     16P       64P  OSM Carto
 20         1M     1T       256M     64P      256P  CycloOSM & HOT & OSM FR
 21         2M     4T       512M    256P        1E  exFAT per, ThunderForest
 22         4M    16T         1G      1E        4E
 23         8M    64T         2G      4E       16E  ESRI World Imagery
 24        16M   256T         4G     16E       64E  ZFS per dir, 64b viewers
 25        32M     1P         8G     64E      256E
 26        64M     4P        16G    256E        1Z  8.3 name limit
 27       128M    16P        32G      1Z        4Z
 28       256M    64P        64G      4Z       16Z
 29       512M   256P       128G     16Z       64Z
 30         1G     1E       256G     64Z      256Z
 31         2G     4E       512G    256Z        1Y
 32         4G    16E         1T      1Y        4Y  NTFS per dir & total, XFS


Appendix - Scale table:

Actual scale depends on the latitude. Formula for the denominator in "1:m":

m=eqcircum*COS((deg+min/60+sec/(60^2))*pi/180)/(2^(zoom+8)/(100*dpi/2,54))

where:

* eqcircum      is the equatorial circumference of 40075017 m,
* deg, min, sec is the latitude in sexagesimal degrees (decimal sucks),
    + The Tropics            being at 23°26' in 2045 and 27' in 1927,
    + The (Ant)Arctic Circle being at 66°34' in 2045 and 33' in 1927,
* pi            is 3.14159265358979323846264338327950288419750...,
* zoom          is the zoom level or base 2 log of number of tiles per side,
* dpi           are dots per inch, the display or print density, assumed 96.

Meaning, 1 unit of your silly length measure on the map corresponds to m units of your silly length measure in the real world.


SI PREFIXES IN THE TABLE BELOW ARE DECIMAL!

                 1:...    23°26'    66°34'      π/12       π/6       π/4       π/3    5*π/12
 z  Dim96DPI   Equator    Tropic   ArcticC    15°lat    30°lat    45°lat    60°lat    75°lat
 0   67.733m  591.659M  542.861M  235.292M  571.498M  512.391M  418.366M  295.829M  153.133M
 1  135.467m  295.829M  271.430M  117.646M  285.749M  256.196M  209.183M  147.915M   76.566M
 2  270.933m  147.915M  135.715M   58.823M  142.875M  128.098M  104.591M   73.957M   38.283M
 3  541.867m   73.957M   67.858M   29.411M   71.437M   64.049M   52.296M   36.979M   19.142M
 4    1.084    36.979M   33.929M   14.706M   35.719M   32.024M   26.148M   18.489M    9.571M
 5    2.167    18.489M   16.964M    7.353M   17.859M   16.012M   13.074M    9.245M    4.785M
 6    4.335     9.245M    8.482M    3.676M    8.930M    8.006M    6.537M    4.622M    2.393M
 7    8.670     4.622M    4.241M    1.838M    4.465M    4.003M    3.268M    2.311M    1.196M
 8   17.340     2.311M    2.121M  919.109k    2.232M    2.002M    1.634M    1.156M  598.174k
 9   34.679     1.156M    1.060M  459.554k    1.116M    1.001M  817.121k  577.792k  299.087k
10   69.359   577.792k  530.137k  229.777k  558.104k  500.382k  408.560k  288.896k  149.543k
11  138.718   288.896k  265.069k  114.889k  279.052k  250.191k  204.280k  144.448k   74.772k
12  277.436   144.448k  132.534k   57.444k  139.523k  125.096k  102.140k   72.224k   37.386k
13  554.872    72.224k   66.267k   28.722k   69.763k   62.548k   51.070k   36.112k   18.693k
14    1.110k   36.112k   33.134k   14.361k   34.881k   31.274k   25.535k   18.056k    9.346k
15    2.219k   18.056k   16.567k    7.181k   17.441k   15.637k   12.768k    9.028k    4.673k
16    4.439k    9.028k    8.283k    3.590k    8.720k    7.818k    6.384k    4.514k    2.337k
17    8.878k    4.514k    4.143k    1.795k    4.360k    3.909k    3.192k    2.257k    1.168k
18   17.756k    2.257k    2.071k  897.567     2.180k    1.955k    1.596k    1.128k  584.154
19   35.512k    1.128k    1.035k  448.784     1.090k  977.309   797.970   564.250   292.077
20   71.024k  564.250   517.712   224.392   545.023   488.655   398.985   282.125   146.039
21  142.047k  282.125   258.856   112.196   272.512   244.327   199.492   141.062    73.019
22  284.094k  141.062   129.428    56.098   136.256   122.164    99.746    70.531    36.510
23  568.188k   70.531    64.714    28.049    68.128    61.082    49.873    35.266    18.255
24    1.136M   35.266    32.357    14.024    34.064    30.541    24.937    17.633     9.127
25    2.273M   17.633    16.179     7.012    17.032    15.270    12.468     8.816     4.564
26    4.546M    8.816     8.089     3.506     8.516     7.635     6.234     4.408     2.282
27    9.091M    4.408     4.045     1.753     4.258     3.818     3.117     2.204     1.141
28   18.182M    2.204     2.022   876.531m    2.129     1.909     1.559     1.102   570.463m
29   36.364M    1.102     1.011   438.265m    1.064   954.404m  779.267m  551.025m  285.232m
30   72.728M  551.025m  505.578m  219.133m  532.249m  477.202m  389.634m  275.513m  142.616m
31  145.456M  275.513m  252.789m  109.566m  266.125m  238.601m  194.817m  137.756m   71.308m
32  290.912M  137.756m  126.395m   54.783m  133.062m  119.300m   97.408m   68.878m   35.654m


You could print all zoom 5 tiles on a B0 paper at roughly 200 DPI as a world map poster. Given it's a crappy version of Mercator, it's only useful as a decoration.

I don't think there's a formatting option in LibreOffice Calc to display these decimal humanized values. Maybe 591M659 would be more intuitive than 591.659M, which is equivalent to 591659k, but I want to leave some decimals. Zoom 30 is deeper than 1:1 even at equator. Obviously, the axial tilt and equatorial circumference of other celestial bodies is different. Since Earth is the largest rocky planet, 16 zoom levels will generally suffice for the other 3, Galilean moons may not need more than 12, and dwarf planets may be content with 8. May not work with odd-shaped asteroids.


2024-02-12

Gudhót'n - if a Slavic language was spoken in Mordor


⚞Ⰳ⃝⚟

(lazy Unifont pixelart)


Foreword

This is an English grammar for a dialect of a mostly aposteriori semi-constructed semi-planned language Budhót'n, which was inspired by Palaeogetmanic, adapted so that it fits with Neogetmanic and OSloJ. It was supposed to be an auxlang, given an undue emphasis on foreign words, however the phonology and orthography got out of hand for that to ever function as such, and Slavic grammar isn't exactly condusive for auxlangs. This dialect of mine I call Gudhót'n, which is a reference to git gud in conlanging, and also G follows V which follows B in Glagolitic.

Furthermore, all existing documentation of Budhót'n was in Czech, which itself is a Slavic language. You couldn't learn a foreign word heavy Slavic auxlang unless you knew a Slavic natlang, at which point you will be learning Old Church Slavonic instead of this. Conlang reviwers cannot be expected to learn Czech, an undescribable gobbledygook, just to make a review, which is also a reason for this grammar in English. Also, Neogetmanic grammar is in Czech still, however that isn't an auxlang, so this grammar doubles as a English version of that too.

Given the similarity of Slavic languages, this might not be a natlang ripoff per se, there's a lot of Polish, Russian, and BCMS words. Still, in conlanging it's better to keep off your natlang's language family as much as possible, and that's why I invented the word modlanging. Were it not for prescriptivism, there would be no Palaeogetmanic, it would just be a Czech idiolect.

There is to be a website, but yuck Wordpress: https://www.budhotn.cz/

Linked open data for this abomination may or may be not subject of my thesis.

This is canonical content and pronunciation: https://www.youtube.com/watch?v=RVKbzEPLnNY


Phonology and orthography

The original Budhót'n alphabet consists of 91 letters arranged linearly with some inconsistent assignments made because of Windows Czech keyboard driver being limited to CP1250 with dead keys. This grammar is made on Linux, where this restriction doesn't hold, therefore Gudhót'n is free to use accents consistently. Windows Character Map can't even Unicode properly. Custom .XCompose may be needed.

Legacy WinLatin2 alphabet:

'  A  Á  À    Ă  Å  Ą  B  C  Ć  Ç  Cz Č  D  Ď  Đ Dth Dz Dž E  Ë  É  È  Ê  F  G  Ğ  H  Ch  İ  I  Ï  Í  Ì  Π J  K  Kh L  Ĺ  Ľ  Ł  Lh M  N  Ń  Ņ  Ň  O  Ö  Ó  Ò  Ô  Ő  P  Q  R  Ŕ  Rh Rz  Ŗ  Ř  S  Ś  Sz Ş  Š  T  Ť  Ţ  Th U  Ü  Ú  Ù  Û  Ů  Ų  Ű  V  W  X  Y  Ÿ  Ý  Z  Ż  Ź  Ž  Zh

Neogetmanic mapping (different collation order):

'  A  Á  Ǝ̇  Ȧ  Ą    Ǫ  B  C  Ć  Ċ  Č  Č̇  D  Ď  Ʒ̇  Đ  Ʒ  Ǯ  E  Ä  É  Ë  Ė  F  G  Ġ  H  Ȟ  I̋  I  Ï  Í  Į  Ẏ  J  K  Ɣ  L  Ĺ  Ľ  W  Ꝇ  M  N  Ŋ  Ṅ  Ň  O  Ǝ  Ó  Ö  Ȯ  Ǝ́  P  Q  R  Ŕ  R̂  Ṙ  Ř̇  Ř  S  Ś  Š  Ṡ  Ṧ  T  Ť  Ṫ  Ŧ  U  Ü  Ú  Ų  U̇  Ô  U̇́  Ű  V  V́  X  Y  Ÿ  Ý  Z  Ž  Ź  Ž̇  Ż

IPA:

ʔ  a  aː ɐ  ɑ  ã  oa ɔ̃  b  t͡s t͡sː t͡ʂ t͡ʃ t͡ɕ d  ɟ  d͡ʐ ð  d͡z d͡ʒ ɛ  æ  ɛː e  ɜ  f  g  ɢ  ɦ  x  iː ɪ  i  ɪː ĩ  ɥ  j  k  ɣ  l  lː ʎ  w  ɬ  m  n  ŋ  ɴ  ɲ  o  ə  oː ø  ɔ  əː p  q  r  rː ɹ  ʐ̝  ʀ̝  r̝  s  sː ʃ  ʂ  ɕ  t  c  ʈ  θ  ʊ  y  uː ũ  ɵ  uo ɵː yː v  vː ks ɨ  ʏ  ɨː z  ʒ  zː ʑ  ʐ

BuSloJ flattening:

'  A  Á  A  A  A  OA A  B  C  Č  Č  Č  Č  D  Ď  Ǯ  Ʒ  Ʒ  Ǯ  E  E  É  E  E  F  G  G  H  H  Í  I  I  Í  I  I  J  K  H  L  Ĺ  Ľ  V  L  M  N  N  N  Ň  O  Y  Ó  Y  O  Ý  P  K  R  Ŕ  R  Ř  Ř  Ř  S  S  Š  Š  Š  T  Ť  Ť  C  U  Y  Ú  U  U  UO Ú  Y  V  V  KS I  Y  Í  Z  Ž  Z  Ž  Ž

GeSeL correspondence:

'  A  A  A  A  A  A  A  B  C  J  J  J  J  D  D  J  C  C  J  A  A  A  I  E  F  G  G  H  H  I  I  I  I  I  I  Y  K  G  L  L  L  W  L  M  N  N  N  N  O  E  O  E  O  E  P  Q  R  R  R  J  J  J  S  S  X  X  X  T  T  T  C  U  I  U  U  U  U  U  I  V  V  KS I  I  I  Z  X  Z  X  X

Neogetmanic table by accent:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Ʒ Ǝ 
Á   Ć   É       Í     Ĺ     Ó     Ŕ Ś   Ú V́     Ý Ź   Ǝ́ 
    Č Ď       Ȟ       Ľ   Ň       Ř Š Ť           Ž Ǯ   
    Č̇                             Ṙ́ Ṧ   U̇́         Ž̇     
Ȧ   Ċ   Ė   Ġ             Ṅ Ȯ     Ṙ Ṡ Ṫ U̇       Ẏ Ż Ʒ̇   
                           Ô     R̂                     
Ä       Ë       Ï           Ö           Ü       Ÿ       
                I̋           Ő           Ű               
Ą     Đ     Ɣ   Į     Ꝇ   Ŋ Ǫ         Ŧ Ų               


Accents work as follows:

Sign  Description  Effect                 Letters                    Decomposition
´  Acute          Lengthtening            Á Ć É Í Ĺ Ó Ŕ Ś Ú V́ Ý Ź Ǝ́  doubling
 ̇́  Acute and dot  Alternate lenghtening   U̇́                          doubling
ˇ  Caron          Middle palatalization   Č Ď Ȟ Ľ Ň Ř Š Ť Ž Ǯ        cz dj ch lj nj
 ̌̇  Caron and dot  Soft* palatalization    Č̇ Ř̇ Ṧ Ž̇ 
˙  Dot (vowel)     Alternate               Ȧ Ė Ȯ U̇ Ẏ
˙  Dot (consonant) Hard palatalization     Ċ Ġ Ṅ Ṙ Ṡ Ṫ Ż Ʒ̇
^  Circumflex     Velarization            Â Ô R̂
¨  Umlaut         Vowel offset            Ä Ë Ï Ö Ü Ÿ
˝  Acute umlaut   Offset vowel length     I̋ Ő Ű    
˛  Tail           Short nasalization      Ą Į Ŋ Ǫ Ų
-  Strikethru     Eth and Thorn           Đ Ŧ
   Variation      Ghain and Llan          Ɣ Ꝇ

* except Ř̇, see below

This system is modular, in fact it's a 2D orthography, just like Brahmic abugidas or vocalized Arabic, but due to the sheer amount of legacy data, upwards modularity is restricted to Neogetmanic. It seems to work better than IPA for me. All script conversions as described in Neogetmanic hold here too. There's an original mapping to cyrillic, but mine better fits the Neogetmanic <-> DOSloJ span.

There had to be made sereval letters which were not originally in Neogetmanic. This is how crazy the phonology is. Namely the angled candabindu series and the exclamation point letters. As it turns out, Polish Ć Ś Ź is not the same as Czech Č Š Ž, despite them sounding way too soft to other Slavs. Both dot, caron, and acute were taken, so I came up with combining caron and dot. There is precomposed Ṧ in Unicode, good luck with generalizing that to the rest of the letters, and even better luck typing this with Windows' ancient keyboard driver. The other oddities are Ř̇ and U̇́. Ř̇ is logically a long Polish Rz, however it can also be long Czech Ř, which I write Ř́, or Getmanian Ř, which I write Ř̇ or Ř̇́ when long. In fact, Polish Rz is actually Ż in place where there was a sort of R sound, yet the orthography claims to be fully phonetic. U̇́ is supposed to be the Black Speech long Û, the short Û being written U̇, which is Czech Ů in Neogetmanic. This comes to the subtitle of a Slavic language spoken in Mordor.

There are some "long consonants", in the old wrong IPA, Ř̇ is transcribed the same as ̇´R and Ṫ is transcribed the same as Ť´ :

CC = Ć (Ć), RR = Ŕ (Ŕ), RzRz ~ Ř̇ (Ŗ), SS = Ś (Ś), ŤŤ ~ Ṫ (Ţ), VV = V́ (W)

For actual auxlang application purposes, a flattening into OSloJ called BuSLoJ is available. BuSloJ can further be decomposed into mainline OSLoJ and DOSloJ. BuSloJ isn't directly compatible with Visual OSloJ, as it puts the palatalization on the consonant instead of the vowel. There is a "simplified" original Budhót'n orthography, but not nearly enough. You can't have an auxlang with more than 60 letter long alphabet, unless it was made for increasing the entertaining value of the Phonology section of Conlang Critic. Whilst Palaeogetmanic had an undue amount of letters, they were all inverse contraptions.

Phonology in Gudhót'n remains generally unchanged from Budhót'n aside from me pronouncing Rs and Řs like [ʀ] instead of [r] and Ls like [ʟ] instead of [l]. Nonetheless, the official "IPA" is completely wrong because of a crappy keyboard layout, so I provide a more accurate one, though not completely stable as I still figure out what was meant. There are no specific orthography rules, everything is written phonetically, however some supposed phonemes are indistinguishible to me. This allows automatic generation of IPA with sed scripts, however because Google Sheets still can't λ, 128 nested SUBSTITUTEs have to be used, which doesn't work in LibreOffice. Just use AWK, sed, tr, and cut on TSVs.

There are some funny names for punctuation characters, inspired by INTERCAL and my attempt at translation, but let's not worry about them now.


Morphology

Standard Slavic parts of speech are followed.


Nouns

There are all the typical 3 genders, masculine, feminine, and neuter. Based on the nominative, genitive and accusative singular, each of them can also be animate (acc=gen), inanimate (acc=nom), ADHD (all distinct) or zombie (all same). There is no gender inclusivity in Budhót'n and Gudhót'n, only a nonbinary indication particle, see Neogetmanic for true "naplěvať" gender.

There is no dual number, fortunately.

Ending determines the declination paradigma, however it seems random. Furthermore, the endings change depending on the suffix. Prefixes have no impact on declination. Both prefixes and suffixes are ripped off from Czech and Slovak.


Masculine

   god   lock   guest  castle  youngman  forest  people   mate

1
2
3
4
5
6
7

1
2
3
4
5
6
7


Feminine

  goddess   power  girl  pain  woman  machine  kingdom

1
2
3
4
5
6
7

1
2
3
4
5
6
7


Neuter

  army   beer   chicken   sea

1
2
3
4
5
6
7

1
2
3
4
5
6
7


Adjectives

In addition to grading, adjectives also have gender. Luckily, there aren't gazillions of declinations.

There are 2 types of gradation. The older one from way less Slavic times of Budhót'n consists of prepending prefixes (oddly reminiscent of Icelandic), the new one consists of a suffix and a prefix, with the same irregularities.

  masculine       feminine   -ness        neuter

1
2
3
4
5
6
7

1
2
3
4
5
6
7



Pronouns

Slavic pronouns are more complex than it seems. There's about 200 of them belonging to different classes, and just like nouns, they have genders and declinations, in addition to the usual person.

A gender neutral pronoun for genders not known at the compile time is missing, just like in Czech. There is however a particle for nonbinarity. Neogetmanic has onǝ and ěǒ.

To complicate matters further, all 4 politeness levels have distinct pronouns, a feauture of Japanese and Korean no one should ever copy. Politeness is for subs anyway.

Personal

Since regular English is insufficient to differentiate plural and genders, some cringe slang terms were used.

   I   U   he   she   it   we  y'all   dem boiz  dem grlz  dem thangz

1
2
3
4
5
6
7

1
2
3
4
5
6
7

1
2
3
4
5
6
7

1
2
3
4
5
6
7


Possesive

   mine  ur  his  hers  its   our   yer  boiz'  grlz'  thangz'

1
2
3
4
5
6
7

1
2
3
4
5
6
7

1
2
3
4
5
6
7

1
2
3
4
5
6
7


Query

There is no table of corellatives like in Esperanto. There are prefixes ňe- for some-, ňi- for no-, gde- for -ever, -koꝇiv for any-. 

   who   what     which  which  whose

1
2
3
4
5
6
7

1
2
3
4
5
6
7


Non-declining adverbial pronouns:

where  when  how  whence  whither



Pointing

   dat boi   dat grl   dat thang    that

1
2
3
4
5
6
7

1
2
3
4
5
6
7



Quantificatiors

   each   every  all   some   one   alone   same

1
2
3
4
5
6
7

1
2
3
4
5
6
7



Numbers


There is a special modification of the long system, in that it uses it's own numbers instead of Latin. So instead of billion you have dvaljon, and so on and so on.


Suffixes for fraction, multiple, grouping.

SI prefixes are adapted, including the latest ronna and quetta.



Verbs


There are 5 tenses: legendary, past, present, future, and apocalyptical. Legandary and apocalyptical tenses are used for events that didn't or won't happen, just like in many religious scriptures. For more Atheist applications, they can be used for very remote past and future, like the Big Bang or the Heath Death of the Universe.

The endings are strictly concatenative, there is no stem change like in Czech. The only exception is the verb to be. Determinig a stem from dictionary is however not as straightforward.

   legendary   past   present    future   apocalyptical

1
2
3

1
2
3


Informal conjugation is available, which is a feature imported from Finnish.


   legendary   past   present    future   apocalyptical

1
2
3

1
2
3


There are verbal prefixes, but they seem to work same as in Czech.


Adverbs

These were undocumented until I mined the painstakingly hand-input data. As per author's comments, there seems to be a class that is indistinguishible from znamenje type nouns, and another class that is indistinguishible from neuter adjectives. Also many preposition and noun sequences are written without the space, in Czech syntax classes this is called adverbial determination (příslovečné určení).



Prepositions

There are some apriori prepositions.


Conjunctions

These parts of speech are actually apriori, or stolen from languages I don't know.


Particles

This category is considered the "other" or "miscelaneous". There are multiple special syntax elements.


Interjections

They can be appended with an ending to form a noun, adjective, verb, or adverb. Bare interjections are generally undocumented and made on the spot with the broad phoneme repertoire.

Some phrasal greetings are considered interjections. 


Syntax

Except for particles, the syntax in Budhót'n and Gudhót'n is a complete ripoff of Czech, because it wasn't documented, so the natlang stepped in.


There are many phrasal sentences written as a single long word.


Lexicon

There are 4 levels of politeness: literary, colloquial, unliterary, and expressive. In addition to that, there are some 3k archaisms I personally collected from the old website. These names are taken from Czech vocabulary layers, but should be thought of as being nondescript steps. The literary level consists of early words, as it's the original level.

There are multiple packages mostly copied from other dictionaries, each having its own global politeness level. Altogether this language is supposed to have around 500k words. Quite a lot for a conlang made by 2 people. There is no point in shoving words if your application doesn't use them. Google Sheets just get laggy.

Punctuation and letters - literary, 200

Basic words - all 4 levels, 4*10k

Phrases - literary, 1k

Foreign words - literary, 20k of projected 100k

Unforeign words - impromptu literary additions, 5k

Getmanisms - unliterary, also some impromptu, 3k

Czech 2.0 - colloquial, 10k of projected 30k

Conversation mini-dictionaries - archaic, 3k * 12 = 36k

Vulgarisms - expressive, 500

GeSeLisms - unliterary, projected 4*4k

Autosteal transcription - unliterary, projected 50k