Add preview of 1984-2019
The 2020 winners are hinted it, but the source code is not there,
nor are the hints. Someone could look into the HTML and
see what was commented out, but that is not a problem because
WHO won is known and the name of their AWARD is known already.
Moreover a number of the winners have talked about what their
entirs do, so the commented out spoiler text is not a bit problem.
One will find HTML commented out with:
<!-- XXX remove when 2020 is ready
2020 links here
XXX remove when 2020 is ready -->
The "XXX remove when 2020 is ready" string is found at the
start and end comment blocks. Again, soneone could read
what was commented out, but that is OK since most of that
information is known or can be known. The following files
have such HTML comment blocks in them.
./winners.html
./years-spoiler.html
./years.html
In addition, ./all/summary.txt was modified to not
include the 2020 entries for the momemt.
The 2020 winner code AND write-ups are NOT part of this set.
p.s. The all/all.tar.bz2 does not contain the 2020 source code (yet?).
This commit is contained in:
1 parent
28efc67f5d
commit
c0663537cb
1683 files changed
+220064
No files matched your search
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,39 @@
|
||||
# 2006 makefile
|
||||
#
|
||||
# Copyright (C) 2006-2009, Landon Curt Noll, Simon Cooper, Peter Seebach
|
||||
# and Leonid A. Broukhis. All Rights Reserved. Permission for personal,
|
||||
# educational or non-profit use is granted provided this copyright and
|
||||
# notice are included in its entirety and remains unaltered. All other
|
||||
# uses must receive prior permission from the contest judges.
|
||||
|
||||
# Special flags for this entry
|
||||
#
|
||||
#CFLAGS=
|
||||
|
||||
# data files for this entry
|
||||
#
|
||||
DATA=C C.BASIC C.BIOS
|
||||
|
||||
|
||||
build: ${ENTRY}
|
||||
|
||||
|
||||
clean:
|
||||
-${RM} ${ENTRY} C
|
||||
|
||||
|
||||
clobber: clean
|
||||
|
||||
|
||||
alt:
|
||||
|
||||
|
||||
data:
|
||||
|
||||
|
||||
${ENTRY}: ${ENTRY}.c ${DATA}
|
||||
${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY}
|
||||
|
||||
C: C.BASIC
|
||||
${RM} C
|
||||
cp C.BASIC C
|
||||
@@ -0,0 +1,199 @@
|
||||
# Best of Show
|
||||
|
||||
Oscar Toledo
|
||||
Av. Santa Cruz del Monte 9-304
|
||||
Ciudad Satelite. Edo. de Mexico
|
||||
CP. 53110
|
||||
Mexico
|
||||
|
||||
## Judges' comments:
|
||||
|
||||
### To build:
|
||||
|
||||
make toledo2
|
||||
|
||||
### Try:
|
||||
|
||||
cp C.BASIC C
|
||||
./toledo2
|
||||
|
||||
We're impressed! Last year, it was a 6502 emulator; this year,
|
||||
it's 8080! It requires an input file ("C") to be present, but
|
||||
it does not have to be one of C.BASIC or C.BIOS - you're welcome
|
||||
to write a standalone 8080 program yourself! How about C.FORTH
|
||||
or C.LISP?
|
||||
|
||||
In addition to the functionality you could expect from a program
|
||||
of this size, it allows importing files from the host file
|
||||
system (one by one, so you'll have to be patient).
|
||||
|
||||
Remember the good old days and play (or let your kids play)
|
||||
Adventure (in the directory ADVENTUR within the KAYPROII.ZIP
|
||||
file referred in the author's comments); walking in a maze of
|
||||
twisty little passages all alike is easier than understanding
|
||||
the code!
|
||||
|
||||
## Author's comments:
|
||||
|
||||
This program emulates a complete Intel(r) 8080
|
||||
processor, along with a teletype and a disk
|
||||
controller, just like at the start of the personal
|
||||
computers revolution (circa 1975).
|
||||
|
||||
It needs an initial memory image to do something
|
||||
usable, so along it you will find two files
|
||||
(C.BASIC and C.BIOS). Rename C.BASIC to C and run
|
||||
the emulator, and et voila! you have the public
|
||||
domain Palo Alto Tiny BASIC (by Li-Chen Wang),
|
||||
published on the very first volume of Dr. Dobb's
|
||||
Journal.
|
||||
|
||||
Type using uppercase letters, here are three example
|
||||
programs, press Enter after each line:
|
||||
|
||||
10 PRINT "Hello, world!"
|
||||
LIST
|
||||
RUN
|
||||
|
||||
10 FOR A=1 TO 10 10 INPUT A
|
||||
20 PRINT A 20 INPUT B
|
||||
30 NEXT A 30 PRINT A+B
|
||||
LIST LIST
|
||||
RUN RUN
|
||||
|
||||
Press Ctrl+Z to quit, by the way, the segmentation fault is
|
||||
normal at this point.
|
||||
|
||||
All good programmers started learning BASIC, now, what about a
|
||||
CP/M emulator?
|
||||
|
||||
Download the following file (not included because of possible
|
||||
copyright and blah, blah):
|
||||
|
||||
> <http://www.retroarchive.org/cpm/os/KAYPROII.ZIP>
|
||||
|
||||
Extract CPM64.COM from the SOURCE directory, and copy it to
|
||||
files named A and B (these will be the disk drives). Now rename
|
||||
the provided C.BIOS to C and run the emulator.
|
||||
|
||||
Now you have a running CP/M system!, with two files on A: drive,
|
||||
HALT.COM to stop the emulator (so it closes drives) and IMPORT.COM
|
||||
to introduce new files.
|
||||
|
||||
To get a complete CP/M system, you will need the following files
|
||||
from the KAYPROII.ZIP, SOURCE directory:
|
||||
|
||||
ASM.COM DDT.COM DUMP.COM ED.COM LOAD.COM
|
||||
PIP.COM STAT.COM SUBMIT.COM XSUB.COM
|
||||
|
||||
To import them, you must run the emulator with an argument, by
|
||||
example:
|
||||
|
||||
prog DDT.COM
|
||||
|
||||
When the A> prompt appears, do:
|
||||
|
||||
IMPORT DDT.COM
|
||||
|
||||
When it ends, do HALT, so the file is saved, and you can start
|
||||
the same process with another file.
|
||||
|
||||
At this time I have tested successfully the following software
|
||||
from retroarchive.org:
|
||||
|
||||
> <http://www.retroarchive.org/cpm/lang/c80v30.zip>
|
||||
> <http://www.retroarchive.org/cpm/lang/Mbasic.com>
|
||||
> <http://www.retroarchive.org/cpm/business/MULTPLAN.ZIP>
|
||||
|
||||
Some programs requiere installation to configure the terminal,
|
||||
locate ANSI or VT-100.
|
||||
|
||||
### What is an 8080?
|
||||
|
||||
It is simply the little brother of the Z80, it has no extended
|
||||
registers (AF', BC', DE', HL', IX or IY), no relative jumps,
|
||||
and every instruction beginning with CB, DD, ED or FD doesn't
|
||||
exist.
|
||||
|
||||
The flags are only S (Sign, bit 7), Z (Zero, bit 6), P (Parity,
|
||||
bit 2) and C (Carry, bit 0).
|
||||
|
||||
### 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 need to add ANSI.SYS to CONFIG.SYS
|
||||
|
||||
In *NIX the min 0 on stty is required, circa 2001
|
||||
it was not required.
|
||||
|
||||
.
|
||||
.
|
||||
.
|
||||
|
||||
### How it works (SPOILER)
|
||||
|
||||
.
|
||||
.
|
||||
.
|
||||
|
||||
The l array contains the 64K memory, it is initialized with a
|
||||
boot image loaded from the 'C' file, the program counter is the
|
||||
c pointer, and regitser are on o[]. The main loops reads every
|
||||
op-code and separates it in one of three common forms, a lot
|
||||
of trinary operators selects the instruction.
|
||||
|
||||
o[0] = B register o[1] = C register
|
||||
o[2] = D register o[3] = E register
|
||||
o[4] = H register o[5] = L register
|
||||
o[6] = Flags o[7] = A or accumulator
|
||||
|
||||
The following instructions do peripheral operation:
|
||||
|
||||
76 Quits emulator
|
||||
DB 00 Reads key pressed status
|
||||
DB 01 Reads key
|
||||
DB 02 Reads byte from file (Carry=EOF)
|
||||
D3 xx Writes byte from acc. to console
|
||||
ED ED 02 Reads sector
|
||||
ED ED 03 Writes sector
|
||||
|
||||
Memory addresses:
|
||||
|
||||
FBFA = Low source/target direction
|
||||
FBFB - High source/target direction
|
||||
FBFC - Sector
|
||||
FBFD - Low cylinder
|
||||
FBFE - High cylinder
|
||||
FBFF - Drive.
|
||||
|
||||
The BIOS is tailor made for this emulator, and helps to simplify it.
|
||||
|
||||
Other notes:
|
||||
|
||||
- The 8080 runs at your computer speed divided
|
||||
between a number that I have not calculated.
|
||||
- This obfuscated processor is created using
|
||||
obfuscated code produced by an obfuscated mind,
|
||||
no brains were harmed during its production,
|
||||
except those that tried to read the code.
|
||||
- The original version of this code was eated
|
||||
by my C++ dog.
|
||||
- I intended to make it simple to understand,
|
||||
it uses only four C keywords.
|
||||
- Also I discovered that braces are very useful
|
||||
for commenting.
|
||||
- Why to bother with prototypes?, every good C
|
||||
programmer can develop its C programs using
|
||||
only one function.
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
#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)); }
|
||||
Reference in new issue
Block a user