TAHER
1991 · C:\TAHER\TAHER.COM
Loading TAHER.COM, 3 KB
A calligraphy splash screen for a lab physician’s software, with his name, Taher Ibrahim El-Sarafy, in Arabic.
The story
This splash screen was a gift on top of a paid job. It draws the doctor's name in red and silver Arabic calligraphy: 901 pen strokes, played by the same tiny player Yasser wrote for the Port Said Governorate. His own signature rides along inside, folded so no text search can find it, and unfolds when the program runs.
A name, written by hand in bytes
Dr. Taher Ibrahim El-Sarafy hired Yasser to write the software that printed his lab's results. Yasser added something nobody asked for: a splash screen with the doctor's name in calligraphy.
طاهر ابراهيم الصرفي
The name is not a picture file. It is 901 strokes in 2,109 bytes of script, drawn by the same tiny player he wrote for the Port Said Governorate screen. Each stroke is a thin line of pixels. Each pixel gets a twin 2 to the right and 2 down, so the letters stand out in red and silver. The pen starts at the right and walks left 297 times, the way Arabic is written. Drag the pen back and forth, or run it.
901 strokes, 2,109 bytes of script, one name.
Two new words
For this job his player learned two commands. 88h clears the screen for the next picture. z ends the show.
Both start with the same short pause: 4,096 calls to DOS's “is a key waiting?”, a beat for the eye before the screen changes. Then 88h sets the video mode again. That wipes the screen, like clearing a canvas, and the player reads the next picture's header. z goes back to text mode and prints his name. TAHER uses one picture and a z. In the same year he used the same player for a 15-picture advertisement for a Port Said computer center: 14 times 88h, then z. Play both.
K E M Y A M Software Corp., <c>1991 YASSER MOHAMED ALI.
- z
TAHER.COM draws one picture, then z: a short wait, text mode, and his name.
The two programs share their first 241 bytes: the player, the new commands and the signature below. One engine, two scripts, like one slide-show app opening two different decks.
His signature, folded
Before it draws anything, TAHER runs 19 bytes of code that unfold his name from 65 stored bytes. Each byte, minus a key that starts at 4 and grows by one, becomes a letter.
Search the file for YASSER and you find nothing: on disk the name reads 4F 25 4B 27 55 29. Only in memory, as the program starts, do the bytes turn into “K E M Y A M Software Corp., <c>1991 YASSER MOHAMED ALI.” DOS prints them when the show ends. This is obfuscation: a string folded so a text search cannot see it, the way a modern app hides strings in its compiled code. Step through it, byte by byte.
- 4F−4K
- 25−5·
- 4B−6E
- 27−7·
- 55−8M
- 29−9·
- 63−10Y
- 2B−11·
- 4D−12A
- 2D−13·
- 5B−14M
- 2F−15·
- 30−16·
- 31−17·
- 65−18S
- 82−19o
- 7A−20f
- 89−21t
- 8D−22w
- 78−23a
- 8A−24r
- 7E−25e
- 3A−26·
- 3B−27·
- 5F−28C
- 8C−29o
- 90−30r
- 8F−31p
- 4E−32.
- 4D−33,
- 2F−34CR
- 2D−35LF
- 31−36CR
- 2F−37LF
- 46−38·
- 63−39<
- 8B−40c
- 67−41>
- 5B−421
- 64−439
- 65−449
- 5E−451
- 4E−46·
- 88−47Y
- 71−48A
- 84−49S
- 85−50S
- 78−51E
- 86−52R
- 55−53·
- 83−54M
- 86−55O
- 80−56H
- 7A−57A
- 87−58M
- 80−59E
- 80−60D
- 5D−61·
- 7F−62A
- 8B−63L
- 89−64I
- 6F−65.
- 4F−66CR
- 4D−67LF
- 68−68$
K E M Y A M Software Corp., <c>1991 YASSER MOHAMED ALI.
- 0100
mov si,01ABh; the folded name - 0103
mov al,4; the first key - 0105
mov cx,41h; 65 bytes - 0108next:
mov ah,[si]; a stored byte - 010A
sub ah,al; minus the key - 010C
mov [si],ah; the letter, in place - 010E
inc si; next byte - 010F
inc al; next key - 0111
loop next; 65 times - 0113
mov si,01ECh; then the script
-
char *s = name;// folded -
char key = 4; -
for (int n = 65; n; n--) { -
*s -= key;// minus key -
s++; -
key++; -
}
- SI
- 01EBh byte 65 of 65
- AL
- 68 the key
- AH
- 24h now a letter
- CX
- 1 bytes left
Done: 65 bytes, one signature. It waits in memory until the show ends, then DOS prints it.
| 1991 to 1993 | 2026 | Why it is the same idea |
|---|---|---|
| A calligraphy splash and a 15-picture advert on one player | One slide-show app, many decks | The engine is written once; every new job is just a new file. |
| A name stored as bytes minus 4, 5, 6 and on | A string obfuscated in a compiled app | Text that a search cannot find, until the program runs. |
| One command: wait, set the video mode, read the next header | Clear the canvas and load the next slide | A fresh screen for every picture. |
For engineers: the new commands
mov dl,[si] / inc si ; the next script byte, as in SCREEN.COM cmp dl,'x' ... cmp dl,'y' ; the same x, w and y cmp dl,'z' / je 0194h ; z: the end cmp dl,88h / je 0189h ; 88h: the next picture mov dh,0 / add dx,di ... ; anything else is a stroke mov cx,1000h ; 4,096 times: mov ah,0Bh / int 21h / loop 018Ch ; is a key waiting? jmp 0116h ; mode 10h again: a clean screen, then the next header mov cx,1000h / ... loop 0197h ; the same pause mov ax,3 / int 10h ; text mode mov ah,9 / mov dx,01ABh / int 21h ; print the unfolded signature int 20h ; back to DOS His x and w moves are swapped in the code itself, inc bx for x and dec bx for w, but the header writes over both before the first stroke, so the pen still walks left. See how the header rewrites the player on the governorate screen's page.
Every Byte of TAHER.COM
Each square is one byte of the program in memory, colored by what it is. Tap a part to open it in the full map, down to the single instruction.
2,050 bytes on the disk, packed by DIET
2,346 bytes in memory, 2,346 of them his own code
- Picture90%
- Code7.3%
- Text2.8%
- Empty space<0.1%
The biggest parts, his first
- Script: the name2,109 bytesYasser
- Command decoder and stroke drawer72 bytesYasser
- Folded signature65 bytesYasser
- Header reader46 bytesYasser
- End (z)23 bytesYasser
- Credit decoder19 bytesYasser
Mapped by hand from the program’s own bytes.