Friday, December 31, 2004

Description of the Microsoft Windows registry

This KB article is a jumping-off point for other articles about the registry.

WWIV Bulletin Board System

WWIV v5 and later will be released under Apache License v2.0 in order to better facilitate development.

Risking a serious Gerrk Jerk Burking here...

A readme file for Benny and Kenny, found on an old hard drive. The file is dated 1995-05-17, apparently when I first tried to release the game on the Internet.


Benny and Kenny Defense

Programming: Jeff Robertson
Idea for Game: Jeff Robertson
Story: Brandon Downey and Jeff Robertson

Note: The names of people in this game are real names. So what.

Benny and Kenny Defense is game in which you must defend your neighborhood from a gang of Scum led by the Twins of Terror, Benny and Kenny.

Instructions for running the game are found at the end of this file. This is my way of trying to make people read all about this thing before they play it.

History:

The origins of this game go back to 1990, and illustrate my habit of running things into the ground. At that time, my neighborhood had been subject to several petty crimes committed by a pair of twin kids named Benny and Kenny. My friend and associate, Mr. Brandon Downey, conceived of a plan (written out on notebook paper) to defend the neighborhood from the armies of "scum" (Downey's word) led by Benny and Kenny (where he got the idea that they had an army I don't know...). This called for a number of posts around the neighborhood, manned by residents and friends of ours, which would serve to ward off invasion. These locations included a "guerilla fortress", a "mutant lab", and an "emergency escape space shuttle". Downey wrote a very amusing narrative detailing a possible confrontation with the Scum, which proved so entertaining to everybody in our circle of aquaintences that he later wrote a sequal which involved Heinleinian (now THAT's a word) power armor or something like that.

For some reason which I wish I knew, I decided to make a game based on Brandon's story. The first version was written in Basic on the Commodore 64, and was somewhat simpler than the present version. There was no concept of forces at your command. You simply either attacked or you didn't. The game was slightly amusing to the same people that had read the story, and basically unknown to anybody else.

In 1991 (I think) the original Commodore 64 version was ported (ie, transcribed from hard copy) to GW-Basic. Nothing much came of the GW-Basic version.

In 1992 the game was completely re-written in QBasic. The ANSI screens were created at that time, though they have since been modified. This incarnation was located on the PS/2 in the library at my high school, and was played by whatever friends I could cajole into it. I also toyed with running it as a door on my BBS, but never actually got it to work. Damn Qbasic not using DOS interrupts!

In 1993 or '94 the game was modified to make battle more complex and (slightly) challenging. Its still pretty tame, really. The ANSI screens were also fiddled with. This version was placed on the computers in the Mallet Assembly Computer Lab (which you will only know about if you attended the University of Alabama, and even then probably not unless you were really cool). Thanks to the guys for discovering that it was possible to kill one Scum per turn by risking zero of your troops (this has been fixed, I hope).

Then I broke down and re-wrote the bloody thing in C. It now works as a door under WWIV. It will look for chain.txt (or whatever file name you give it as an argument) and get the player's name from there. If your BBS is something besides WWIV or you want to run the game standalone, it will ask the player for his/her name if any of the following is true :
A) chain.txt or the file you told it to look for is missing
B) you give it "local" as its command-line argument. Thus:

benny c:\bbs\chain.txt --- gets info from c:\bbs\chain.txt

benny local --- asks user for name

benny --- looks for chain.txt in current dir, if not found asks user for his/her name.

I have sworn to myself that I will not work on this game anymore, but I'll probably be breaking that promise sooner or later.

CBS News | $1.5M Homemade Bar Code Scam

I was actually, genuinely, surprised that the people arrested in this case are not people that I know personally... I know folks who've joked about doing this kind of thing for years, and when I saw the story I thought it must be them!

Sneak preview screenshot of Benny and Kenny in Java



I am not going to redo the graphics; I am working on code to convert the DOS screens to javax.swing.text.Document objects and display them in a JTextPane, since they are all just text anyway.

Except for the font not being quite right, the above actually looks more like the full-screen DOS version than the actual DOS version does when running in a window.

The Benny and Kenny Defense Plan

I have made a version of the Benny and Kenny Defense Plan game that doesn't require ANSI.SYS. In a return to my old habit over the years of periodically re-writing this old inside joke of a game I had been thinking about a Java version. Not ready to actually invest the time in that just yet, but to tide you over here's a modification to the C version so that will at least run out of the box on Win2K/XP without having to dork around with installing ANSI.SYS. This will allow even the truly lazy to experience this gerrky little game.

Direct Download Link

Note that for the full effect you should run the DOS prompt full-screen (hit ALT+ENTER), but its easier to take screenshots of a window.

Michael McCartey's Death Bunny

The Gregor-Cycle

Original game documentation:

Benny and Kenny Defense version 3
by Jeff Robertson

Benny and Kenny Defense (BK) is a strategy game pitting you against the evil twins, Benny and Kenny, and their armies of Scum. The first thing you must do is choose one of 10 locations at which to engage the enemy. You always start a battle with the maximum number of forces. The Scum only refresh their numbers at the beginning of each level.

In each round of battle, you will have the choice to retreat, fight, or quit. If you choose to fight, you will be asked how many of your force will actually take part in the combat for this round. This is important, because the more you attack with, the more damage you can do. Also, the more you attack with, the more you are risking. If you use all your forces, you could be completely wiped out !

If you kill all the Scum, then you go on to the next level.

If you choose to retreat, then you can fight the Scum at some other location. You will have your lost forces replaced, but the Scum will still only have what they had when you retreated. The drawback is that you can only retreat from 5 locations per level.

With each level, you get 5 more forces, but the Scum get 10 more, so at higher levels you must learn to be more careful !

Good luck !


Thursday, December 30, 2004

Creeper Ohio

This is the other Jeff Robertson who "also has a band" that is alluded to on the Flvxxvm Florvm pages.

I remember reading reviews/buzz on the Net and elsewhere about this artist as far back as 1996, which was about the time that I first made the FF homepage. I remember thinking that "Creeper" might become a household name at any time, which would lead to lots of people mixing me up with him.

I don't see evidence that he's produced a new album of late, but here's the MP3 of his song New Hit Single.

Wednesday, December 22, 2004

JAVA SSL Tutorial, VPN

Cool.

Monday, December 20, 2004

Begin: A Tactical Starship Simulation

A more complete site about this game, with bigger screenshots. They have the actual game for download.

Sunday, December 19, 2004

Home of the Underdogs - Entry: Begin 2: A Tactical Starship Simulation

One of the old hard drives I've been digging through has this game on it. I seem to recall that it rocked. Hard.

Friday, December 17, 2004

Me and my C64


jeff_c64, originally uploaded by jeff_robertson.

Circa 1986. I once had this picture up on my homepage with no explanation of what it was, and I started getting hatemail from people who thought I was somebody who liked to look at pictures of little boys using computers.


What running a BBS was really all about

/****************************************
 GIRL.C
 female detector for WWIV 4.xx
 by Jeff Robertson

 This is a simpler variant of ALERT.C
 that beeps when a female user logs on.
 It must be located in the same directory
 as your CHAIN.TXT file.

 ****************************************/

#include <stdio.h>
#include <dos.h>

#define DESIRED_SEX "F"
#define CHAIN_FILE "chain.txt"
#define READ "r"
#define SEX_LINE 6

int x;
char line[30];

FILE *chain_file;

int main()
{
    chain_file = fopen( CHAIN_FILE, READ);
    if ( chain_file == NULL ) exit(1);

    for( x = SEX_LINE ; x ; x-- )
        /* go through the lines before the sex line */
        (void) fgets(line, sizeof(line), chain_file);

    line[ strlen(line) - 1] = '\0';

    if ( strcmp( line, DESIRED_SEX ) == 0)
    {
        for (x=5; x; x--)
        {
            (void) sound(500);
            (void) delay(100);
            (void) sound(1000);
            (void) delay(100);
        }
        (void) nosound();
    }

    return (0);
}


And they were MY electronic walls

41/170: written works
Name: Moses #49
Date: Wed Jun 03 03:38:24 1992

I write these poems
on electronic walls
to be eventually
scrolled backwards
erased and forgotten

I found a notebook
of my mother's poetry
old, yellowed and aged
and I saw things I'd written yesterday
and I'd see them done before
forgotten bits of this
forgotten bits of that
it ended abruptly and I wondered why

I would stumble across
things I had written
things I had enjoyed writing
and things I had despised
but it's still the same
the words are lost and gone
and the words will come again
Ian McMurtry

Further proof that I invented the Buddy List

(yes, this is the long-lost code referred to in this post)

/*****************************************************
* watch.c --- continously finger internet addresses  *
*             until one of them logs on.             *
*             must be able to find finger and grep.  *
*             this program is best run in the back-  *
*             ground, as it will not exit until one  *
*             of the specified user is logged in.    *
*                                                    *
* by Jeff Robertson,  8/28/94                        *
*                                                    *
******************************************************/
 
 
#include <stdio.h>
#include <string.h>
#include <unistd.h>
 
#define AT '@'
#define DEFAULT_FILE ".watchrc"
 
void parse_address( char *, char *, char *);
int grep_for_address( char *);
 
main( int argc, char *argv[])
{
    char address[32];
    FILE *fp;
    int i, grep_status = 1;
 
    while ( grep_status)
    {
        /* finger the addresses from the command line  */
        for(i=1; i<argc; i++)
            grep_status = grep_for_address( argv[i]) && grep_status;
 
        /* read from .watchrc is it exists */
        fp = fopen( DEFAULT_FILE, "r");
        if (fp != NULL)
        {
            while ( fgets( address, sizeof(address), fp) != NULL)
            {
                address[ strlen(address) - 1 ] = '\0';
                grep_status = grep_for_address( address) && grep_status;
            }
            fclose( fp);        
        }
     }
 
    return 0;
}
 
/* do the actual work */
int grep_for_address( char *address)
{
    char user[16], host[32], command_line[64];
    parse_address( address, user, host);
    sprintf(command_line, "finger %s | grep %s", host, user);
    return (system( command_line));
}
 
/* get separate user and host names from an internet address */
void parse_address( char *a, char *u, char *h)
{
    while( *a && ( *a != AT))
        *u++ = *a++;
    
    *u = '\0';
 
    while( *h++ = *a++ );
    if (!strcmp(h,"")) 
        strcpy(h,"@");
}


Thursday, December 16, 2004

More BASIC goodies


DONKEY.BAS

DIM CAR%(900)
940 REM The IBM Personal Computer Donkey
950 REM Version 1.10 (C)Copyright IBM Corp 1981, 1982
960 REM Licensed Material - Program Property of IBM
975 DEF SEG : POKE 106, 0
980 SAMPLES$ = "NO"
990 GOTO 1010
1000 SAMPLES$ = "YES"
1010 KEY OFF: SCREEN 0, 1: COLOR 15, 0, 0: WIDTH 40: CLS : LOCATE 5, 19: PRINT "IBM"
1020 LOCATE 7, 12, 0: PRINT "Personal Computer"
1030 COLOR 10, 0: LOCATE 10, 9, 0: PRINT CHR$(213) + STRING$(21, 205) + CHR$(184)
1040 LOCATE 11, 9, 0: PRINT CHR$(179) + " DONKEY " + CHR$(179)
1050 LOCATE 12, 9, 0: PRINT CHR$(179) + STRING$(21, 32) + CHR$(179)
1060 LOCATE 13, 9, 0: PRINT CHR$(179) + " Version 1.10 " + CHR$(179)
1070 LOCATE 14, 9, 0: PRINT CHR$(212) + STRING$(21, 205) + CHR$(190)
1080 COLOR 15, 0: LOCATE 17, 4, 0: PRINT "(C) Copyright IBM Corp 1981, 1982"
1090 COLOR 14, 0: LOCATE 23, 7, 0: PRINT "Press space bar to continue"
1100 IF INKEY$ <> "" THEN GOTO 1100
1110 CMD$ = INKEY$
1120 IF CMD$ = "" THEN GOTO 1110
1130 IF CMD$ = CHR$(27) THEN GOTO 1298
1140 IF CMD$ = " " THEN GOTO 1160
1150 GOTO 1110
1160 DEF SEG = 0
1170 IF (PEEK(&H410) AND &H30) <> &H30 THEN DEF SEG : GOTO 1291
1180 WIDTH 80: CLS : LOCATE 3, 1
1190 PRINT "HOLD IT!"
1200 PRINT "YOU'RE NOT USING THE COLOR/GRAPHICS MONITOR ADAPTER!"
1210 PRINT "THIS PROGRAM USES GRAPHICS AND REQUIRES THAT ADAPTER."
1220 PRINT "PRESS THE SPACE BAR TO CONTINUE."
1230 DEF SEG
1240 IF INKEY$ <> "" THEN GOTO 1240
1250 CMD$ = INKEY$
1260 IF CMD$ = "" THEN GOTO 1250
1270 IF CMD$ = CHR$(27) THEN GOTO 1298
1280 IF CMD$ = " " THEN GOTO 1298
1290 GOTO 1250
1291 KEY OFF
1292 ON ERROR GOTO 1295
1293 PLAY "p16"
1294 GOTO 1300
1295 COLOR 31, 0, 0
1296 PRINT "THIS PROGRAM REQUIRES ADVANCED BASIC -- USE COMMAND 'BASICA'": COLOR 15, 0, 0: FOR I = 1 TO 9000: NEXT: RESUME 1298
1298 ON ERROR GOTO 0
1299 SCREEN 0, 1: IF SAMPLES$ = "YES" THEN CHAIN "samples": ELSE COLOR 7, 0, 0: CLS : END
1300 REM
1410 COLOR 0
1420 DEFINT A-Y
1440 SCREEN 1, 0: COLOR 8, 1
1450 DIM Q%(500)
1460 DIM D1%(150), D2%(150), C1%(200), C2%(200)
1470 DIM DNK%(300)
1480 GOSUB 1940
1490 GOSUB 1780
1500 CLS
1510 DIM B%(300)
1520 FOR I = 2 TO 300: B%(I) = -16384 + 192: NEXT
1530 B%(0) = 2: B%(1) = 193
1540 REM
1550 CX = 110: CLS
1590 LINE (0, 0)-(305, 199), , B
1600 LINE (6, 6)-(97, 195), 1, BF
1610 LINE (183, 6)-(305, 195), 1, BF
1620 LOCATE 3, 5: PRINT "Donkey"
1630 LOCATE 3, 29: PRINT "Driver"
1631 LOCATE 19, 25: PRINT "Press Space ";
1632 LOCATE 20, 25: PRINT "Bar to switch";
1633 LOCATE 21, 25: PRINT "lanes ";
1635 LOCATE 23, 25: PRINT "Press ESC ";
1636 LOCATE 24, 25: PRINT "to exit ";
1640 FOR Y = 4 TO 199 STEP 20: LINE (140, Y)-(140, Y + 10): NEXT
1650 CY = 105: CX = 105
1660 LINE (100, 0)-(100, 199): LINE (180, 0)-(180, 199)
1670 LOCATE 5, 6: PRINT SD: LOCATE 5, 31: PRINT SM
1680 CY = CY - 4: IF CY < 60 THEN 2230
1690 PUT (CX, CY), CAR%, PRESET
1700 DX = 105 + 42 * INT(RND * 2)
1710 FOR Y = (RND * -4) * 8 TO 124 STEP 6
1720 SOUND 20000, 1
1730 A$ = INKEY$: IF A$ = CHR$(27) THEN 1298 ELSE POKE 106, 0: IF LEN(A$) > 0 THEN LINE (CX, CY)-(CX + 28, CY + 44), 0, BF: CX = 252 - CX: PUT (CX, CY), CAR%, PRESET: SOUND 200, 1
1740 IF Y >= 3 THEN PUT (DX, Y), DNK%, PSET
1750 IF CX = DX AND Y + 25 >= CY THEN 2060
1760 IF Y AND 3 THEN PUT (140, 6), B%
1770 NEXT: LINE (DX, 124)-(DX + 32, 149), 0, BF: GOTO 1670
1780 CLS
1790 DRAW "S8C3"
1800 DRAW "BM12,1r3m+1,3d2R1ND2u1r2d4l2u1l1"
1810 DRAW "d7R1nd2u2r3d6l3u2l1d3m-1,1l3"
1820 DRAW "m-1,-1u3l1d2l3u6r3d2nd2r1u7l1d1l2"
1830 DRAW "u4r2d1nd2R1U2"
1840 DRAW "M+1,-3"
1850 DRAW "BD10D2R3U2M-1,-1L1M-1,1"
1860 DRAW "BD3D1R1U1L1BR2R1D1L1U1"
1870 DRAW "BD2BL2D1R1U1L1BR2R1D1L1U1"
1880 DRAW "BD2BL2D1R1U1L1BR2R1D1L1U1"
1890 LINE (0, 0)-(40, 60), , B
1900 PAINT (1, 1)
1920 GET (1, 1)-(29, 45), CAR%
1930 RETURN
1940 CLS
1950 DRAW "S08"
1960 DRAW "BM14,18"
1970 DRAW "M+2,-4R8M+1,-1U1M+1,+1M+2,-1"
1980 DRAW "M-1,1M+1,3M-1,1M-1,-2M-1,2"
1990 DRAW "D3L1U3M-1,1D2L1U2L3D2L1U2M-1,-1"
2000 DRAW "D3L1U5M-2,3U1"
2010 PAINT (21, 14), 3
2020 PRESET (37, 10): PRESET (40, 10)
2030 PRESET (37, 11): PRESET (40, 11)
2040 GET (13, 0)-(45, 25), DNK%
2050 RETURN
2060 SD = SD + 1: LOCATE 14, 6: PRINT "BOOM!"
2070 GET (DX, Y)-(DX + 16, Y + 25), D1%
2080 D1X = DX: D1Y = Y: D2X = DX + 17
2090 GET (DX + 17, Y)-(DX + 31, Y + 25), D2%
2100 GET (CX, CY)-(CX + 14, CY + 44), C1%
2110 GET (CX + 15, CY)-(CX + 28, CY + 44), C2%
2120 C1X = CX: C1Y = CY: C2X = CX + 15
2130 FOR P = 6 TO 0 STEP -1: Z = 1 / (2 ^ P): Z1 = 1 - Z
2140 PUT (C1X, C1Y), C1%: PUT (C2X, C1Y), C2%
2150 PUT (D1X, D1Y), D1%: PUT (D2X, D1Y), D2%
2160 C1X = CX * Z1: D1Y = Y * Z1: C2X = C2X + (291 - C2X) * Z
2170 D1X = DX * Z1: C1Y = C1Y + (155 - C1Y) * Z: D2X = D2X + (294 - D2X) * Z
2180 PUT (C1X, C1Y), C1%: PUT (C2X, C1Y), C2%
2190 PUT (D1X, D1Y), D1%: PUT (D2X, D1Y), D2%
2200 SOUND 37 + RND * 200, 4: NEXT
2210 FOR Y = 1 TO 2000: NEXT
2220 CLS : GOTO 1540
2230 SM = SM + 1: LOCATE 7, 25: PRINT "Donkey loses!"
2240 FOR Y = 1 TO 1000: NEXT
2250 CLS : GOTO 1540


The Evil Grinn BBS, 1994

Recently unearthed. These are some posts from my BBS from one summer when I came home from college and turned it back on for a while. See here for details of how this HTML was created.

Wow!
Slim #389
Mon Aug 15 04:26:42 1994
I can't believe it! All this time, and my account is still here!


uh-oh...
Spy'dr #1
Sun Aug 07 17:45:39 1994

Its almost back to school time, and this BBS has only 2 weeks to live.


Ahhhhh ...
Sp'ange #72
Tue Aug 16 09:41:09 1994
RE: Sad....
BY: Dodo Haha #20

I hate to see a WWIV board go down... Why don't more people use the WWIV
sofware...? I think it's the easiest to learn and the easiest to work with... I
think all the VBBS people should be shot...


8░░▒▒▓▓█ ▀▄   ▄▀ The Evil Grinn BBS ▀▄   ▄▀ █▓▓▒▒░░
7░░▒▒▓▓█ ▄ ▄ Bayou La Batre, AL ▄ ▄ █▓▓▒▒░░
6░░▒▒▓▓█ ▀▀▀▀▀ (205) 824 7363 ▀▀▀▀▀ █▓▓▒▒░░

Mallet video collection

A list of the vidoes in the library of the Mallet Assembly, from one of my terms as Librarian.

Mallet Video List

1. Leviathan
Little Shop of Horrors
Road House

2. Goonies
Armed and Dangerous
Quick Change

3. Green Card
Enemies: A Love Story;
Pet Semetary

4. Steel Magnolias
Look Who's Talking

5. UHF
American Gothic

6. The Cook, the Theif, His Wife and Her Lover
Annie Hall
Drugstore Cowboy

7. High Anxiety
Krull
Men at Work

8. Harlem Nights
Raw
Risky Business

9. We're no Angels
I was a Teenage Werewolf
Joe vs. the Volcano

Free DWG Viewer

For viewing those pesky Autocad files.

The Flvxxvm Florvm Cross-Reference

Found recently on an old disk.

Tuesday, December 14, 2004

BlueHarvest.net - Original Trilogy Video

This page may contain the entirity of the infamous Star Wars holiday special. I won't say for sure until after I've downloaded it.

(Update: yep, it do.)
Lumpy

Saturday, December 11, 2004

the essence of this blog

Last night at a Christmas party (no, not the office party, for any cow-orkers who may be reading.. I didn't go), I had an opportunity to try to briefly sum up the contents of this blog. The entries that I sited as absolutely typical were:

http://jeff_robertson.blogspot.com/2003/08/speaking-of-unicode-i-think-my.html
http://jeff_robertson.blogspot.com/2003/08/there-appears-to-be-no-unicode.html

With also a sideways mention of:

http://jeff_robertson.blogspot.com/2003/10/white-hot-masters-of-metal.html
http://jeff_robertson.blogspot.com/2004/03/i-feel-alright.html
http://jeff_robertson.blogspot.com/2003/06/classic-jeff-tue-12-dec-2000-184116.html

Friday, December 10, 2004

A t-shirt I'd like to see


staph, originally uploaded by jeff_robertson.


Thursday, December 09, 2004

DAV's Endian FAQ

The big-endian v. little-endian controversy, how to avoid stupid mistakes in hardware and software, ON HOLY WARS AND A PLEA FOR PEACE.
anyone who was brought up by computer scientists, rather than by botanists, knows that trees grow downward, having their roots at the top of the page and their leaves down below. Computer scientists seldom remember which way "up" really is.

Wednesday, December 08, 2004

Cheap and nasty java smtp client

This is for those situations where you want to send a short, plain-text email, and mail.jar and its associated dependencies are not available.

import java.io.*;
import java.net.*;

/**
 * A very, very basic SMTP client for sending one-liner emails.
 * Doesn't support authentication or anything else fancy. Use
 * only when your desire to not have to depend on mail.jar outweighs
 * the importance of the email ever actually getting there.
 *
 * @author  jeff_robertson@yahoo.com
 */
public class StoopidSmtpSender {
    
    private String host;
    private int port;
    private PrintStream logStream;
    
    public StoopidSmtpSender(String host, int port, PrintStream logStream) {
        this.host=host;
        this.port=port;
        this.logStream = logStream;
    }
        
    public StoopidSmtpSender(String host) {
        this.host=host;
        this.port=25;
    }

    public void send(String from, String to, String subject, String body) throws java.io.IOException {
        Socket s = new Socket(host, port);

        PrintStream ps;
        
        if( logStream == null)
           ps = new PrintStream(s.getOutputStream());
        else 
           ps = new PrintStream(s.getOutputStream()) {
                public void println(String str) {
                    logStream.println(str);
                    super.println(str);
                }
           };
           
        BufferedReader br;
        
        if( logStream == null)
            br = new BufferedReader( new InputStreamReader(s.getInputStream()));
        else
            br = new BufferedReader( new InputStreamReader(s.getInputStream())) {
                public String readLine() throws IOException {
                    String str = super.readLine();
                    logStream.println(str);
                    return str;
                }
            };


        br.readLine(); // read and throw away intial message    

        ps.println("HELO");
        br.readLine();    
        
        ps.println("mail from: <" + from + ">");
        br.readLine();    
        
        ps.println("rcpt to: <" + to + ">");
        br.readLine();    
        
        ps.println("data");
        br.readLine();    
        
        ps.println("Subject: " + subject);
        ps.println();
        ps.println(body);
        ps.println(".");
        
        br.readLine();    
        
        ps.close();
        s.close();
    }
}

Monday, December 06, 2004

Why Microsoft can Blow-Off with C#?

Funny. Poor English, but funny.

Friday, December 03, 2004

this is what I do with my red pens