Documentation, Games, Gaming, Retro

Windows 98SE on VirtualBox (with video and audio drivers)

Screen Shot 2015-12-04 at 1.00.52 AM

Why do this?

If you feel nostalgic for a bit of Windows 9x action, or you just want to play some old games that are between DOS and Windows XP, you can either build a retro PC gaming rig, or you can test the water with VirtualBox.

Once it’s all done, you too can see how pointless it all is. ūüôā

What you will need:

  • Windows 98SE ISO (unfortunately, I can’t help you here)
  • SCITech Display Doctor (this will be the video driver) –¬†
  • VirtualBox (
  • Optional downloads are available and listed in each section below.

Create the VM and Install Windows 98 SE

  1. Create new VM on Virtualbox Screen Shot 2015-12-03 at 10.50.03 PM
    • Type: Microsoft Windows
    • Version: Windows 98
    • RAM: 64MB
    • Create new fixed size HDD – 2GB (VDI is fine)
  2. Install Windows 98SE
    1. Boot with your 98SE ISO mounted (you’ll have to find this yourself)
    2. Boot with option 2 РStart computer with CD-ROM support Screen Shot 2015-12-03 at 10.53.04 PM
    3. Run fdisk and accept all the defaults to create a 2GB partition on your virtual drive.
    4. Restart the virtual machine
    5. Boot with option 2 – Start computer with CD-ROM support
    6. Format the virtual drive using format on the Windows CD
      • D:\win98\format c:
    7. Run: D:\setup.exe /ie /im /is /nr
      • /ie Disables create a boot disk (causes crashing on VBox and 98SE installer)
      • /im Disables checking conventional RAM
      • /is Disables scandisk
      • /iv Don’t disable billboards
      • /nr Disable registry check
    8. Run through the Windows installer with all the defaults Screen Shot 2015-12-03 at 11.01.46 PM
    9. After reboot – Boot from Hard Disk
    10. Enter your name and the CD key for Win98SE (98 key works too btw); install will continue.
    11. If everything went well, you should see Windows 98 desktop and hear some tragic music. ūüôā

Install Video Driver

  1. Shutdown Windows (and the VM)
  2. Edit Settings of the VM -> Storage -> Add another device to the IDE controller (click the CD with the green plus) and mount the scitech-display-doctor-7.iso file you downloaded earlier. Screen Shot 2015-12-03 at 11.13.20 PM
  3. You should see a CD drive with Sdd7 Рdouble click that then run the scitech-display-doctor-win-7.0 installer РExpress installation is fine. Screen Shot 2015-12-03 at 11.14.52 PM
    • You will eventually need to register the software. Unfortunately, it’s not sold anymore, but it is trivial to find a serial number for this via your favorite search engine.
  4. OS will restart, when it returns, SciTech Display Doctor will load. Either register it or start the 21 day trial.
  5. On the HOME page, underneath Current Configuration, there is a section called Active Features. Click ‘Disabled’ next to SciTech Display Driver then select SciTech Nucleus Driver and apply.¬†Screen Shot 2015-12-03 at 11.19.00 PM
  6. OS will reboot again (remember how annoying this used to be?)
  7. SciTech reloads and you’ll see that VESA VBE 2.0 Oracle VM VirtualBox VBE Adapter is now selected.¬†Screen Shot 2015-12-03 at 11.25.29 PM
  8. Minimize the window, right click Desktop then Properties then Settings
    • Here you should see Default Monitor on SciTech Display Doctor 7.0
  9. Change Colors to 16bit, apply, it’ll reboot again!
    • I’ve had issues trying to change resolution at the same time.
    • I’ve also had issues when the restart didn’t work – if so, restart the VM yourself – no need to go into safe mode, it should boot the second time OK.
  10. Right click Desktop -> Properties -> Settings; now you can select 1024×768 no problem.
  11. Hello accelerated Windows desktop!

Configure for (broken and basic) Internet access (NAT)

This will allow you to access the Internet, albeit in a basic and broken way.

  1. Start -> Settings -> Control Panel -> Internet Options -> Connections -> Setup
    1. I want to set up my Internet connection manually … or local area network (LAN).
    2. I connect through a local area network (LAN).
    3. Accept everything except for setting up a mail account.
    4. Internet Explorer 5 will load. I recommend that you download Opera 9.64 (Opera 10 and above doesn’t support Windows 9x) –¬†
    5. Firefox 2 also works, but I found it was about as useful as IE5.
    6. Windows Update is long dead.

Install DirectX8.1b (optional step)

  1. If you installed Opera 9.6 earlier, this is compatible enough to grab the file directly from the web via
  2. You will also need WinZip – grab this from
  3. Extract and install (via dxsetup.exe) the DirectX8.1b redistributable.
  4. Windows will reboot and you will now have DirectX 8.1 installed – you can verify this by running C:\windows\system\dxdiag.exeScreen Shot 2015-12-04 at 12.19.34 AM

Install AC97 soundcard (optional step)

The default VM setting is SoundBlaster 16 compatible. You can use the Windows Midi Synth, but I’ve seen some issues with games. In turn, we can use 9x drivers for AC97.

  1. If you installed opera 9.6, head over to -> Downloads -> AC’97 Audio Codecs (Software) -> Windows 95 for¬†Driver only.
  2. Install file then instead of rebooting Windows, choose reboot later then shut down the VM.
  3. Head into Virtualbox VM settings -> Audiot and change the Audio Controller from Soundblaster 16 to ICH AC97
  4. Boot the VM up, it’ll detect the AC’97 audio – install the driver then reboot againScreen Shot 2015-12-04 at 12.28.45 AM
  5. Should have audio and wavetable MIDI when it returns.
  6. You can test this by running C:\windows\system\dxdiag.exe again.

Screen Shot 2015-12-04 at 12.45.49 AM

Testing a Game

C&C Gold 95 doesn’t seem to work – will investigate further without dx8.1 since it comes with dx3.


Civilization 2 Ultimate Collection – works perfect (dx5 game)

Games, iOS

River Run – Android & App Store iOS

Supporting another local developer’s first game! Only 99c. Some cool updates promised, and it has an interestingly unique control mechanism. Music is¬†hilarious. Out on Android and iOS now.

Buy it here – Google Android Store

Buy it here – Apple App Store

River Run

River Run – Can you catch all the fish and avoid the pitfalls of the river?

The river is overflowing with fish. Can you catch them all?

Watch out for Mr Speedy and Mr Shark!
Also, make sure you rush the river to gather all the gold.

River Run!! Rush those rivers!

Control your boat’s speed by swiping the screen. Really easy to control, and some fun music to enjoy for all the family.

Really, the music is great. Whistle while you work!

River Rush, Hunter, Fishing, Boat, Park Patrol, Boat Driver, Driving, Water, Rapids, River Run

River Run

River RunRiver RunRiver Run

Games, iPhone

Killstreak Arcade – IOS and Android

Hey, so a buddy of mine released his first mobile game on Android and IOS App Store. Check it out, and support his cause. It’s a fun game and it’s only a buck.

 Killstreak Arcade

Killstreak Arcade


The power of killstreaks right at your fingertips! Chain kills together for huge bonuses and earn Killstreak Rewards to dominate the battlefield!

Killstreak Ardcade Screenshot 1Killstreak Arcade Screenshot 2

C#, Games, Programming

Programming the Space Invaders – C# XNA 4 – Part 1


Work in progress

So, I started writing Space Invaders with XNA/C#. I will extend this post once I actually finish the game. However, each milestoneI’m going to take the time to document it and write it here. Let me know if I need to flesh anything out. I hope I can help someone as I help myself. The link to download the actual Visual Studio project is at the bottom of this file, but below is the explanation of the code. I will improve it as I go. I’ve wrote a couple of things already, Pong and the majority of Arkanoid – unfortunately part of the collision detection really stumped me. I will return to it, but to take a break from the physics, I decided to start on Space Invaders. Here’s the outcome.

Please remember that I am not an experienced programmer and my way may not be either the best way or the right way. This is my journey and I will update the posts as I hit problems and learn how to do things in a better way, until the post becomes pointless and forgotten at which time I will ‘de-publish’ it. ūüėČ

This first section will be enough to set up the boilerplate required for the game, display your ship, allow you to move it with AD or Cursor LEFT, RIGHT.

Part 1 – Getting the ship on screen and moving it.

a. Create new Windows Game with XNA. Let’s call it Space Invaders. Drag the Ship.png file into your content pipeline and call it what you want. I call it Ship.
b. Create a new class called Ship.cs. This class will be the object that is your ship to fight the space invaders.
c. Before or after creating this class, we need to write the main program.

a. The graphics

The ship

b. Ship.cs – The player’s ship object/class

Include the XNA Framework in the class.
Include the XNA Framework Graphics subsystem in the class.

Create internal variables:

  • Texture2D shipTexture – this will hold the sprite image/picture.
  • Rectangle shipRectangle – this is the rectangle boundary of your sprite/ship (image, really).
  • Rectangle viewportBoundary – this rectangle contains the screen dimensions – the viewport.. the boundary.
  • public float shipVector – This contains the vector/direction/position of your ship. It will only move on one axis – X, or horizontal.¬†Publicly¬†accessible outside of the class.
  • public int shipLives – The number of lives your ship/player has left.¬†Publicly¬†accessible¬†outside of the class.

Create the methods:

  • Publicly accessible class method Ship. This will import into the class the image to load for the ship sprite, and the dimensions of the viewport/boundary at game initialization/load time/run time. ¬†Parameters are two, Texture2D shipTexture, and Rectangle viewportBoundary.
  • Publicly accessible method of type Rectangle called getShipRectangle. This populates the variable containing the rectangle boundary of your sprite/ship (image, really). Parameters are two integers: int shipVectorX, int shipVectorY. — MAY REMOVE THIS METHOD LATER.
  • Private ¬†void called startShip – using this to contain the object initialization sequence. — MAY HAVE VARIOUS STATE LOGIC HERE LATER WHEN IMPLEMENTING DEATH/REBIRTH/NEW LEVELS.
  • Public void called Initialize() – using this to call the initialization sequence from the outside. All this does for now is call startShip();
  • Public void called Draw. This is where the object/ship/sprite is redrawn every frame and essentially is how it ‘moves’ the ship. It accepts a SpriteBatch parameter called mainSpriteBatch. mainSpriteBatch is where I am going to load all my sprites/ships/aliens/projectiles [I think].
  • Public void called Update. This accepts no parameters but essentially handles the change in ship/sprite position. It will update the shipRectangle.X setting (position of the ship’s rectangle/boundary of the ship/sprite/image) to whatever has been set via the public floating point variable (ironically, casting/converting it to an integer) shipVector. — MAY REMOVE THIS TO PREVENT PUBLIC ACCESS TO THE SHIP’S POSITION WITHOUT GOING THROUGH A CLASS METHOD.

c. Game1.cs – The main game object/class

Create class variables:

  • Ship shipPlayer1. Defining that the variable shipPlayer1 will contain an object of the type Ship (our Ship class from earlier).
  • Rectangle viewportBoundary. This contains a rectangle of the screen dimensions, used for viewport boundary.

Create the methods:

  • In the class method, public Game1. Add the definition to create/instantiate the viewportBoundary rectangle to the desired resolution.
  • Within the protected method Initialize, set the graphics viewport object to have a backbuffer width and height of the desired resolution. Remember to call the ApplyChanges() method for the graphics viewport object.
  • Create private method called gameStart() – will use this to initialize the objects and settings back to the start of a game state, or for example a new level. For now, it just calls the shipPlayer1.Initialize() method. (Remember the Initialize method in the Ship class we wrote earlier? It calls that for the instantiated object you defined at the top of this class; shipPlayer1).
  • Update the protected method LoadContent() to load the sprite image for your ship into your object while instantiating it. shipPlayer1 = new Ship(Content.Load<Texture2D>(“Ship”), viewportBoundary); – Remember we set the parameters up for the class method earlier to accept a Texture2D and a Rectangle for both the image and the screen resolution rectangle. Also here we call the gameStart(); method.
  • Within the protected Update() method, I make a call to another method called inputKeyboard(); We also call the shipPlayer1.Update() method [This runs the Update method we wrote for the Ship class above, remember?]
  • Within the protected Draw() method, this is where we start our spriteBatch object, call shipPlayer1.Draw method and pass it the spriteBatch object, then we end the spritebatch object.
  • Create a private void method called inputKeyboard(). In here we just check for if the Escape key is depressed – if so then exit. If the A or Left cursor key is pressed then update the shipPlayer1.shipVector public variable to decrement by 10. — PROBABLY WANT TO CLEAN THIS UP USING A VARIABLE LATER. ¬†We also do the same for D or Right cursor, but increment the shipVector by 10.

When you compile, you should have a ship that moves around.

Download the Visual Studio 2010 project here:

Part 1


Game Business & Design

< My Unfinished Notes and Thoughts >

Game Design; Storytelling; Marketing; Customer Experience


  • Define goals
  • Create Ideas in meeting them
  • Experiment and test Ideas
  • Evaluate quality of Experiment
  • Evaluate quality of Idea
  • Evaluate quality of Goals
  • Repeat
  • Smallest amount to learn about player experience.
  • 1-2 week sprints, more results in agile iteration.
  • When playtest observation isn’t lame, game is fun(?)


  • Attitude
  • People
  • Well-defined goals
  • Well-communicated goals
  • Well devised tests

Defining Goals

  • Focus on the product.
  • See all goals through eyes of the customer.
  • Embrace constraints of time, technical and budget.
  • Define the majority customer market (and secondaries).

Game Design

  • Fun game.
  • Ideas are the design.
  • Playtests are the experiments.
  • Evaluate designs through playtest results.
  • Some designs work, some do not. Iterate, no matter how late.
  • Prioritize and fix worst problems.
  • Use playtest to prioritize work for next sprint; iterate.
  • Do not discard game designs on theoretical problems.
  • Experiment in game.


  • Quality Assurance
  • Balancing
  • Fun
  • ??
  • May generate ideas of how to solve actual problems more effectively.

Playtest Analysis

  • Is sample group having experience that was designed?
  • Is the experience GREAT?
  • What affects customer experience?
    • AI.
    • Art.
    • Audio.
    • Informative, tutorial, in-UI help.
    • Pacing
    • Difficulty

Playtest Quality Assurance

  • Design people involved in playtest
    • Helps with playtest evaluation
    • Prioritizing
    • Motivation
  • Do not prompt or front-load playtesters
  • Capture thoughts during experience
  • Post-mortem Q&A session unreliable
  • Read between the lines – what was NOT experienced.
  • No leading questions
  • Measure; Storytelling, Perception


  • Solutions to playtest problems can also iterate
  • Solve problems in correct prioritized order
  • Do not oscillate.
  • Finish successful elements before iterating further.
  • Optimize most successful elements.
  • Measure risk, speed, cost.


  • Research
  • Online; auto updates, anti-cheat, communications/community.
  • Product delivery.

Product success measured: Number of players vs time.

Thanks: Valve Corporation


Games Studios Closed since 2006

3D Realms Р2009
7 Studios (Activision) Р2011
ACES Studio (Microsoft) Р2009
Action Forms Р2009
Ascaron Р2009
Atomic Elbow – 2008
Backbone Vancouver
Beam Software/Melbourne House Р2010
BigBig (Sony) Р2012
Bizarre Creations (Activision) Р2010/2011
Black Rock (Disney) Р2011
Blue Fang Games Р2011
Blue Tongue (THQ) Р2011
BottleRocket Р2009
Brash Entertainment Р2008
Budcat (Activision) Р2010
Carbonated Games Р2008
Castaway Entertainment Р2008
Cheyenne Mountain Р2010
Cing Р2010
Clover Studios (Capcom) Р2006
Codemasters Guildford Р2011
Cohort Studios Р2011
Concrete Games Р2008
Deep Silver Vienna Р2010
DICE Canada Р2006
Digital Anvil Р2006
EA Chicago Р2007
EA Bright Light Р2011/2012
EA Japan Р2007
Eidos Manchester Р2009
Eidos Hungary Р2010
Empire Interactive Р2009
Ensemble Studios (Microsoft) Р2008
Factor 5 Р2009
FASA (Microsoft) Р2007
Fizz Factor Р2009
Flagship Studios Р2008
Flight Plan Р2010
Frozen North Productions
FuzzyEyes Р2009
Gamelab Р2009
Game Republic Р2011
GRIN Р2009
Groove Games Р2010
Helixe (THQ) Р2008
Hudson Entertainment Р2011
Humannature Studio (Nexon Vancouver) Р2009
Ignition London Р2010
Ignition Florida Р2010
Incognito Entertainment (Sony) Р2009
Indie Built (Take-Two) Р2006
Iron Lore Р2008
Juice Games (THQ) Р2011
Kaos Studios (THQ) Р2011
Killaware Р2011
Killspace Entertainment Р2011
KMM Brisbane Р2011
Krome Studios (might still be operating on skeleton crew) Р2010
Kuju Manila Р2009
Kuju Chemistry Р2009
Kush Games Р2008
Locomotive Games (THQ) Р2010
Loose Cannon Studios – 2010
Luxoflux Р2010
Mass Media (THQ) Р2008
Monte Cristo Р2010
Monumental Games Р2012
Midway Austin Р2009
Midway Newcastle Р2009
MTV Games Р2011
Multiverse Р2012
NetDevil Р2011
Ninja Studio Р2009
Nihon Telenet Р2007
Outerlight Р2010
PAM Development (Take-Two) Р2008
Pandemic Australia (EA) Р2009
Pandemic LA (EA) Р2009
Paradigm Entertainment Р2008
Pi Studios Р2011
Pivotal Games (Take-Two) Р2008
Propaganda Games (Disney) Р2011
Pseudo Interactive Р2008
Rainbow Studios (THQ) Р2011
Razorworks Р2009
Realtime Worlds Р2010
Rebellion Derby Р2010
Red Octane Р2010
Redtribe – 2008
Rockstar Vienna Р2006
Sandblast Games (THQ) Р2008
SEGA San Francisco Р2010
Sensory Sweep Studios Р2010
Seta Р2008
Shaba Games (Activision) Р2009
SideCar Studios – 2007
Sierra Online – 2008
Snapdragon Games Р2009
SOE Denver Р2011
SOE Seattle Р2011
SOE Tuscon Р2011
Stormfront Studios Р2008
Straylight Studios Р2009
Team Bondi Р2011
The Code Monkeys Р2011
Titan Studios Р2009
THQ Studio Australia Р2009
THQ Digital Warrington Р2009
Transmission Games/IR Gurus Р2009
Ubisoft Brazil Р2010
Underground Development/Z-Axis (Activision) Р2010
Universomo (THQ) Р2009
Venom Games (Take Two) Р2008
Vicarious Visions California Р2007
Visceral Australia (EA) Р2011
Wolfpack Studios Р2006
Yuke’s Company Of America Р2010
Zoe Mode London Р2009
Zoonami – 2011