Самая короткая программа для эмуляции 8080

8-битные микроконтроллеры и микропроцессоры от Intel и их клоны, а также компьютеры на них построенные

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Самая короткая программа для эмуляции 8080

Post by Shaos »

... с поддержкой телетайпа и дискового контроллера: http://www.nanochess.org/emulator.html (линк поправлен в январе 2016)

Code: Select all

                               #include <stdio.h>
           #define n(o,p,e)=y=(z=a(e)%16 p x%16 p o,a(e)p x p o),h(
                                #define s 6[o]
             #define p z=l[d(9)]|l[d(9)+1]<<8,1<(9[o]+=2)||++8[o]
                                #define Q a(7)
           #define w 254>(9[o]-=2)||--8[o],l[d(9)]=z,l[1+d(9)]=z>>8
                               #define O )):((
                  #define b (y&1?~s:s)>>"\6\0\2\7"[y/2]&1?0:(
                               #define S )?(z-=
                    #define a(f)*((7&f)-6?&o[f&7]:&l[d(5)])
                               #define C S 5 S 3
                       #define D(E)x/8!=16+E&198+E*8!=x?
                             #define B(C)fclose((C))
                       #define q (c+=2,0[c-2]|1[c-2]<<8)
                          #define m x=64&x?*c++:a(x),
                         #define A(F)=fopen((F),"rb+")
                    unsigned char o[10],l[78114],*c=l,*k=l
                          #define d(e)o[e]+256*o[e-1]
#define h(l)s=l>>8&1|128&y|!(y&255)*64|16&z|2,y^=y>>4,y^=y<<2,y^=~y>>1,s|=y&4
+64506; e,V,v,u,x,y,z,Z; main(r,U)char**U;{

     { { { } } }       { { { } } }       { { { } } }       { { { } } }
    { { {   } } }     { { {   } } }     { { {   } } }     { { {   } } }
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } }
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } }
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } }
    { { {   } } }    { { {     } } }    { { {   } } }    { { {     } } }
      { { ; } }      { { {     } } }      { { ; } }      { { {     } } }
    { { {   } } }    { { {     } } }    { { {   } } }    { { {     } } }
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } }
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } }
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } }
    { { {   } } }     { { {   } } }     { { {   } } }     { { {   } } }
     { { { } } }       { { { } } }       { { { } } }       { { { } } }

                                   for(v A((u A((e A((r-2?0:(V A(1[U])),"C")
),system("stty raw -echo min 0"),fread(l,78114,1,e),B(e),"B")),"A")); 118-(x
=*c++); (y=x/8%8,z=(x&199)-4 S 1 S 1 S 186 S 2 S 2 S 3 S 0,r=(y>5)*2+y,z=(x&
207)-1 S 2 S 6 S 2 S 182 S 4)?D(0)D(1)D(2)D(3)D(4)D(5)D(6)D(7)(z=x-2 C C C C
C C C C+129 S 6 S 4 S 6 S 8 S 8 S 6 S 2 S 2 S 12)?x/64-1?((0 O a(y)=a(x) O 9
[o]=a(5),8[o]=a(4) O 237==*c++?((int (*)())(2-*c++?fwrite:fread))(l+*k+1[k]*
256,128,1,(fseek(y=5[k]-1?u:v,((3[k]|4[k]<<8)<<7|2[k])<<7,Q=0),y)):0 O y=a(5
),z=a(4),a(5)=a(3),a(4)=a(2),a(3)=y,a(2)=z O c=l+d(5) O y=l[x=d(9)],z=l[++x]
,x[l]=a(4),l[--x]=a(5),a(5)=y,a(4)=z O 2-*c?Z||read(0,&Z,1),1&*c++?Q=Z,Z=0:(
Q=!!Z):(c++,Q=r=V?fgetc(V):-1,s=s&~1|r<0) O++c,write(1,&7[o],1) O z=c+2-l,w,
c=l+q O p,c=l+z O c=l+q O s^=1 O Q=q[l] O s|=1 O q[l]=Q O Q=~Q O a(5)=l[x=q]
,a(4)=l[++x] O s|=s&16|9<Q%16?Q+=6,16:0,z=s|=1&s|Q>159?Q+=96,1:0,y=Q,h(s<<8)
O l[x=q]=a(5),l[++x]=a(4) O x=Q%2,Q=Q/2+s%2*128,s=s&~1|x O Q=l[d(3)]O x=Q  /
128,Q=Q*2+s%2,s=s&~1|x O l[d(3)]=Q O s=s&~1|1&Q,Q=Q/2|Q<<7 O Q=l[d(1)]O s=~1
&s|Q>>7,Q=Q*2|Q>>7 O l[d(1)]=Q O m y n(0,-,7)y) O m z=0,y=Q|=x,h(y) O m z=0,
y=Q^=x,h(y) O m z=Q*2|2*x,y=Q&=x,h(y) O m Q n(s%2,-,7)y) O m Q n(0,-,7)y)  O
m Q n(s%2,+,7)y) O m Q n(0,+,7)y) O z=r-8?d(r+1):s|Q<<8,w O p,r-8?o[r+1]=z,r
[o]=z>>8:(s=~40&z|2,Q=z>>8) O r[o]--||--o[r-1]O a(5)=z=a(5)+r[o],a(4)=z=a(4)
+o[r-1]+z/256,s=~1&s|z>>8 O ++o[r+1]||r[o]++O o[r+1]=*c++,r[o]=*c++O z=c-l,w
,c=y*8+l O x=q,b z=c-l,w,c=l+x) O x=q,b c=l+x) O b p,c=l+z) O a(y)=*c++O r=y
,x=0,a(r)n(1,-,y)s<<8) O r=y,x=0,a(r)n(1,+,y)s<<8))));
system("stty cooked echo"); B((B((V?B(V):0,u)),v)); }
P.S. У того же автора (между прочим мексиканца) на том же сайте можно найти несколько микроскопических шахматных программ в исходниках, написанных в том же стиле...

P.P.S. Про шахматные программки обсуждаем в другом топике
Я тут за главного - если что шлите мыло на me собака shaos точка net
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

Прикольно, если не считать два последних оператора (system и закрытие файлов), то вся программа это одна процедура main, и в ней лишь один оператор for :)

А мелкософтовый VC отказался компилировать, сказал, что слишком большая вложенность скобок :)
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

God Damage ...!!!
Но под *NIXами это всё и в правду работает !!!

Image

А под DOS - ну нифига никак !!!

То массив слишком большой для l , то переменная не объявлена V...

Хотя хозяин кода вроде обещает, что портируется без проблем:

Code: Select all

Porting it
It is easy if your platform has getch/kbhit and ANSI terminal
    read    -->  Z=kbhit()?getch():0
    write   -->  putchar(7[o])
    system  -->  nothing
Also add the following to trap Ctrl-C:
    #include <signal.h>
    signal(SIGINT, SIG_IGN);
On PC/DOS you will need to add ANSI.SYS to CONFIG.SYS
In *NIX the min 0 for stty is required, circa 2001 it was not required.
Затейливая головоломка...

PS. А с *NIXами - Пыхонин помог глянуть, что получится. :wink:
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Ну мужик замутил...

Post by Lavr »

Я вспомнил, как-то давненько читал статью, где хвалили язык C, как кроссплатформенный макроассемблер с элементами языка высокого уровня, и ругали ассемблер, как язык на котором пишутся "пещерные" коды, в которых сам автор через неделю не разберётся.
Негативно вырисовывали возможность самомодификации кода и т.д. ....
Я вот на ассемблере даже с макросредствами, пожалуй, не смог бы запутать код до уровня такого вот исходника.
Ну, возможно, если бы не применил обфускатор, наличие которых для асемблера сомнительно... :wink:

PS. Кстати говоря - существовал (да и щас есть) язык ASIC - это как раз Ассемблер с элементами языка высокого уровня BASIC. Прикольная штука, только в свою нишу он не попал - все перешли на С, а так тоже можно было замутить весьма компактный код. Да и строг был упомянутоый язычишка.
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Как стать великим программистом?

Post by Lavr »

Как стать великим программистом?

Если Вы писать программы
Не умеете нисколько,
Без разбора все валите
На плохой язык FORTRAN.
Очень смело заявляйте,
Дескать, если б на Паскале...
(Иль на Си, на крайний случай),
Вы б такое написали
Закачалися бы все.
Но при этом постарайтесь,
Сделать так, чтоб ту программу
Вам писать на самом деле
Никогда бы не пришлось.
И тогда считать все будут
Вас великим программистом! :lol:

http://frodo.planeta7.ru/lofiversion/index.php/t47.html
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Вопрос к нашим гуру по Цэ:

А вот этот кусок кода функционален у автора: ?

Code: Select all

main(r,U)char**U;{ 

     { { { } } }       { { { } } }       { { { } } }       { { { } } } 
    { { {   } } }     { { {   } } }     { { {   } } }     { { {   } } } 
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } } 
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } } 
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } } 
    { { {   } } }    { { {     } } }    { { {   } } }    { { {     } } } 
      { { ; } }      { { {     } } }      { { ; } }      { { {     } } } 
    { { {   } } }    { { {     } } }    { { {   } } }    { { {     } } } 
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } } 
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } } 
   { { {     } } }   { { {     } } }   { { {     } } }   { { {     } } } 
    { { {   } } }     { { {   } } }     { { {   } } }     { { {   } } } 
     { { { } } }       { { { } } }       { { { } } }       { { { } } } 

                                   for(v A((u A((e A((r-2?0:(V A(1[U])),"C") 
),system("stty raw -echo min 0"),fread(l,78114,1,e),B(e),"B")),"A"));
Или это "красоты", которые можно парными скобками поудалять?

Если я правильно помню - Це ведь безразличен к пробелам?
iLavr
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

по-моему эти скобки ничего не значат
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:по-моему эти скобки ничего не значат
Я хотел попробовать удалять парами - открывающая/закрывающая.
И после каждого удаления - компилировать...

Может в какой-то момент заработает...
iLavr
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Lavr wrote:
Shaos wrote:по-моему эти скобки ничего не значат
Я хотел попробовать удалять парами - открывающая/закрывающая.
И после каждого удаления - компилировать...

Может в какой-то момент заработает...
Не заработает - там заточка под сугубо юниксовую программульку stty
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:Не заработает - там заточка под сугубо юниксовую программульку stty
А как же:
Porting it
It is easy if your platform has getch/kbhit and ANSI terminal
read --> Z=kbhit()?getch():0
write --> putchar(7[o])
system --> nothing
Also add the following to trap Ctrl-C:
#include <signal.h>
signal(SIGINT, SIG_IGN);
On PC/DOS you will need to add ANSI.SYS to CONFIG.SYS
In *NIX the min 0 for stty is required, circa 2001 it was not required.
И компильнуться ведь должна в итоге?
iLavr
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

А ну дык это надо прогу переписывать :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Есть такая вот затейливая страница:
Онлайн-компилятор для 40 языков программирования (Online IDE)

По описанию может компильнуть программу на:
Ada; Assembler; Assembler; AWK (gawk); AWK (mawk); Bash; bc; Brainf**k; C; C#; C++; C++0x; C99 strict; CLIPS; Clojure; COBOL; COBOL 85; Common Lisp (clisp); D (dmd); Erlang; F#; Factor; Falcon; Forth; Fortran; Go; Groovy; Haskell; Icon; Intercal; Java; JavaScript (rhino); JavaScript (spidermonkey); Lua; Nemerle; Nice; Nimrod; Objective-C; Ocaml; Oz; Pascal (fpc); Pascal (gpc); Perl; Perl 6; PHP; Pike; Prolog (gnu); Prolog (swi); Python; Python 3; R; Ruby; Scala; Scheme (guile); Smalltalk; SQL; Tcl; Text; Unlambda; Visual Basic .NET; Whitespace.

Подсунул я ему наш шедевр... так с пол-пинка этот монстр не справился! :lol:
Впрочем есть варианты у него... ещё попробую... :wink:


Хотя... на чистом С вроде даже компилируется, запускается, но не находит stty.
результат: Ошибка выполнения время: 0.02s память: 3796 kB сигнал: 11 (SIGSEGV)
ввод: нет
вывод: нет
stderr:
stty: standard input: Inappropriate ioctl for device
iLavr
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самая короткая программа для эмуляции 8080

Post by Shaos »

Обновил линк на страничку эмулятора и дургого сопутствующего материала:

http://www.nanochess.org/emulator.html
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Самая короткая программа для эмуляции 8080

Post by Lavr »

Разверни программу для эмуляции 8080 в нормальный вид, если не трудно...

Давно уже интересно, что там намутили. :o
iLavr
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Самая короткая программа для эмуляции 8080

Post by Shaos »

А она чегой-то не собирается у меня :(

P.S. У него на страничке есть описание того, как работает этот эмулятор

P.P.S. Хотя нет - версия с вебстранички собралась - щас причешу..

P.P.P.S. Тут у него всё плохо - кроме последних двух строчек вся логика сидит в цикле for, причём в основном в третьем параметре с кучей троичных опеаторов ?: и запятых (я вообще не понимаю как это компилятор вообще компилирует)
Я тут за главного - если что шлите мыло на me собака shaos точка net