Sam Steele: Origins
(high pitched voice)Hi Sam!(/high pitched voice)
Woah. That was weird. I don’t even have my speakers on… and why does my imagination speak with HTML tags, anyway?
So, if I gonna start using this thing, I suppose I should get used to the interface. Today has been pretty uneventful, so we’re going to take a little trip through memory lane together. I’m hoping this will allow me to become comfortable with the GNOME LiveJournal client’s UI, as well as with myself, and you all, too.
Lets start out with a little bit about myself. I’m a 20 year old computer geek living in an apartment in Newark with my friends Jay and Rich. We all go to NJIT, which is about 3 blocks away. I originally met jay on PlanetOut, but that’s the focus for another story.
Today I want to share my geeky side. I never really thought of myself as a “geek” until recently. In fact, I remember back in 1999 my friend Charley invited me to join “geekdom”, and I turned him down. I have, however, always been fascinated by computers. I’ve been a computer programmer since I was like 3, but I was never part of the whole geek culture. I never played DnD, never read books, only used MS-DOS and Windows, and only programmed in BASIC.
BASIC.. that brings me back. Beginners All-Purpose Symbolic Instruction Code. Top-down program design (who uses GOSUB/RETURN anyway?), interpreted, and a memory limit of anywhere from 8kb to 64kb, depending on your system and interpreter.
My first experiences with BASIC were with GW-BASIC and QBasic on my dad’s IBM XT. All I really did was play around with CIRCLE and LINE, but it was an amazing experience. Here I was, telling the computer what I wanted it to do, and it did it! And it was graphical. Unlike what college tries to teach us, programming is art, not science. I don’t care what formula is used when I say LINE (3,3)-(5,5), I just know that it draws a white line.
Sadly, in 1992, my parents divorced, and my mom moved us to the USA. Without a computer. After a few months, she bought us an old IBM XT from a yard sale. It had MS-DOS 3.0, with a 10MB harddrive, and a double-density (360K) 5.25″ floppy drive. Programming on that just didn’t feel right though. It was on a desk in our basement, where it was cold, and dark, and it smelled funny. Eventually, our babysitter let us borrow her son’s old Commodore 64.
I WAS IN HEAVEN!!!!!111
The Commodore 64 is the most fun, amazing, warm, fuzzy, bestest in the world computer I’ve ever had the pleasure of programming with. The interface has a calming blue color scheme, and it greets you with the following, exciting message:
*** COMMODORE 64 BASIC V2 ***
64K RAM SYSTEM 38911 BASIC BYTES FREE
READY it says. READY for me to type something, to command it, to make it do something exciting! And exciting stuff I did! The Commodore’s keyboard is especially powerful. When programming on a PC, if I want to change colors, I need to issue a COLOR command. With the Commodore, I simply push the Commodore key + 2, which is clearly labled on the keyboard as “RED”. Right in the middle of my print statement, I could change colors, move the cursor, clear the screen, and all kinds of things! The commodore also had a whopping 16 colors, which was amazing compared to the 4 colors my CGA adapter could produce in the IBM XT.
Another amazing feature of the C64 was its hardware sprite system. By age 10 or so, I knew binary, simply because the manual had one little example of a grid, filled in with dots, with the numbers “2 4 8 16 32” at the top. They told you that if a dot was black, you added the value, and put the sum at the end of the line. At the time, I didn’t know how those went into RAM and were displayed on the screen, but I knew that, if I added up the dots, and POKEd them into memory, my pretty picture would appear. And because it was a sprite, I could move it! And it would automatically check for collisions! Now that was fun, but I didn’t like to do math. My C64 came with a disk labeled “Commodore C64 Disk Bonus Pack”, which included a sprite editor that let me visually draw a sprite, which was much more useful and fun.
By now, it’s 1995 – 1996. I’ve been using the Commodore, as well as the XT, for about 3 years. I’m in the Melvin H. Kreps middle school in East Windsor, NJ. I’ve been selected for a “new program” for “special” students who weren’t doing so well in classes. I did very poorly in 6th grade, didn’t do homework, had a lot of emotional problems, etc. So in 7th grade, they put me and my friend Shariq into the Kreps Acadamy, which was an alternative learning experience taught by Mr. Schreiber and Mrs. Hill. Mrs. Hill was an 8th grade history teacher, and she came to our room every day to teach history only. The rest was done by Mr. Schreiber. He was an amazing person, he was one of the “cool” teachers that rode a motorcycle and all that, but he was also a computer geek! We were given a lot of freedom in the kreps academy, and we had a lot of time to ourselves. He brought in his 386 computer with a VGA adapter for us to play with. It had MS-DOS 6.22 with Windows 3.11 for Workgroups. It was nice, but it was no Commodore. So I told him I was interested in programming, and that I had a commodore at home, and he said I could bring it in! So here I was, in school, being allowed to program in my free time on the platform I loved! This is when I started my first real project: EZ-Commodore. EZ-Commodore was a point-and-click based application launcher for the Commodore. It used a hardware sprite for the mouse, a cute little arrow I drew myself in the sprite editor. The rest of the display was made up of text, using the Commodore’s large amount of “graphical” characters that put the IBM ASCII character set to shame.
Sadly, I hit a wall. My program used too much memory for the poor Commodore’s 64KB of RAM. Both the tokenized program, as well as all my RAM requirements, had to fit into 64KB, and sadly my source was too big, and my RAM usage was too high, so eventually the Commodore overwrote my program with my variable data, and all was lost.
This is when I moved to Mr. Schreiber’s 386. I took the same concepts, and put together EZ-IBM, which was a TUI (Text user interface) menu system. It used the PC’s arrow keys to move a pointer around, which was simply a big yellow block. It wasn’t as pretty as the arrow I got to make for the Commodore, but it was functional. This was also the days before Windows 95 took off, and alternative user interfaces, such as Microsoft Bob, were the “next big thing”. I remember seeing an interface that used “houses” and “buildings” to represent things. I thought this was a really neat idea, and I designed a system that had ASCII-art buildings and “rooms” that you could “click” on things using my yellow, arrow-key controlled blocky cursor. It was called “SamWorld”, and I viewed it as my entire universe in which I could create anything I wanted, just by coding it. It had hand-coded animations. When you “clicked” (ok fine, pushed the space bar…) on a door, it would animate opening. It was fun. It was functional. It was art. The “rooms” were designed using a tool called ANSIPaint, which I got off my friend Aaron’s shareware disks. To this day, I’ve never been so comfortable with a drawing program. It was so simple and easy to use, yet so powerful. It allowed you to “draw” in ASCII, allowed you to pick colors (all 16 of them!), and included tools for line drawing, flood filling, and copy / pasteing sections.
In 8th grade, my friend Shariq introduced me to ZZT. ZZT is an ASCII Game Creation System. It was like ANSIPaint, but in a game! It allowed you to create objects, and it even included an object-oriented scripting engine. This was my first experience with a non-BASIC language besides LOGO, and my first experience with Object Oriented Programming. Instead of top-down, I was now thinking about message passing and events! ZZT was fun, but I was more interested in QBasic.
In the summer between 7th and 8th grade, I had my first experience with “the internet”. The Mercer County Library System had a BBS that allowed access to their library catalog, as well as the text-based browser, Lynx. I used this to visit qbasic.com, and downloaded a program called “chat.bas”. This program was a fake AI, which used a bunch of IF statements to reply to what the user typed. I was dazzled by this! I decided I had to create my own! And thus, CHIP was born. Computerised Human Interface Program. Now, whenever someone asks me why I used to use the nickname Chip, I’ll just send them here. I always say, “It’s a long story”, and it is. How many pages have I written so far? Anyway, CHIP was fun, but he wasn’t useful. I’d say “hi”, he’d say “hi” back, it was a thing we had… anyway, it was time CHIP earned a living, so I designed an “office secretary” based on him. He was later named Nexus by my friend TJ, a certified geek. Nexus was multiuser, he could leave “memos” for other users to read later, he could do math, and he had a simple natural-language based knowledge storage / retrieval system. He could also print text files, including memos, if you had a printer. Nexus had a graphical (well, ASCII) “creature” that would blink and move around and just be cute while he did his secretary work. The graphic I used was originally taken from a TRS-80 BASIC book, but I redrew him a little nicer, and adapted him to the PC’s display.
Ah, time for highschool. When I graduated 8th grade (they make a big thing about this in my school district), my mom bought us a “real” PC. It was an AMD-K5 PR75 that ran at 133mhz. We got ripped off big time, but it was a computer, and it had VGA! I decided it was finally time to revive EZ-Commodore in a form that would do it justice. I wrote up some library functions that immitated the Windows 95 GUI, with buttons and title bars. EZ-IBM became a graphical file manager, complete with icons. However, I again hit a wall. Because QBasic is a DOS application, it only has access to 64KB. While this is much more than the Commodore’s 32KB of BASIC RAM, it is still pretty limited. After loading all the icons and graphics, there wasn’t much room left in memory to load in a directory, and if you had too many files, it would run out of RAM and crash.
Around this time, my I convinced my parents to sign up for AOL, and I ran into a chat program called mIRC. Ahhh… so many hours I’ve wasted chatting on IRC… there, I met my friend Bill, who introduced me to “bots” on IRC. They were like Chip, only they were on the internet, and could talk to more than one person at a time! I did a lot of work with mIRC script, but nothing really amazing. Bill is a year older than me, and decided he was going to NJIT Mt. Laurel, and he also convinced me to go. Sadly, Bill is homophobic, and after he found out I was gay, we kinda stopped talking. I miss him sometimes, he was a really cool guy.
I also met my friend Keinall, or Granitor as his IRC handle was. Keinall was also a C64 fan, and in 1999, we decided we would recreate the Commodore experience on modern hardware, which didn’t have the same charm to it. And thus, project C99 was born. C99 for Commodore 99. Now when someone asks why I use the name “c99”, they’ll no longer have to hear “it’s a long story”, they can read the story for themselves. For historical purposes, original C99 homepage is still available here. The C99 project started out in QBasic. Yep, a BASIC interpreter written in BASIC. It was silly, it was crazy, but it was functional, and it was art. It was saying, I see the strength and weaknesses in QBasic, and I’ll use them to create an environment I’m more comfortable in. C99 got many improvements, it was able to read images of C64 disks, and load C64 tokenized basic files. I soon grew tired of this project, though. It had no focus, no direction, and while it was pretty, it wasn’t as functional or as fun as I had hoped.
So, back to Nexus, mIRC, and my friend Eric Busto. Fed up with the weaknesses of mIRC’s scripting language, I was determined to write an IRC bot. This required me to learn a new language that had internet access, C! Eric helped me out a lot while learning C. He would help me solve problems, and teach me new methods of programming. I decided my first task would be to port C99 to C. The first stage of this involved writing a helper library to simulate the commands I was used to. PRINT, COLOR, LOCATE were all gone. I didn’t know about conio at the time, so I wrote my own that generated ANSI escape codes to manipulate the screen. This was the beginning of libc99, which will be discussed in a little bit. While I did succeed in writing an IRC bot in C, I never really managed to port the BASIC interpreter and integrate it well, and both projects disappeared.
Enter the Dreamcast. Christmas 1999 I got a Dreamcast, and summer of 2000 I got a cd burner, and the copy protection on the Dreamcast had been thwarted! Apparently, there’s a “feature” in the Dreamcast BIOS that will allow it to boot CD-Rs, and now that it was open, we could write software for it! Of course, the very first thing I did was port libc99 to the Dreamcast, using Dan Potter’s libdream. In fact, I still have a binary of C99 that simply executes a PRINT statement saying “See you in the next release!” or so. Finally, the Dreamcast was a system that brought back the spark and enjoyment I got from programming with the Commodore! I brought together all my past experiences, ZZT, SamWorld, libc99 into one little demo, where you controlled a little ASCII happy face that could walk around in a little world. I named this project DreamZZT, and was allowed to work on it for my AP C++ midterm and final. After I graduated highschool, I made the first public release of DreamZZT 1.0, and recieved a lot of requests to make it actually support ZZT files. After months of hacking, DreamZZT 2.0 was kind of functioning. It was poorly designed, and had a lot of “glue” between the DreamZZT 1.0 engine, and the stuff required for real ZZT. It was a mess. I got frustrated and gave it up. The DreamZZT website is available here.
My next project was DCBlap, which was a 3D pong game for the Dreamcast. It was the first time I had used OpenGL, graphical textures, and sound effects. DCBlap was a fun project, and I really wish I had more time to maintain it. Right now it has fallen into the “too messy to deal with” stage, and I’ve begun to get frustrated with it, too. The DCBlap page is located here.
So here we are today. I’ve been improving libc99 ever since it was first created, and I’ve begun work on a rewrite of DreamZZT. This new version is much cleaner, faster, and better. It runs on MS-DOS, Windows, linux, and of course, the Sega Dreamcast. There have not yet been any public releases of DreamZZT 3.0, and I’m sure I’ll be posting more about it relatively soon.
I’ve skipped over a lot of stuff, because I’ve become tired of writing, and Gil is playing DDR and I want to play too, so perhaps some time in the future I’ll decide it’s time to delve into the inner workings of my mind again and share it with you.