diff --git a/2006/toledo2/.gitignore b/2006/toledo2/.gitignore index f993bed8b..07514efc8 100644 --- a/2006/toledo2/.gitignore +++ b/2006/toledo2/.gitignore @@ -1,2 +1,24 @@ +A +ADVENTUR/ +B +BASICS/ C +CPM64.COM +DBASEII/ +GAMES/ +KAYPROII.ZIP +KERMIT/ +MASTER/ +MFDISK/ +MODEM7/ +PRO8/ +SOURCE/ +THE-WORD/ +TINKER/ +WS33-1/ +WS33-2/ +WS33-KPR/ +WS33/ toledo2 +toledo2.alt +DDT.COM diff --git a/2006/toledo2/README.md b/2006/toledo2/README.md index ae8b4ce52..825ef4a87 100644 --- a/2006/toledo2/README.md +++ b/2006/toledo2/README.md @@ -18,13 +18,27 @@ make [Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) fixed a segfault in this program which was making it fail to work under macOS - it did not seem to be a problem under linux, at least not fedora. The problem was wrong variable -types - `int`s instead of `FILE *`s. It now works under both macOS and linux. -Thank you Cody for your assistance! +types - implicit `int`s instead of `longs` and two `FILE *`s. The `long` references +:-) were taken from [Yusuke Endoh](/winners.html#Yusuke_Endoh) and technically +it works if all the variables are `long` but this would trigger (if not +silenced) additional warnings and the correct type is `FILE *`. However changing +them all to `FILE *` (including some that are used as a file) cause compilation +errors. It might end up that a cast is sufficient or the wrong combination is +used but for now this will work and works with both macOS and linux. Thank you +Cody (and Yusuke)! + +To end execution press `ctrl-z`. As mentioned in the author's remarks and in the +below section, it is supposed to crash on termination though Cody noted this +does not seem to happen in macOS. He asks ironically: 'if it's supposed to crash +and it does not crash is it actually a bug or is it a feature? :-)' ### INABIAF - it's not a bug it's a feature! :-) By design this program is supposed to crash on termination. +You must type in caps (except in strings) and this program is indeed +case-sensitive. + ## Try: ```sh @@ -42,6 +56,13 @@ RUN To end the program hit ctrl-z. +### IABINAF - it's a bug it's not a feature! :-) + +Although the program does not crash when reading in `C.BIOS` it appears that the +CP/M emulator does not work as expected at least according to the author's +remarks. + +See also [bugs.md](/bugs.md) for more details. ## Judges' remarks: @@ -57,7 +78,8 @@ 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 +[Adventure](https://rickadams.org/adventure/) (in the directory `ADVENTUR` +within the `KAYPROII.ZIP` file referred in the author's remarks); walking in a maze of twisty little passages all alike is easier than understanding the code! @@ -65,55 +87,61 @@ the code! ## Author's remarks: This program emulates a complete [Intel(r) -8080](https://en.wikipedia.org/wiki/Intel_8080) -processor, along with a teletype and a disk -controller, just like at the start of the personal -computers revolution (circa 1975). +8080](https://en.wikipedia.org/wiki/Intel_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 +It needs an initial memory image to do something usable, so along with it you +will find two files ([C.BASIC](C.BASIC) and [C.BIOS](C.BIOS)). Rename +[C.BASIC](C.BASIC) to `C` (NOTE from the judges: running `make` will do this for +you), run the emulator, and et voila! you have the public domain Palo Alto [Tiny +BASIC](https://en.wikipedia.org/wiki/Tiny_BASIC) (by Li-Chen Wang), published in +the very first volume of [Dr. Dobb's Journal](https://en.wikipedia.org/wiki/Dr._Dobb%27s_Journal). -Type using uppercase letters, here are three example -programs, press Enter after each line: +Type using uppercase letters. Here are three example programs. Press Enter after +each line: -``` - 10 PRINT "Hello, world!" - LIST - RUN +```basic +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 +10 FOR A=1 TO 10 +20 PRINT A +30 NEXT A +LIST +RUN + +10 INPUT A +20 INPUT B +30 PRINT A+B +LIST +RUN ``` -Press Ctrl+Z to quit, by the way, the segmentation fault is +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? +All good programmers started learning +[BASIC](https://en.wikipedia.org/wiki/BASIC), now, what about a +[CP/M](https://en.wikipedia.org/wiki/CP/M) emulator? Download the following file (not included because of possible copyright and blah, blah): > -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. +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](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. +Now you have a running [CP/M](https://en.wikipedia.org/wiki/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: +To get a complete [CP/M](https://en.wikipedia.org/wiki/CP/M) system, you will need the following files +from the `KAYPROII.ZIP` (in the `SOURCE` directory): ASM.COM DDT.COM DUMP.COM ED.COM LOAD.COM PIP.COM STAT.COM SUBMIT.COM XSUB.COM @@ -121,39 +149,44 @@ from the KAYPROII.ZIP, SOURCE directory: To import them, you must run the emulator with an argument, by example: - prog DDT.COM +```sh +./toledo2 DDT.COM +``` When the A> prompt appears, do: - IMPORT DDT.COM +``` +IMPORT DDT.COM +``` -When it ends, do HALT, so the file is saved, and you can start +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: +from : -> -> -> +- +- +- -Some programs requiere installation to configure the terminal, +Some programs require 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 +It is simply the little brother of the +[Z80](https://en.wikipedia.org/wiki/Zilog_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). +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 +ANSI terminal: read --> Z=kbhit()?getch():0 write --> putchar(7[o]) @@ -164,34 +197,33 @@ Also add the following to trap Ctrl-C: #include signal(SIGINT, SIG_IGN); -On PC/DOS you need to add ANSI.SYS to CONFIG.SYS +NOTE from the judges: in Unix like systems `getch()` is part of curses but this +is not what is needed. -In *NIX the min 0 on stty is required, circa 2001 +On PC/DOS you need to add `ANSI.SYS` to `CONFIG.SYS`. + +In Unix the min 0 on `stty` is required but 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. +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 registers are in `o[]`. The main loop reads every +opcode and separates them in one of three common forms. A lot +of ternary 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 @@ -199,33 +231,36 @@ The following instructions do peripheral operation: 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: +### 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, + 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 +- The original version of this code was eaten by my C++ dog. -- I intended to make it simple to understand, +- 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 +- Why bother with prototypes? Every good C programmer can develop its C programs using only one function. diff --git a/2006/toledo2/toledo2.c b/2006/toledo2/toledo2.c index fa2919152..12ae76a2e 100644 --- a/2006/toledo2/toledo2.c +++ b/2006/toledo2/toledo2.c @@ -1,4 +1,6 @@ #include + #include + #include #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] @@ -17,7 +19,7 @@ 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; FILE *u, *e, *V, *v;x,y,z,Z; main(r,U)char**U;{ ++64506; FILE *u, *v; long e,V,x,y,z,Z; main(r,U)char**U;{ { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } diff --git a/bugs.md b/bugs.md index 51e751b30..88f57f4d7 100644 --- a/bugs.md +++ b/bugs.md @@ -1786,8 +1786,31 @@ exist or cannot be opened. ## [2006/toledo2](2006/toledo2/toledo2.c) ([README.md](2006/toledo2/README.md)) ## STATUS: INABIAF - please **DO NOT** fix +[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) fixed this program to +not crash in macOS (it appeared to work fine in fedora linux on an `x86_64` +architecture but he does not know if it crashed in macOS Ventura due to the fact +it is an `arm64` CPU - the Apple silicon chip). This fix, BTW, is a mix of a fix +by [Yusuke Endoh](/winners.html#Yusuke_Endoh) and Cody's. Nevertheless there are +two features that are not bugs and one bug (see below). + By design this program is supposed to crash on termination. +You must type in caps (except in strings) and this program is indeed +case-sensitive. + +## STATUS: known bug - please help us fix + +The author showed something like this in their remarks: + +```sh +./toledo2 DDT.COM +A> IMPORT DDT.COM +``` + +but the `A>` prompt never appears; instead it's just the same as if you +specified no arg. + + # 2007 # 2008 # 2009