Elara S. Novikova
Iskra-226

ARTIL

Артиллерийская дуэль

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.

sectors
20-21
source lines
31
angle
1-89 degrees
charge
10-99
A shot at 30 degrees with power 40 falls 143 short, and the program says by how much before it asks for the next angle.
A shot at 30 degrees with power 40 falls 143 short, and the program says by how much before it asks for the next angle.

Run this disk · The image, 256,256 bytes

Three reasons it will not port

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.

sin(2a) without a sine

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.

Why it belongs on this machine

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.

Not a find

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.

What I checked

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 this does not show

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.

Where to read more

The source

ARTIL.bas, 31 lines, assembled onto the image with iskra_asm.py

31 lines of BASIC
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

Back to Iskra-226