Full ZX-81 Chess in 1K

David Horne angol programozó írt Sinclair ZX81-re egy sakk játékot, aminek dokumentált forrását 1983 februárban a “Your Computer” című újságban publikálta. Ez a cikk most elérhető az internet széles tömegei számára is. Hogy miért érdekes mindez?

Az 1981-ben megjelent ZX81 mindössze 1 kilobyte, azaz 1024 byte RAM-ot tartalmazott. Vigyázat! Ez nem azonos az 1982-ben megjelent “Spectrum” (Speccy) géppel, annak az elődje. Ráadásul ebből mindösszesen 672 byte volt a felhasználható memória:

The base system as supplied had 1 KB (KB) of RAM. This RAM was used to hold the computer’s system variables, the screen image, and any programs and data. The screen was text only, 32 characters wide by 24 high. Blocky graphics with a resolution of 64 by 48 pixels were possible by the use of the PLOT command, which selected among a set of 16 graphics characters. — Wikipedia

Az alábbi kép bemutatja a karaktereket, azt hiszem ez sok korai tulajdonosnak fogja megdobogtatni a szívét:

David Horne tehát 672 byte-ban írt egy (primitív ugyan, de létező) AI-vel rendelkező sakk programot 672 byte-on. Aki nem ismerné ennek fogalmát, az úgy képzelje el, kis közelítéssel, hogy egy betű egy szövegben egy byte. Természetesen “gépi kódban” írta a programot, így egy utasítás gyakorlatilag elfér egy byte-on, aztán mellé még az argumentumok egy másikon, mondjuk számoljunk kettővel utasításonként. (Pontosan nem tudom, de ez most nem is annyira érdekes.)

Ha jól látom, grafikát nem tartalmaz, betűk reprezentálják az egyes figurákat a sakktáblán, tehát gyakorlatilag a játék logikájára ment el a memória nagy része, ami gépi nyelven így néz ki, ez a fenti játék kódjának egy részlete:

Azért is érdekes a dolog, mert annak idején (#regenmindenjobbvolt) az ilyen típusú kötöttségek még kikényszerítették a programozói zsenialitást. Manapság pedig hányan érezzük nap mint nap azt, hogy nem elég a 4 giga RAM? Értsd: 4 x 1073741824, azaz (baze, nem fért bele az asztalon levő számológépembe, megpróbálom egy másikkal, baze, abba se fért bele, megpróbálom most a PCalc-kal RPN módban) 4 294 967 296 byte.

Tehát 1 024 vs 4 294 967 296. Ez olyan kicsi százaléka a 4 gigának, hogy a számológép már nem is írja ki a nullákat! Csaknem 29 év telt el egyébként 1981 óta.

David játékprogramjának forrása és hozzá tartozó kommentárjai elolvashatóak ezen a címen. Remek cucc.

Ez a minél rövidebb sakkprogram persze a mai napig pallérozza a programozók elméjét, ami annak idején kötöttség volt, ma inkább kihívás. Itt van például a Toledo Nanochess, aminek C forrását (!) mutatjuk be, de érdemes kipróbálni mindezt JavaScriptben is:

/**************************************************************************\
| Toledo Nanochess (c) Copyright 2009 Oscar Toledo G. All rights reserved  |
| 1257 non-blank characters. Evolution from my winning IOCCC 2005 entry.   |
| o Use D2D4 algebraic style for movements.  biyubi@gmail.com  Nov/20/2009 |
| o On promotion add a number for final piece (3=N, 4=B, 5=R, 6=Q)         |
| o Press Enter alone for computer to play.                                |
| o Full legal chess moves.                     http://nanochess.110mb.com |
| o Remove these comments to get 1326 bytes source code (*NIX end-of-line) |
\**************************************************************************/
char*l="ustvrtsuqqqqqqqqyyyyyyyy}{|~z|{}"
"   76Lsabcddcba .pknbrq  PKNBRQ ?A6J57IKJT576,+-48HLSU";
#define F getchar()&z
#define v X(0,0,0,21,
#define Z while(
#define _ ;if(
#define P return--G,y^=8,
B,i,y,u,b,I[411],*G=I,x=10,z=15,M=1e4;X(w,c,h,e,S,s){int t,o,L,E,d,O=e,N=-M*M,K
=78-h<=h&&v 0,0)>M;do{_ o=I[
p=O]){q=o&z^y _ q<7){A=q--&2?8:4;C=o-9&z?q["& .$  "]:42;do{r=I[p+=C[l]-64]_!w|p
==w){g=q|p+a-S?0:I+S _!r&(q|A<3||g)||(r+1&z^y)>9&&q|A>2){_ m=!(r-2&7))P G[1]=O,
K;J=n=o&z;E=I[p-a]&z;t=q|E-7?n:(n+=2,6^y);Z n<=t){L=r?l[r&7]*9-189-h-q:0 _ s)L
+=(1-q?l[p/x+5]-l[O/x+5]+l[p%x+6]*-~!q-l[O%x+6]+o/16*8:!!m*9)+(q?0:!(I[p-1]^n)+
!(I[p+1]^n)+l[n&7]*9-386+!!g*99+(A<2))+!(E^y^9)_ s>h||1z|d){p[I]=n,O
[I]=m?*g=*m,*m=0:g?*g=0:0;L-=X(s>h|d?0:p,L-N,h+1,G[1],J=q|A>1?0:p,s)_!(h||s-1|B
-O|i-n|p-b|L<-M))P y^=8,u=J;J=q-1|A<7||m||!s|d|r|oM;O[I]=o;p[I]=r;m?
*m=*g,*g=0:g?*g=9^y:0;}_ L>N){*G=O _ s>1){_ h&&c-L<0)P L _!h)i=n,B=O,b=p;}N=L;}
n+=J||(g=I+p,m=p2||(p=O,q|A>2|o>z&
!r&&++C*--A));}}}Z++O>98?O=20:e-O);P N+M*M&&N>-K+1924|d?N:0;}main(){Z++B<121)*G
++=B/x%x<2|B%x<2?7:B/x&4?0:*l++&31;Z B=19){Z B++<99)putchar(B%x?l[B[I]|16]:x)_
x-(B=F)){i=I[B+=(x-F)*x]&z;b=F;b+=(x-F)*x;Z x-(*G=F))i=*G^8^y;}else v u,5);v u,
1);}}

Szevasztok. 🙂

Manapság pedig mire használatos leginkább a szerencsétlen ZX81? 🙁

A Wizard has turned you into a 672 byte chess AI. Is this awesome? Y / N

46 hozzászólás

TBS

Találkoztam vele, akkoriban, tök véletlenül, fénymásolt lapon, és “játszottam” is vele párszor. (Most sem tudok sakkozni, hát még akkor! 😀 ) Egyszerűbb volt begépelni, mint akármilyen magnóval szívni. 😀

Sajnos a gép unokatesómé volt, nem az enyém…

cSuwwi

A C-ben írt program forrása tömörítve van, azért ennyi, sokkal hosszabb az eredeti amiről packolták. De a Spektrum kódja az igen, itt még volt tudás. Régi szép idők, amikor még a CoV-ban teljes forráskódok voltak, és ha akartál játszani, begépelted 😀

napos2600

a végén a kép priceless! 😉 várom mikor fogsz összefutni egy letört botkormányos enterprise 128-cal, de nem ám floppyval! 😀

klarky

Én arra határozottan emlékszem, hogy anno azt mondták, azért olyan picik, jók és gyorsak az orosz tömörítő programok, mert ugye ők nem fértek hozzá akármilyen hardware-hez, és ami volt azzal kellett megoldani a feladatokat.

Persze ez agyalásra ösztökélte őket, nem garázdálkodhattak kedvükre.

Kalman

Csak annyit, hogy a kepen lathato gep ZX 81 es nem Speccy…

Bereczki Zoltán

Szerintem olyan gép, hogy “Spectrum ZX81” nem létezett. Volt a Sinclair ZX81, és annak az utódja a ZX Spectrum. Utóbbinak már 16KB romja és 16 KB ramja volt.

ant

Bocs, lenne egy off-topic kérdésem: olyan blogmotort (vagy site-ot) keresek, ami letisztult és könnyen kezelhető: egy-két klikk a publikálás, nincs html szerkesztés, nincs könyvtárszerkezet, talán még a kommentelés sem szükséges. és még elfogadható megjelenést generál. A soup.io (pl: http://minima.soup.io ) majdnem tökéletes megoldás, de annál egy hajszállal több lehetőség kellene. Tudtok ilyet? Előre is köszi mindenkinek!

airween

Az utolsó képen az ajtókitámasztásért minimum kötél járna 🙂
Egyébként meg ez volt az első gép, amit nyúzhattam, a szomszéd srácnak volt egy, de magasról tett rá, volt h szülei simán beengedtek hogy a srác nem volt otthon. Hányszor volt out of memory… te jó ég. “Régenmindenjobbvolt”.

idevman

Nem fer hozza ketseg, hogy muveszet amit regen a programozok muveltek.
Viszont be kell latni, hogy a mai szoftverek sokkal osszetettebbek. A nyelvek ugy fejlodtek, hogy egyre egyszerubben, rovidebb ido alatt lehet letrehozni egyre komplexebb rendszereket. Ennek azaz az ara, hogy eros vas kell.

Ha minden progrmozo 8 orakat gorcsolne azon, hogy hol sporolhat egy byte-ot, akkor parancs soros lenne a Mac. Ez persze nem jelenti azt, hogy ne takarekoskodjunk az eroforrasokkal. Szerencses esetben belefer a projekt koltsegvetesebe az optimalizalas.

ant

A poszt jó, az ilyen embereknek kijár a respekt.

Egy apró hiba:
David Horne tehát ___672 byte-ban___ írt egy (primitív ugyan, de létező) AI-vel rendelkező sakk programot ___672 byte-on___.

rhapsodhy

A C forras nem packolt, ha megnezed a linket, latszik, hogy a srac tobbszor IOCCC nyertes volt. Valoszinu a sakkprogram is hasonlo indittatasbol szuletett, de most nincs turelmem elolvasni:)

ant

“ant, mi a hiba?”

Szóismétlés?
“672 byte-ban írt egy […] programot 672 byte-on.”

Szerintem ez így nem értelmes, egy mondatban elég egyszer leírni, hogy a 672 byte-ból kihozta a maximumot. Nyilván nem tudott 2 megás programot írni ekkora tárhelyre 🙂 de lehet, hogy rosszul értem.

Sam. Joe

“Manapság pedig mire használatos leginkább a szerencsétlen ZX81?”
Na, azért manapság már nem ekkora barbárok a népek. Ez a kép akkoriból van, amikor Jack Tramiel kitalálta – aki nem tudja ki ő, az hagyja el az oldalt most -, hogy a CBM 100 dollárt visszatérít a C64 árából, ha a vásárló beküld bármilyen más számítógépet vagy videójátékot. A New York-i Crazy Eddie bolthálózat ennek hatására 10 dollárért (!) kezdte kínálni a Sinclair ZX81 amerikai változatát, a Timex/Sinclair 1000-et, így ha a vevő ezután rendelt egy C64-et, 90 dollár tiszta nyereséget könyvelhetett el. A Commodore pedig a sok begyűjtött gépet elajándékozta, ám egy részüket megtartotta, és az alkalmazottak ajtótámasztéknak használták.

Ha valakit érdekel kicsit bővebben a Sinclair történet, akkor pár éve elkövettem róla egy anyagot itt: http://computerworld.hu/boldog-szuletesnapot-sinclair-spectrum.html

edy.wss

Csak egy kis párhuzam a múlt és jelen között: a ZX 81 (és minden későbbi ZX gép) felbontása megegyezik a Nintendo DS-ével, vagyis 256×192 pixel. Mivel bitszinten lehetett állítani a képpontokat, ezért a színek terén már nincs hasonlóság a két gép grafikai képességei között.

Sam. Joe

angelday: Józsi, azért most akik ide kommenteltek azok a hazai 8-bites scene 60%-át jelentik! Szia Edy! 😎

Ger

Nekem arra volt jó az assembly (Z80, intel 8085), hogy rájöjjek: messze vagyok a programozástól.

sn4ke

jaj, nekem volt ilyen gépem.
bár emlékeim elég zavarosak… valami olyasmi rémlik, hogy jöttek unokatesómék hozzánk, én pedig egy kicsit menőzni akartam.
akkoriban vásárolgattam a számtech lapokat – Mikrovilág, Alaplap (ezt hajtotta mindig félbe a postás az 5’25ös floppy melléklettel együtt), meg már nem tudom milyen lapok voltak amikben mindig volt valami pár oldalas program, hogy az ember begépelje egy ujjal. ezen kívül könyvtárba jártam még, hogy a kor nagy magyar nyelvű könyveit kivegyem, ezek szintén teli voltak programokkal.
na visszatérve a menőzésre, mire jöttek a népek hozzánk, addigra én begépeltem egy Snake programot (nem innen a nickem). ez a játék abból állt, hogy egy inverz space karaktert fel kellett szedni egy kígyóval, mire az pontosan egy karakternyivel lett kövérebb/hosszabb. a játék természetesen addig ment, amíg össze nem akadt a kígyó saját magával.
a program begépelése egyujjazással másfél óra lehetett de ebben már benne van az ellenőrzés is, hogy átnézzem miért nem indul, mit gépeltem el. volt hozzá egy 16 kbyte-os (!!) memóriabővítő, csak így fért bele a program. ez a bővítő elég lazán illeszkedett a gépbe hátulról, néha ki is mozdult, amikor pedig kimozdult akkor lőttek mindennek, a gép lefagyott. lehetett újra gépelni mindent. ha jól emlékszem azon a délutánon amikor elsőként begépeltem, még kétszer kellett megjátszani. aztán persze nem bírtunk magunkkal, másnap reggelig játszottunk. átlagosan fél óráig bírta a gép míg ki nem mozdult… nyomni kellett rendesen azt a kurva gombot, hogy forduljon a kígyó. este aztán újra gépelés és reggelig még egy párszor. ha bírta fél óránál tovább akkor egy óra alatt túlmelegedett és azért fagyott.
na hát semmi lényegi infót nem közöltem csak felidéztem egy kis zx81-ezést. köszi, hogy elolvastátok.

sn4ke

ja és köszi @angelday, hogy beraktad a karaktertérképet, ez ki volt nekem nyomtatva és ott volt a gép mellett állandóan. szívbemarkoló volt meglátni itt a blogodon.

Ger

A tag-nél légyszitegyél be egy mémtrack-et is és idézd fel a “c64 vs. zx” vitát!

Adi

“Tehát 1 024 vs 4 294 967 296.”

Ez az arányszám jól mutatja, hogy mennyivel szarabbak a mai programok az akkoriaknál. 🙂

Pedro

Anno én írtam ZX Spectrum tassword-del az első egyetemi Z80 programozási jegyzetet. Ez igaz.

Angelday meg azt híreszteli rólam, hogy egy délután megírtam egy chat programot az index-ben. Vagy valami hasonlót.

Itt és most kijelentem hogy bármit mond rólam Angelday AZ NEM IGAZ!

Mégegyszer lassan: bármit terjeszt rólam Angelday A.Z..N.E.M..I.G.A.Z !

Wanderer

Hát fater ez a post annyira megérintett hogy ma estére megbocsájtom Neked a mario-s bannert széjjelkúró gayboxokat. Egyébként számomra a legnagyobb hasonló mutatvány az Elite volt spectrumon, ahol egy több univerzumos, 3d-s, kereskedő akciójátékot valósítottak meg kevesebb mint 42 kbyte-ban. Egyébként nézd meg amit a srác 1k-n alkotott, és utána mond hogy nem köcsögség a twitter a maga 140 karakterével 😀

békepap

ó, én is elérzékenyültem, köszönom a nosztalgikus posztot.

óvodás koromban került a családba egy zx81, megvolt hozzá a sn4ke által említett 16 k-s bővítő, az alap begépelés mellett (még mindig megvan egy csomó kódos könyv és újság) persze magnóról is töltöttük a progikat be, sőt még kölcsönbe egy hőpapíros (vagy mi) nyomatatót is szereztünk, maga volt a high tech csoda számomra.

a szövegbevítel olyan volt, hogy a megfelelő helyen egy billentyű megnyomása egy egész (basic) utasítást beillesztett (pl. “10 f” beírása egyből 10 FOR-ként jelent meg), és ezt kihasználva még nekem is könnyen ment a (rövid) kódok bemásolása a könyvből, el is terjedt a legenda, hogy írni-olvasni nem tudok, de programozni igen 🙂

maty

85-ben vettem meg az akkori budai skála áruházban. Diákként nyáron egy betonelem gyártó üzemben dolgoztam, amint összejött a kemény 4950 Ft, már téptem is fel a fővárosba.
Nekem ő volt az első 😀

fapina

a halhatatlanok isteni magasságába emelkedtél ezzel a karaktertáblával, Angelday!!!

😀

Credo

Azt hiszem, a web korai korszakában olvastam erről (már fent volt scannelve), érdekes volt újra találkozni vele, sok ilyen posztot. 🙂

Számológépnek én jó ideje a Google-t használom, ajánlom. Úgyis általában kéznél van, gyorsabb, mint egy programot indítani vagy számológépet előkaparni.

A C cuccot igazán közzétehették volna (ez persze az eredeti programozónak szól) tömörítetlen, prettified formában is.

ZX81-el én is szöszöltem egy keveset, bár abból nem volt sajátom (TVC-ből igen), szörnyű volt a “billentyűzete”.

Akit vonzanak az ilyen optimalizálós kihívások, vagy csak az eredmények, ma sem halt ki a dolog, pörög a retro demoscene, többen visszahozták a VIC-20-at és Atari 2600-at, vannak 4k, 1k, 256 byte demoversenyek is. Sőt, ha már a Snake szóba került, a Hugi Size Coding Competitionön a 48 byte-os nyert.

A szintén szóba került Elite is régóta fent van az egyik programozó oldalán teljes forráskóddal, a nem hivatalos portokat is összegyűjtötte, a “pluszisat” én küldtem be: http://www.iancgbell.clara.net

Kicsit off (de a JavaScript megoldásnál gondolom minden pixelmániást zavar), nem ismer valaki megoldást a Firefox automatikus bilinear filteres zoomjának kikapcsolására, hogy megint nearest neighbor legyen, szép, éles pixelekkel? Úgy tudom, nincs megoldás, sokszor nekifutottam, mintha a Namorokába ígérnének lehetőséget, hogy bizonyos CSS paraméterekkel ki lehet majd kapcsolni, többre nem jutottam, de hátha más igen.

@ant: Talán a Chyrpet próbáld ki, hátha beválik: http://chyrp.net

Lajos

Életem első bérszámfejtő programját Zx81-re írtam.

Mai napig a legnagyobb hatású hardverbővítési élményem a 16KB-os RAM bővítő megérkezése volt. Egy csapásra kitágult a világ, megszűntek a korlátok, minden lehetségessé vált.

idevman

Meg annyi jutott eszembe a byte-okkal valo sporolasrol hogy Y2k 🙂

voszi

nekem is volt/van zx-81-em, féltett ereklye, a nagypapámtól kaptam, aki most 99 éves lenne, ha élne. 🙂 azon tanultam meg a gépi kódot [assembler nem volt]).

szóval. a zx-81 1KB memóriája azért nem teljesen 672 byte-ra redukálódott. sinclair nagyon elmésen úgy találta ki az egészet, hogy a gép annyi byte-ot foglalt le az 1KB-ból, amennyi karakter a képernyőre volt írva. tehát a sakktábla 8×8=64 karaktere csökkentette alapvetően a szabadon felhasználható memóriát [ha mást nem írt ki oda a gép – márpedig nem írt, ha akarta, hogy működjön is]. a rendszerváltozók is helyet foglaltak, szóval összesen volt kb. 900 byte szabad hely. az se sokkal több persze, és nagymenő volt, aki 1KB-os gépre komolyabb dolgot tudott megírni, de hát ez volt a korabelő programozós jampiskodás egyik terepe. 🙂 🙂