Артиллерийская дуэль
The artillery duel, a BASIC mechanic older than GORILLA.BAS, 1991
This one began as a question about the monkeys. GORILLA.BAS shipped with MS-DOS 5.0 in 1991, two gorillas lobbing bananas over a skyline, and it does not come across to this machine for three separate reasons. What does come across is the mechanic underneath, which is older than the gorillas: angle, charge, short, over, correct.

Run this disk · The image, 256,256 bytes
Dialect first. GORILLA.BAS is QBasic with SUB procedures and no line numbers, and the Iskra format knows only line-numbered, tokenized statements. Then graphics: SCREEN 9 at EGA 640 by 350, with LINE, CIRCLE and PAINT. In the dialect I have decoded, the Iskra-226 is a pure character terminal and not one graphics atom is attested. Then the runtime: sound through PLAY, timers, and floating point trigonometry with SIN and COS, for which no atom values are known. Any one of those closes the question on its own. Together they close it three times over.
The range of a ballistic arc goes with the sine of twice the angle, and there is no sine here. ARTIL approximates it with a triangle: f is 90 minus the absolute value of 90 minus twice the angle, and the range is the charge squared, times f, over 900. That keeps the three properties that make artillery behave like artillery: maximum at 45 degrees, symmetric falloff to either side, and range rising with the square of the charge. The absolute value comes out of two IF branches, because ABS is not attested either. Thirty-one lines, and the arc is in the arithmetic.
The artillery duel is close to the oldest interactive form a computer has. You hold two numbers, the machine holds one it will not tell you, and you close the gap by being wrong in a useful direction. Doing it here means doing it in Russian, in a dialect built for wage runs, on a screen that can only print lines. НЕДОЛЕТ and ПЕРЕЛЕТ, short and over, are the words a gunner would use, and the machine reports them in the same flat voice it uses for a payroll total. Nothing on the screen moves. The correction happens in your head, which is where it happened anyway.
Nothing here was excavated. I wrote ARTIL in 2026 and assembled it with an assembler that did not exist before this project. The mechanic is common property, the code is new, and no Soviet games disk has ever been recovered. What is authentic is the image around the program: header in sector 0, one catalog entry, the body from sector 20, and a program name cut to eight characters because the original catalog format allows no more.
Against a target at 250: 45 deg / 30 gives НЕДОЛЕТ НА 160, 45 deg / 60 gives ПЕРЕЛЕТ НА 110, 45 deg / 50 gives *** ПОПАДАНИЕ! *** ВЫСТРЕЛОВ: 3. Bracketing, the way artillery does it: short, long, middle.
What is tested is the emulator, not the hardware. The target sits at a fixed 250 and never moves, because the dialect's random number atom is undecoded and ARTIL does not carry the substitute generator the classics pack uses. There is no wind, no second gun firing back, and the hit window is a flat 15 units to either side, so the third shot in the transcript above is repeatable rather than lucky.
ARTIL.bas, 31 lines, assembled onto the image with iskra_asm.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
10 REM ARTILLERIA 20 PRINT "*** АРТИЛЛЕРИЙСКАЯ ДУЭЛЬ ***" 30 PRINT "ЦЕЛЬ ГДЕ-ТО ВПЕРЕДИ. ПРИСТРЕЛЯЙТЕСЬ!" 40 V01 = 250 50 V09 = 0 70 PRINT "УГОЛ (1-89)" 80 INPUT V02 90 PRINT "СИЛА (10-99)" 100 INPUT V03 110 V09 = V09 + 1 120 V04 = V02 * 2 130 V05 = 90 - V04 140 IF V05 > 0 GOTO 160 150 V05 = 0 - V05 160 V06 = 90 - V05 170 V07 = V03 * V03 180 V08 = V07 * V06 190 V08 = V08 / 900 200 V10 = V08 - V01 210 V11 = V10 220 IF V11 > 0 GOTO 240 230 V11 = 0 - V11 240 IF V11 < 15 GOTO 300 250 IF V10 > 0 GOTO 280 260 PRINT "НЕДОЛЕТ НА";V11 270 GOTO 70 280 PRINT "ПЕРЕЛЕТ НА";V11 290 GOTO 70 300 PRINT "*** ПОПАДАНИЕ! ***" 310 PRINT "ВЫСТРЕЛОВ:";V09 320 END