Skip to content

Compare the two sides

The A side has a small dictionary. Each word does a small job, so one idea needs many words. The B side has a large dictionary. Its idioms do a full job, so one idea often fits in one line.

Size of each full language

A cassette tape with a handwritten label: "A Side. Assembly - the first language of the machine."

A Assembly

Intel 8086, 16-bit real mode, written for the NASM assembler (the dialect of the retro game)

  • 81 instructions in the original 8086 list
    The list puts some families on one line, for example all conditional jumps. Source: Wikipedia, List of x86 instructions (retrieved 2026-09-27).
  • 118 written forms of those instructions
    This count includes each conditional jump and its synonyms, for example JE and JZ. Source: Counted from the same Wikipedia table.
  • 14 register names
    8 general registers, 4 segment registers, IP and FLAGS. Source: Intel 8086 register set.
  • 1,000+ instruction names in modern x86-64
    Each new processor generation added words. We do not need them for the game. Source: Reviewer knowledge, not counted. This number is an estimate, not a count.
A cassette tape with a handwritten label: "B Side. Fortran, the language that speaks maths."

B Fortran

Modern Fortran (2008 to 2023 standards), free-form text, built with gfortran

Our first words, by part of speech

The bars count the words in this site's dictionary, not the full languages.

Verb
51
17
Noun
23
6
Adjective
2
15
Adverb
1
1
Idiom
7
32
Grammar mark
5
18
Note to the translator
12
10
A: Assembly B: Fortran

Strengths, segment by segment

SegmentA side: AssemblyB side: Fortran
Keeping values
How do you tell the machine to remember a number?
  • You choose the exact place for each value: a register inside the processor, or an address in memory.
  • You control every byte. A complete DOS program can be smaller than 1 KB.
  • A segment register (DS, ES, CS, SS) selects a window of 64 KB. A small .COM program keeps all four on one value, so it lives in one window.
26 words →
  • Each name has a type, for example INTEGER or REAL. The compiler stops many mistakes before the program runs.
  • A list or a table of values (an array) is one noun, with a name and a shape.
19 words →
Doing arithmetic
How do you tell the machine to calculate?
  • Each verb is one exact processor step. You know the cost of each step.
  • Whole-number and fixed-point arithmetic is very fast.
  • A table in memory replaces a slow verb. MUL by 320 costs about 120 cycles on the 8086. One indexed MOV from a table of row starts costs about 20. The B side makes the table.
  • A byte register wraps at 256 by itself: add al, 64 turns a sine into a cosine. The A side wraps for free.
23 words →
  • You write the formula as maths: v = v + a*dt.
  • Fortran has many ready-made maths idioms, for example SQRT, SIN and ATAN2.
  • Fortran can do the same whole-number steps as the 8086: SHIFTA keeps the sign in a shift, and IAND cuts a value to one byte. Thus, the laboratory can repeat the A-side arithmetic exactly and compare the answers.
19 words →
Making choices and repeating
How do you say "if" and "again"?
  • The grammar is small and clear: compare two values, then jump to a label.
  • You see each branch that the processor takes.
13 words →
  • Choices and loops are blocks: IF ... END IF, SELECT CASE, DO ... END DO. The shape of the text shows the logic.
13 words →
Working with many values
How do you do one thing to a long list of values?
  • String verbs with the REP adverb copy or fill memory very fast: one sentence, done CX times.
  • This is the best tool to move screen pixels in a retro game.
  • The lander does not search for the ground. It reads one byte: the height of the ground in the column of the ship. The B side makes that table.
8 words →
  • One line does arithmetic on a full array: x = x + v*dt.
  • Idioms such as SUM, MAXVAL and MATMUL do a full job in one word.
  • When a routine has few inputs, the laboratory checks all of them in one line: count(got /= expected). The game checks 256 of 256 angles and 4096 of 4096 points. A decimal counter has 10,000 values, and the check can run all of them.
15 words →
Organizing a program
How do you divide a long text into parts with names?
  • Labels and macros give names to groups of instructions.
  • One routine serves the game and the test. The test runs the same words as the game, so the check tests the real code.
11 words →
  • Modules, subroutines, functions and INTENT keep large programs clear.
  • The compiler makes sure that each call matches the procedure.
  • Each table that the B side makes gets a wrong twin: the same program with one wrong word or value. The build requires the check to fail on the twin, so the check itself is tested.
16 words →
Showing text and reading keys
How does the program talk to the person at the keyboard?
  • You call BIOS and DOS services directly: show text, read a key, change the screen mode.
8 words →
  • PRINT and WRITE format numbers for you.
  • The same text works on Linux, macOS and Windows.
  • The format I4.4 keeps the leading zeros for a countdown, for example fuel 0042. The format I0 removes them for a score. The B side writes the number that the A side must show.
11 words →
Controlling the hardware
How do you talk to the screen, the keyboard chip and the clock directly?
  • This is the native tongue of the processor. Ports, interrupts and screen memory are all in reach.
  • It is the best tool to make a retro game fast and responsive.
  • The helper chips of the PC speak through ports, and the order of the writes is the protocol. To play a note: the command byte B6h to port 43h, then the two bytes of the divisor to port 42h, then bits 0 and 1 of port 61h. A wrong order gives a wrong note or silence.
12 words →
  • Fortran does not depend on one machine. The same text works on many processors.
  • Fortran makes the numbers that the hardware needs, before the game runs. For sound, the divisor of each note is nint(1193182.0_real64 / f). The B side also reports the error of each note in cents.
6 words →