Familia Toledo primer lugar en concurso internacional de software

NFT. 7 de junio del 2008.


Óscar Toledo Gutiérrez, ganador 4 veces del IOCCC
Desarrollar software de última generación, requiere un oceano de tiempo para obtener un conocimiento sofisticado, como Óscar Toledo Gutiérrez, que conquistó las primeras tres categorías de la 19ª edición del IOCCC (International Obfuscated C Code Contest), la categoría Best of Show con un programa que simula una computadora y sus interfaces, además las categorías Most Portable Chess Set con un juego de ajedrez gráfico y Best Small Program que ilustra el periplo del caballo.

El joven Óscar — Prólogo a los programas — Lo mejor del concurso — El microprocesador 8080 — Ajedrez más portátil — Mejor programa diminuto — Semblanza — Enlaces relacionados

El IOCCC (International Obfuscated C Code Contest) fue fundado en 1984 en San Francisco, California, desde entonces organiza un concurso anual, donde los participantes deben escribir programas en lenguaje C, de menos de 2048 caracteres, que sean funcionales y cuyo código fuente este codificado de forma tan ingeniosa, que incluso los expertos tengan dificultades para comprenderlos, pero que sea capaz de funcionar en todas las computadoras. Las reglas del concurso establecen que cualquier programador del mundo puede participar, pero sólo se da a conocer a los ganadores. Solo los profesionales del software son capaces de ganar este concurso, que atrae a la crema y nata de los programadores de todo el mundo.

Las otras categorías del IOCCC de este año fueron ocupadas por participantes de E.U.A, Reino Unido, Italia, Finlandia y Noruega. México es el único país hispanoamericano que ha ganado el primer lugar de este concurso, donde participan programadores de empresas y universidades prestigiadas como: HP, AT&T, MIT, Cray, Pixar, Familia Toledo y la Universidad de Oxford y de Pisa, así como personas ligadas a la red de alta tecnología de Silicon Valley, Taiwan, Bangalore, Malasia, Hong Kong, Cambridge y Helsinki, entre otros.

El premio es el reconocimiento a la habilidad de los ganadores, por parte de la comunidad de programadores.

¿Porqué es importante este acontecimiento para los mexicanos?. Tomando en cuenta que México es un país del tercer mundo sin trayectoria tecnológica, son extraños esta clase de sucesos. La tecnología es un bien necesario en este mundo globalizado, donde el conocimiento se ha convertido en un artículo muy cotizado por las industrias, aunque a pesar de lo que muchos creen, este no se encuentra a la venta en la tienda de la esquina, se requieren años de esfuerzo para obtener personas capacitadas y entregadas a sus principios, autodisciplinadas y con conocimientos prácticos, que se adquieren solo con una gran dedicación.

La cultura mexicana coarta a los que pudieran ser futuros científicos, con excusas que arrastra desde la epoca de la conquista. México goza de maravillas naturales, nos vemos rodeados de recursos naturales amplios y variados, siendo un país de raíces principalmente agrícolas, la diversificación de las tecnologías ha creado una amplia brecha de conocimientos, donde la gran mayoría de los mexicanos no tienen una idea autónoma sobre el impacto de la tecnología en sus vidas, y son guiados solamente por las propagandas comerciales difundidas por la mayoría de los medios de comunicacion; nos vemos ajenos al mundo científico y creemos que se encuentra fuera de nuestra realidad, cuando toda la tecnología esta intimamente ligada a nuestra vida diaria e inexorablemente vinculada con el futuro de nosotros y nuestros hijos, es tiempo de participar en todos estos acontecimientos y valorar la importancia de estas nuevas tecnologías, para llevar al país a un futuro prometedor.

Al momento de realizarse la presentación de la 19ª edicion del IOCCC en el Museo de la Historia de la Computacion en Mountain View, California, donde se expusieron únicamente a los ganadores de dicho concurso, hay que mencionar que antes de estas dos últimas ediciones solo se escuchaban los nombres de países con trayectorias tecnológicas, como: Reino Unido, Finlandia, Noruega, E.U.A. y otros países adelantados. El 4 de noviembre del 2007 se escuchó por primera vez el nombre de México y no solo como un ganador más, sino que se encumbró en la categoría de lo mejor de todo el concurso (Best of Show), además para cerrar con broche de oro, Óscar Toledo Gutiérrez participó con tres programas diferentes y todos ganaron en sus respectivas categorías: Best of Show, Best Small Program y Most Portable Chess. Un claro ejemplo de lo que 24 años de dedicación y amor a su profesión pueden lograr.

Regresamos a la pregunta anterior, ¿Porqué es importante este acontecimiento para los mexicanos?, simplemente al ver que un compatriota gana, nos eleva la autoestima. El hecho de que un mexicano resulte seleccionado entre los mejores programadores del mundo, es un reconocimiento mundial para todos los que no obtienen credibilidad en áreas intelectuales por ser originarios de un país sin ciencia. La corta edad de Óscar al realizar estos programas y obtener el reconocimiento de mejor programador a nivel mundial, es una clara motivación para nuestra juventud, sedienta de valores y ejemplos de éxitos, lo que sin duda logrará que todos nuestros jóvenes se decidan a realizar sus sueños y luchar por un futuro mejor, con grandes esperanzas de triunfo, siempre y cuando exista la autodisciplina y un verdadero amor al conocimiento.

Empresas líderes en informática utilizan el lenguaje C para desarrollar sus programas. Se estima que dominar el lenguaje C toma cerca de diez años. De acuerdo a SOFTWARE 500, la nueva economía basada en el software ha generado ganancias en E.U.A. por $380 mil millones de dólares solo en el año 2006.

Prólogo a los programas ganadores

Estos programas fueron escritos para participar en un concurso donde es obligatorio que el código fuente del programa no exceda de 4096 bytes (4K), por lo tanto se han utilizado avanzadas técnicas de programación y criptografía que pueden hacerlos difíciles de entender.

El concurso es acerca de escribir código confuso, y se descalifica cualquier código que sea muy obvio, «claro» o «limpio». Estos programas pueden exceder la «frontera» mental de muchos programadores.

Desde luego, cualquier buen programador puede descifrar su funcionamiento si se esfuerza, y todos pueden disfrutar estos programas aunque no sean programadores.

Toledo2.c (19º IOCCC Best of Show)
Listado del código fuente.
                               #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)); }

Lo Mejor del Concurso

Saturado de características, este programa simula una computadora basada en el venerable microprocesador Intel 8080, equipada con 64K de RAM (65536 octetos), pantalla, teclado y dos unidades de disco de 8 MB cada una, para ejecutar software de varios niveles.

El microprocesador 8080 permitió el inicio de la revolución de las computadoras a mediados de 1970, y posibilitó por primera vez que cada persona pudiera tener una computadora en casa.

Para su compilación se requiere de un entorno tipo UNIX —puede ser Linux o BSD— descargue el archivo toledo2.c, y realice:

     cc toledo2.c -o toledo2

Una vez hecho esto, descargue la imagen de memoria inicial para el emulador (su ROM básica), por ejemplo, el archivo c_basic.bin y renombrelo como C (sin extensión). Ahora proceda a ejecutar el emulador:

     ./toledo2

A partir de este momento podrá usar como ejemplo el Palo Alto Tiny BASIC, creado por Li-Chen Wang en 1976, este lenguaje cooperó al éxito de las computadoras personales.

El BASIC (Beginners All purpose Symbolic Instruction Code) es un lenguaje de alto nivel inventado en 1964 por John Kemeny y Thomas Kurtz para la enseñanza de la programación, fue exitoso y creó una generación entera de programadores, varios de ellos son actualmente conocidos millonarios; se considera que es vital que un programador conozca y use BASIC para ser un buen programador.

Pruebe a introducir este programa para contar del 1 al 10, utilice mayúsculas y oprima Enter después de cada línea:

Programa de ejemplo 1: Contador

     10 FOR A=1 TO 10
     20 PRINT A
     30 NEXT A
     RUN

Oprima Ctrl+Z para salir del programa. Este BASIC admite 26 variables nombradas como A-Z, una matriz @(indice), operaciones /, *, -, +, >, <, =, #, >=, <=, ABS(expr) devuelve valor absoluto, RND(expr) devuelve un valor aleatorio en el rango 1 a expr, y SIZE que devuelve la cantidad de memoria libre en bytes, se admite aritmética entera en el rango de -32768 a 32767. Las órdenes directas son RUN (ejecutar), LIST (listar) y NEW (borrar).

Algunas palabras clave BASIC admitidas:

    LET A=5
    INPUT A
    INPUT "VALOR"B
    PRINT "HOLA"
    PRINT A*B
    IF A<B PRINT "A<B"
    GOTO 100
    GOTO expr
    GOSUB 100
    GOSUB expr
    RETURN
    FOR A=1 TO 10 STEP 2
    NEXT A
    STOP

Programa de ejemplo 2. Tabla de multiplicar:

    10 INPUT "TABLA"A
    20 FOR B=1 TO 10
    30 PRINT #1,A," x",B," =",A*B
    40 NEXT B

Estos fueron solo dos ejemplos de las capacidades básicas del emulador 8080. Si desea probar un sistema operativo, descargue el archivo KAYPROII.ZIP desde www.retroarchive.org, para obtener el CP/M de Digital Research, desarrollado por Gary Kildall en el año 1974, este sistema operativo es el antecesor del MS-DOS.

Extraiga el archivo CPM64.COM desde el directorio SOURCE, y copielo a archivos llamados A y B (serán las unidades de disco). Ahora descargue el archivo c_bios.bin y renombrelo como C (sin extensión) y ejecute el emulador.

Ahora ya tiene un sistema operativo CP/M funcional, con dos archivos creados por el emulador en la unidad simulada A:, HALT.COM para detener el emulador de forma que cierre los archivos, e IMPORT.COM para introducir nuevos archivos. Pruebe a teclear:

    DIR

Para obtener un sistema operativo CP/M completo, se requieren los siguientes archivos del directorio SOURCE de KAYPROII.ZIP:

     ASM.COM    ED.COM     STAT.COM
     DDT.COM    LOAD.COM   SUBMIT.COM
     DUP.COM    PIP.COM    XSUB.COM

Para importarlos debe ejecutarse el emulador con un argumento, por ejemplo:

     ./toledo2 DDT.COM

Cuando aparezca el indicador de entrada A>, escriba:

     IMPORT DDT.COM

Cuando termine, escriba:

     HALT

Así el archivo es salvado y se puede repetir el proceso con otro archivo. El archivo KAYPROII.ZIP también contiene el procesador de textos Wordstar 3.3. Hasta ahora se han probado exitosamente los siguientes programas:

     http://www.retroarchive.org/cpm/lang/c80v30.zip
     http://www.retroarchive.org/cpm/lang/Mbasic.com
     http://www.retroarchive.org/cpm/business/MULTPLAN.ZIP
     http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/ARC-LBR/UNARC16.ARK
     http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/ARC-LBR/UNARC16.MSG
     http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/ARC-LBR/DELBR12.ARK
     http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/SQUSQ/USQ-20.COM
     http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/SQUSQ/UNCR8080.LBR
     http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/DIRUTL/XDIR3-12.LBR
     http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/DIRUTL/CU.LBR
     http://www.retroarchive.org/cpm/cdrom/CPM/UTILS/FILCPY/SWEEP40.LBR

Visite www.retroarchive.org para acceder miles de programas compatibles con CP/M e incluso manuales de algunos de ellos. Varios programas requieren instalación para configurar la terminal, seleccione ANSI o VT-100.

¿Qué es el 8080?

El microprocesador Intel 8080 fue diseñado por Federico Faggin y Masatoshi Shima, y estuvo disponible al público a partir de diciembre de 1973, basado en el concepto Von Neumann, que une el procesador y sus registros para procesar instrucciones. El 8080 direcciona 65536 octetos (bytes) de memoria, que pueden contener instrucciones o datos, además tiene 256 puertas de entrada y salida para uso de periféricos.

 
Procesador AMD 9080 y memoria Intel 1702A
La versión AMD del procesador 8080, junto a una memoria EPROM Intel 1702A, de 256 bytes a 650 nanosegundos, con patillas chapeadas en oro para evitar la oxidación.
 
Registros del microprocesador 8080
(cada línea representa 16 bits)
AF
BC
DE
HL
SP
PC
 
Núcleo del microprocesador 8080, compuesto por 4500 transistores
Núcleo microelectrónico del microprocesador 8080, compuesto por 4500 transistores del tamaño de 6 micrones.
 

Los registros de 8 bits pueden ser manipulados en pares de 16 bits, como AF, BC, DE y HL. El registro especial SP (Stack Pointer) mantiene la ubicación en memoria de la pila de datos, y es usado por instrucciones tales como PUSH, POP, CALL y RET. El registro PC (Program Counter) contiene la dirección actual de ejecución, y es alterado por instrucciones tales como JMP y CALL.

Las banderas son bits que están contenidos en el registro especial F, y se alteran automáticamente con el resultado de la última operación aritmética. Son S (Signo, bit 7), Z (Cero, bit 6), P (Paridad, bit 2) y C (Acarreo, bit 0), si cualquiera de ellas está puesta a 1 significa que se cumple la condición que indica.

Del microprocesador 8080 se derivaron otros microprocesadores como el Intel 8085, el Zilog Z80, y el Intel 8088, que fue el núcleo de la primera computadora IBM PC, igual que de los actuales «dual core», todos estos microprocesadores son de arquitectura CISC (Complex Instruction Set Computer), en la cual cada instrucción tiene un tiempo de ejecución variable, lo cual limita su eficiencia, incluso a velocidades de 3 gigahertz.

¿Cómo trabaja?

La memoria RAM de 64K es inicializada con el contenido del archivo C, el bucle principal lee cada instrucción y la decodifica para realizar la operación adecuada.

Para la ejecución del CP/M, se diseñó un BIOS —Basic Input Output System— a la medida, el cual reporta al sistema operativo la configuración del hardware simulado.

El emulador ejecuta en su totalidad el conjunto de instrucciones del microprocesador 8080, que es como sigue:

MicroclaveNemónico IntelNemónico Zilog
00NOPNOP
01 bb aaLXI B,aabbLD BC,aabb
02STAX BLD (BC),A
03INX BINC BC
04INR BINC B
05DCR BDEC B
06 aaMVI B,aaLD B,aa
07RLCRLCA
09DAD BADD HL,BC
0ALDAX BLD A,(BC)
0BDCX BDEC BC
0CINR CINC C
0DDCR CDEC C
0E aaMVI C,aaLD C,aa
0FRRCRRCA
11 bb aaLXI D,aabbLD DE,aabb
12STAX DLD (DE),A
13INX DINC DE
14INR DINC D
15DCR DDEC D
16 aaMVI D,aaLD D,aa
17RALRLA
19DAD DADD HL,DE
1ALDAX DLD A,(DE)
1BDCX DDEC DE
1CINR EINC E
1DDCR EDEC E
1E aaMVI E,aaLD E,aa
1FRARRRA
21 bb aaLXI H,aabbLD HL,aabb
22 bb aaSHLD aabbLD (aabb),HL
23INX HINC HL
24INR HINC H
25DCR HDEC H
26 aaMVI H,aaLD H,aa
27DAADAA
29DAD HADD HL,HL
2A bb aaLHLD aabbLD HL,(aabb)
2BDCX HDEC HL
2CINR LINC L
2DDCR LDEC L
2E aaMVI L,aaLD L,aa
2FCMACPL
31 bb aaLXI SP,aabbLD SP,aabb
32 bb aaSTA aabbLD (aabb),A
33INX SPINC SP
34INR MINC (HL)
35DCR MDEC (HL)
36 aaMVI M,aaLD (HL),aa
37STCSCF
39DAD SPADD HL,SP
3A bb aaLDA aabbLD A,(aabb)
3BDCX SPDEC SP
3CINR AINC A
3DDCR ADEC A
3E aaMVI A,aaLD A,aa
3FCMCCCF
40MOV B,BLD B,B
41MOV B,CLD B,C
42MOV B,DLD B,D
43MOV B,ELD B,E
44MOV B,HLD B,H
45MOV B,LLD B,L
46MOV B,MLD B,(HL)
47MOV B,ALD B,A
48MOV C,BLD C,B
49MOV C,CLD C,C
4AMOV C,DLD C,D
4BMOV C,ELD C,E
4CMOV C,HLD C,H
4DMOV C,LLD C,L
4EMOV C,MLD C,(HL)
4FMOV C,ALD C,A
50MOV D,BLD D,B
51MOV D,CLD D,C
52MOV D,DLD D,D
53MOV D,ELD D,E
54MOV D,HLD D,H
55MOV D,LLD D,L
56MOV D,MLD D,(HL)
57MOV D,ALD D,A
58MOV E,BLD E,B
59MOV E,CLD E,C
5AMOV E,DLD E,D
5BMOV E,ELD E,E
5CMOV E,HLD E,H
5DMOV E,LLD E,L
5EMOV E,MLD E,(HL)
5FMOV E,ALD E,A
60MOV H,BLD H,B
61MOV H,CLD H,C
62MOV H,DLD H,D
63MOV H,ELD H,E
64MOV H,HLD H,H
65MOV H,LLD H,L
66MOV H,MLD H,(HL)
67MOV H,ALD H,A
68MOV L,BLD L,B
69MOV L,CLD L,C
6AMOV L,DLD L,D
6BMOV L,ELD L,E
6CMOV L,HLD L,H
6DMOV L,LLD L,L
6EMOV L,MLD L,(HL)
6FMOV L,ALD L,A
70MOV M,BLD (HL),B
71MOV M,CLD (HL),C
72MOV M,DLD (HL),D
73MOV M,ELD (HL),E
74MOV M,HLD (HL),H
75MOV M,LLD (HL),L
76HLTHALT
77MOV M,ALD (HL),A
78MOV A,BLD A,B
79MOV A,CLD A,C
7AMOV A,DLD A,D
7BMOV A,ELD A,E
7CMOV A,HLD A,H
7DMOV A,LLD A,L
7EMOV A,MLD A,(HL)
7FMOV A,ALD A,A
MicroclaveNemónico IntelNemónico Zilog
80ADD BADD A,B
81ADD CADD A,C
82ADD DADD A,D
83ADD EADD A,E
84ADD HADD A,H
85ADD LADD A,L
86ADD MADD A,(HL)
87ADD AADD A,A
88ADC BADC A,B
89ADC CADC A,C
8AADC DADC A,D
8BADC EADC A,E
8CADC HADC A,H
8DADC LADC A,L
8EADC MADC A,(HL)
8FADC AADC A,A
90SUB BSUB B
91SUB CSUB C
92SUB DSUB D
93SUB ESUB E
94SUB HSUB H
95SUB LSUB L
96SUB MSUB (HL)
97SUB ASUB A
98SBB BSBC A,B
99SBB CSBC A,C
9ASBB DSBC A,D
9BSBB ESBC A,E
9CSBB HSBC A,H
9DSBB LSBC A,L
9ESBB MSBC A,(HL)
9FSBB ASBC A,A
A0ANA BAND B
A1ANA CAND C
A2ANA DAND D
A3ANA EAND E
A4ANA HAND H
A5ANA LAND L
A6ANA MAND (HL)
A7ANA AAND A
A8XRA BXOR B
A9XRA CXOR C
AAXRA DXOR D
ABXRA EXOR E
ACXRA HXOR H
ADXRA LXOR L
AEXRA MXOR (HL)
AFXRA AXOR A
B0ORA BOR B
B1ORA COR C
B2ORA DOR D
B3ORA EOR E
B4ORA HOR H
B5ORA LOR L
B6ORA MOR (HL)
B7ORA AOR A
B8CMP BCP B
B9CMP CCP C
BACMP DCP D
BBCMP ECP E
BCCMP HCP H
BDCMP LCP L
BECMP MCP (HL)
BFCMP ACP A
C0RNZRET NZ
C1POP BPOP BC
C2 bb aaJNZ aabbJP NZ,aabb
C3 bb aaJMP aabbJP aabb
C4 bb aaCNZ aabbCALL NZ,aabb
C5PUSH BPUSH BC
C6 aaADI aaADD A,aa
C7RST 00RST 00
C8RZRET Z
C9RETRET
CA bb aaJZ aabbJP Z,aabb
CC bb aaCZ aabbCALL Z,aabb
CD bb aaCALL aabbCALL aabb
CE aaACI aaADC A,aa
CFRST 08RST 08
D0RNCRET NC
D1POP DPOP DE
D2 bb aaJNC aabbJP NC,aabb
D3 aaOUT aaOUT (aa),A
D4 bb aaCNC aabbCALL NC,aabb
D5PUSH DPUSH DE
D6 aaSUI aaSUB aa
D7RST 10RST 10
D8RCRET C
DA bb aaJC aabbJP C,aabb
DB aaIN aaIN A,(aa)
DC bb aaCC aabbCALL C,aabb
DE aaSBI aaSBC A,aa
DFRST 18RST 18
E0RPERET PE
E1POP HPOP HL
E2 bb aaJPE aabbJP PE,aabb
E3XTHLEX (SP),HL
E4 bb aaCPE aabbCALL PE,aabb
E5PUSH HPUSH HL
E6 aaANI aaAND aa
E7RST 20RST 20
E8RPORET PO
E9PCHLJP (HL)
EA bb aaJPO aabbJP PO,aabb
EBXCHGEX DE,HL
EC bb aaCPO aabbCALL PO,aabb
EE aaXRI aaXOR aa
EFRST 28RST 28
F0RPRET P
F1POP PSWPOP AF
F2 bb aaJP aabbJP P,aabb
F3DIDI
F4 bb aaCP aabbCALL P,aabb
F5PUSH PSWPUSH AF
F6 aaORI aaOR aa
F7RST 30RST 30
F8RMRET M
F9SPHLLD SP,HL
FA bb aaJM aabbJP M,aabb
FBEIEI
FC bb aaCM aabbCALL M,aabb
FE aaCPI aaCP aa
FFRST 38RST 38

Los nemónicos Intel funcionan directamente con las utilidades ASM y DDT del CP/M, por lo tanto usted puede experimentar con la programación en lenguaje ensamblador, software de control, educativo o crear otro sistema operativo.

De forma virtual se han definido periféricos conectados al microprocesador, que permiten el acceso al teclado y a la pantalla, así como a las unidades de disco. Si usted desea escribir su propio monitor o sistema operativo, las siguientes instrucciones permiten la comunicación directa con los periféricos:

MicroclaveOperación
76Sale del emulador
DB 00Lee el estatus de tecla oprimida
DB 01Lee la tecla
DB 02Lee un byte de archivo (Carry = Fin de archivo)
D3 xxEscribe un byte del acumulador en la pantalla
ED ED 02Lee un sector de 128 bytes de disco simulado
ED ED 03Escribe un sector de 128 bytes de disco simulado
Direcciones de memoria:
FBFA = Dirección origen/destino (byte bajo)
FBFB = Dirección origen/destino (byte alto)
FBFC = Sector (0 a 127)
FBFD = Pista (byte bajo)
FBFE = Pista (byte alto)
FBFF = Número de unidad (0= Unidad A:, 1= Unidad B:)

¿Sabía usted que los torniquetes del metro de la Ciudad de México son gobernados por microprocesadores 8080?


Toledo3.c (19º IOCCC Most Portable Chess Set)
Listado del código fuente.
#include <X11/Xlib.h>
char *l="dbcefcbddabcddcba~WAB+  +BAW~              +-84HLSU?A6J57IKJT576,",
*F="          ,>>,>  xl~w/?  ,>>>,s  m\177>>\177\177  mm2>>>  >uk>>> ",*f;y,u;
#define v for (i=0,b=0;b>511?b=0,i+=64:0,i<512;b+=64) A=i/64*10+b/64+21,XCopy\
Plane(d, r[I[A]+7+14*(i+b>>6&1)+28*(A==z)],w,C,0,0,64,64,b,i,1); XFlush(d);
#define _(a) *f++=a&*F?-(z%14<7):"U\252U\0DDDD"[z/14*2|u&1],
#define G(p) p##Pixel(d,DefaultScreen(d))
#define R(a) |(a==O|p==a)*
#define P return y=~y,
#define a X(0,0,0,
#define H while(
#define D ;if(

I[304],b,i,z;main(x,W)                   char**W; { Display *d =
 XOpenDisplay(""); Window               w = XCreateSimpleWindow
  (d, DefaultRootWindow(d),            64,64,512,512,2,G(Black)
   ,G(Black)); XGCValues g;           XButtonEvent e; int A,r
    [56],Z,* m = I , C ,Y;           XSelectInput(d,w,32772);
     XMapWindow( d, w); g.          foreground = G(White);
      C=XCreateGC(d,w,4,&g);       F+=48; H f=I,i=0,z<56){
       H u=0,i++<8){ H _(0)_(     64)_(16)_(8)_(4)_(2)_(1
       )_(0)++u<8); F++; } F-=   z%7-6?z%14<6?16:0:8; r[
        z++]=XCreateBitmapFromData(d,w,I,64,64); } srand(
       time(z=u=0)); H I[z]=-(   z>98|z<21|(z+1)%10<2),
      ++z<120); H ++m<9+I) 80     [m]=-2,90[m]=~(20[m]=7&*
     l++),30[m]=1; D 1<x) Z=       *W[1]-45; D 2<x){ a u,1
   ,Z); a u,0,1); z=0; } H          1){ XNextEvent(d,&e); D
  e.type==12){ v } D e.              type==4){ b=e.y/64*10+e
.x/64+21; D(b[I]^y)<-1)               { z=b; v} else{ i=(b<29
|b>90)&((z[I]^y)==-2)?-                6^y:z[I]; Y=y; a u,0,1);
z=0; v D 1<x&&Y-y){ a u                ,1,Z); a u,0,1); } z=0;
        v } } } }


                             X(w,c,h,e,S,s)


{ int p,O=          *l,t,d,o,C          ,*g,E,n,*m          =I,N=-1e8,
          A,L,r,x =           10,q; y=~y          ; H--O>20)
{ o=I[p=O]          D q=o^y,q>          0){ q+=(q<          2)*y,C=q
         ["51#/+++"],       A=q["95+3/33"];       do { m=0,
r=I[p+=C[l          ]-64] D !w          |p==w&&q>1          |C+2<A|!r)
          { d=abs(O-          p) D g=q<2          &e>>6==p+(
y?x:-x)?I+          (e>>6):0,           !r&(q>1|d%          x<1||g)|(r
          ^y)<-1){ n          =o,t=q<2&(          89<p|30>p)
?n+=y|1,6^          y:o+(y|1)           D (r^y)<-6          ) P 1e7-811
          *h; H n-t)          { O[I]=0,p          [I]=n,m?*g
=*m,*m=0:g          ?*g=0:0;            E=e&63 R(           91)16 R(28)
          4 R(21)2 R          (98)32; L=          (q>1?6-q?l
[p/x-1]-l[          O/x-1]-q+2          :(E|=y?8:1          ,!!m)*9:(E
          |=20-d?0:           64*p,n-o?(          l[15+n]-' '
)*9:d/8+!!          g*99))+(l[          r+15]-' ')          *9+l[p%x]-
          h-l[O%x];           L-=s>h||s==         h&L>49&1<s
?X(s>h?0:p          ,L,h+1,E,N          ,s):0 D !(          z-O|i-n|h|
          p-b|S|L<-           1e6))return         u=E; O[I]=
o,p[I]=r,m          ?*m=*g,*g=          0:g?*g=-2^          y:0 D S|h&&
          (L>N||!h&N          ==L&&rand(          )&4)){ N=L
D !h&&s) i          =n,z=O,b=p          D h&&c-L<S          ) P L; } q
          >5&d<2&C+6          <A&&(g=I+p          ,r=I[p+=p-
O],m=p<O?g          -3:g+2,!(e          &(p<O?3:5)          <<3*-y|*g|
          r|m[p<O?1:          -1])&&L>-           1e6&&1e6>a
63,1,0))?d          ++:(n+=y|1          );} } } C           +=q<2&C+3>
          A&((y?O<80          :39<O)||r)          ; } H!r&q>
2&q<6||(p=          O,++C<A))           ; } } P N+          1e8?N:0; }

Ajedrez más Portátil

Este programa es un juego completo de ajedrez con interfaz gráfica, basta con desplazar el ratón y hacer click en las piezas para moverlas.

El juego acepta todos los movimientos legales del ajedrez, y automáticamente discrimina las jugadas ilegales.

Puede funcionar para dos jugadores, francamente útil cuando alguno de los contrincantes no conoce las reglas del ajedrez. Y si usted quiere probar sus habilidades ajedrecísticas, también le provee de un oponente computarizado con inteligencia artificial.

El código fuente es compilable en un entorno tipo UNIX con sistema de ventanas X11 —compatible con BSD y Linux—, descargue el código fuente toledo3.c y compile de la siguiente forma:

     cc toledo3.c -o toledo3 -lX11

Ejecute el programa sin argumentos para obtener el modo de 2 jugadores:

     ./toledo3

Ejecute con un argumento (indica el nivel de juego, 1-Rápido, 2-Medio, 3-Muy lento) para jugar blancas contra negras guiadas por la computadora:

     ./toledo3 1

Ejecute con dos argumentos para jugar negras contra blancas guiadas por la computadora, el contenido del segundo argumento no importa:

     ./toledo3 1 a

Ya que UNIX se utiliza escasamente en las computadoras, este juego de ajedrez fue escrito de tal forma que un aditamento hace que pueda ser compilado en sistemas operativos Windows. Descargue el archivo layer.c, y substituya en toledo3.c la primera línea #include <X11/Xlib.h> por #include "layer.c", después de esto compile con su compilador favorito de Windows (modo C no C++, aplicación Win32).

La versión Windows está fija para un jugador con blancas contra computadora con negras en nivel básico, pero esto se puede cambiar fácilmente modificando el archivo layer.c.

Este ajedrez puede funcionar en cualquier sistema operativo, basta con crear una capa layer.c adecuada, lo que lo hace completamente portátil.

La mitad superior del programa listado compone la interfaz y las gráficas, y la mitad inferior implementa las reglas del ajedrez, todo esto en el límite de 2047 caracteres del IOCCC (no se cuentan espacios, ni llaves ni punto y coma seguidos por espacio).

Es el ajedrez con gráficas más pequeño del mundo escrito en lenguaje C.


El ajedrez corriendo en el Sistema Fénix
El ajedrez corriendo en el Sistema Fénix (utilizando una capa de traslación de los programadores de la Familia Toledo)
El ajedrez corriendo en Windows XP
El ajedrez corriendo en Windows XP (utilizando la capa de traslación anexa)
El ajedrez coriendo en una distribución Linux
El ajedrez corriendo en una distribución de Linux (versión por defecto)

Toledo1.c (19º IOCCC Best Small Program)
Listado del código fuente.
char    *e,t    [366    ],*f
,*g,    *h,*    i;d,    m  ;
    main    (c,b)   char    **b;{
    for(    ;d[t]   =d%3    ?60<d
&300    >d&6    <d %    30?0
:32:    d%30    ?32:    10 ,
    366>    ++d;)   ;for    (g=3*
    atoi    (*++    b) +    34+t;
i=f=    "\1"    "\7"    "(d"
"\177"  "yX"    "\34"   ,e=g
    ;  )    for(    *e++    =++m/
    10 +    48,g    =c=0    ,*e =
48+m    %10;    h=e-    65+*
i,d=    *h,*    i++;    f-=8
    ,g=d    <c?c    =d,h:   g)for
    (; d    -=!!    h[*f    ++-64
    ],*f    ;) ;    puts    (t);}

El Mejor Programa Diminuto

Un reto con raíces matemáticas es tratar de desplazar un caballo sobre los 64 escaques del tablero de ajedrez, sin repetir ninguno de ellos; este desafío mental también es conocido como el periplo del caballo.

Parece sencillo, pero el caballo se desplaza en forma de L, dos cuadros en una dirección y un cuadro en otra, comprobarlo manualmente puede ser complicado.

Este programa soluciona el problema cómodamente, y es compilable en cualquier plataforma, descargue toledo1.c y compile con su IDE favorito, o en un entorno de órdenes teclee:

     cc toledo1.c -o toledo1

Los cuadros del tablero quedan númerados de la siguiente forma:

1112131415161718
2122232425262728
3132333435363738
4142434445464748
5152535455565758
6162636465666768
7172737475767778
8182838485868788

Para obtener la secuencia de movimientos a partir de un cuadro basta con darle el argumento al programa, por ejemplo:

     ./toledo1 44

Y el programa simula el movimiento del caballo, listando la secuencia en la pantalla, marcada por los números 1 hasta el 64.

Por ser un programa reducido, es ideal para que los estudiantes de lenguaje C conozcan más a fondo el lenguaje, al limpiar el código y analizarlo pueden tardar semanas entendiéndolo, pero de seguro aprenderán mucho.

Semblanza

Oscar Toledo Gutiérrez nace en noviembre de 1978, en Naucalpan, Estado de México, como primogénito del matrimonio formado por Oscar Toledo Esteva y Hortensia Gutiérrez Mendoza, el joven Óscar se caracterizó en su infancia como un niño tranquilo, pero con una viva curiosidad por los acontecimientos de su alrededor. A la edad de tres años, inició el viaje maravilloso al mundo de la enseñanza, guiado de la mano de sus padres. En el momento de enseñarle en forma creativa el arte de leer, su madre Hortensia G. lo introdujo a un mundo de grandes expectativas, donde descubrió que el conocimiento crea hombres creativos.

Después de devorar cuanto libro encontraba dentro de su hogar, el pequeño Óscar a la edad de cinco años, vislumbró su verdadera vocación, entusiasmado con los programas que realizaba su padre en aquel tiempo, en lenguajes como el BASIC y el ensamblador, fue llevado por el impulso que tienen todos los niños de descubrir y jugar, comenzando a crear pequeños programas, algunos sin función y otros de estructura básica en torno a los juegos. Estos pequeños logros aplaudidos por sus padres, lo llevaron a realizar a la edad de diez años su primer programa funcional, para una de las computadoras que el padre diseñó, un software orientado a la edición de textos con interfaz gráfica, que era un paquete completo y autónomo para crear cartas, boletines y propaganda impresa, que fue de gran utilidad a la naciente organización Familia Toledo.

Siempre con el apoyo y el conocimiento que le brindaba su padre, comenzó una larga y exitosa carrera de avances y triunfos dentro de la programación, enfocándose en diversas áreas con horas dedicadas al aprendizaje de nuevas técnicas de programación, y acumulando años de experiencia en trabajo de campo, el joven Óscar fue forjando una carrera en la industria del software como programador en diversos lenguajes y máquinas, en forma totalmente autodidacta.

Apasionado por su trabajo, ha complementado su vida cotidiana con el estudio y las diversiones propias de sus edad, en sus ratos libres no es raro observarlo con un libro en mano, creando ideas para programas novedosos. Algunas veces jugando ajedrez, platicando con sus amigos o disfrutando un DVD, su mente siempre activa encuentra soluciones ingeniosas para problemas de programación. Su gusto por el cine, la música y el ajedrez, le imprimen un sello característico a sus creaciones al diseñar programas de aplicaciones diversas. Este año demostró que la pasión por el estudio rinde frutos, diseñando en sus ratos libres, tres complejos programas para participar en un concurso internacional, el IOCCC (International Obfuscated C Code Contest), el joven Óscar Toledo Gutiérrez de ahora 29 años, hizo que sus padres se sintieran orgullosos y además colocó en la palestra mundial del software a México, al ganar por segunda vez en uno de los eventos más importantes que se realizan dentro del area de la programación en E.U.A, y fue el primer y único ganador iberoamericano de dicho concurso, hasta el momento.

Libro, ligas y artículos relacionados

 

Artículo anterior Artículo anterior Lista de artículos Siguiente artículo Siguiente articulo