Donkey.bas is 45 Years Old – 131 line of Glory
donkeybas.com
donkeybas.com
On a related note, I’ve actually spent the last four months working on a 100% faithful adaptation of both QBasic and QuickBasic 4.5 that runs entirely in the browser on a virtual CPU and hardware abstraction layer. It’s a love letter to everyone who learned to program on Microsoft’s BASIC interpreters in the ’80s and early ’90s.
The best compliment I’ve received so far is from friends who grew up in the same era I did: when I fullscreen the browser, a few of them assumed it was a virtual machine running the real thing.
A QBasic port of the original BASIC-based DONKEY.BAS was one of the first programs I got running in it:
I know someone who might, if we could figure out how to get it off a DOS 5.25" floppy!
I’ve got a fairly large collection of several hundred programs from the early to late ’90s that I’ve been carefully testing A/B testing against period accurate hardware and my simulator but actual professionally used QBASIC-based applications from back with the source intact are hard to come by.
Hardest part is usually trying to find working drives and a means of getting the data off the system.
However, if you are specifically dealing with PC floppies, it is potentially overkill (but it might still be the easiest way to hook up a 5.25" floppy drive to a modern computer).
5.25" drives may also need a separate power supply in addition to the greaseweazle, for 3.5" drives the GW has enough power to power the drive directly though.
I’ve already sunk hundreds of hours into building out the fidelity of QuickBASIC (everything down to emulating memory access so you can simulate realistic PEEKing and POKEing), so I don’t have the sanity points left to tackle any other variants myself, but I’d love to see a GW-BASIC version.
https://codeberg.org/tkchia/GW-BASIC
There are some binary releases there from 2022, but I did not try those. The binary I built from source has worked very well.
Never tried to build the DOS source, but I really enjoyed playing with the toolchain they included with the MS-DOS 4 source code release. It's pretty much a complete, MIT-licensed (but binary only) Microsoft toolchain (msc, masm, make, link, etc) from ~1988. For some of my recent hobby projects I put that toolchain in my git repos, to have everything self-contained, with DOSBox as a virtual machine both for building and running, and no other dependencies. So I am happy Microsoft released the DOS code, even if I did not look much at the code itself.
Remember this?
DoEventsI have a pair of Magneplanar speakers. They always impress people.
But your more typical use case was to play a single tone for some significant fraction of a second.
https://www.youtube.com/watch?v=chJrd9Kxbdw
It somehow sounds even better on an actual 80s PC, with the bass sound being amplified by the massive steel enclosure.
How far does the HAL go? Screen 12 and 13, and writing directly to VRAM? WAIT for vsync? Call absolute for mouse usage?
The HAL has a virtualized CPU, and I spent more time than I’d care to admit precisely timing instructions on various period-accurate hardware (386SX, 486DX). I even tuned it to the point where programs that take advantage of it actually run faster on the 486 because of the built‑in math coprocessor.
> Writing directly to VRAM? WAIT for vsync?
All screen modes are supported including the ability to draw to hidden pages. It’s got a fully emulated VGA hardware layer and even a synthetic VGA beam clock, so you can do tricks like `WAIT &H3DA, 8, 8` for vertical retrace to minimize flicker.
> Call absolute for mouse usage?
Yup! Int 33h is fully supported, we basically use a virtual TSR driver which is pointed to by the interrupt vector table. I actually tested it with an old pixel art editor I made in the 90s!
PEEK/POKE and much of the BIOS are fully simulated, so you can use more advanced QuickBasic 4.5 features like calling interrupts (including silly stuff like rebooting the computer via int 19h).
There's a ton more (including a Hayes compatible modem plugged into COM1) as well.
I basically dug out a stack of my old PC books from the late ’80s and early ’90s, and they’ve been my bibles for the past several months (Undocumented DOS, The Programmer’s PC Sourcebook, etc.).
It’s about 99% done at this point. I’m hoping to do a Show HN in the next couple of weeks.
In depth, thoughtful comments about someone deeply passionate about technology were the reason why HN became the place on the web for hackers.
Thanks for keeping the spirit alive!
You really can't create a QuickBasic interpreter with any expectation of accuracy unless you also flesh out the corresponding hardware that would have accompanied it back in the day.
What I’m really aiming for is to recreate the world we grew up with as kids in the late ’80s and ’90s. I want to tap into that feeling of discovering QuickBASIC on a computer for the first time and realizing you could bring your own creations to life.
For me, and I bet a lot of kids back then, QuickBASIC was the closest thing to sorcery: you could conjure whatever was in your imagination and watch it traced out pixel by pixel on your 14-inch VGA monitor.
For me, this project is really a love letter. It’s about recreating that nostalgic experience and also making it something others can just drop in and enjoy. You don't have to install DosBox, track down a copy of QBASIC and configure it with sane defaults for speed since many BAS programs which are CPU dependent are probably going to run way too fast.
You can run it anywhere you have a browser, because it runs entirely client-side. You can even share programs in other sites, since it ships with a small virtual interpreter. That means you can iframe BAS examples if you want to demonstrate how QuickBasic worked.
Yes the PC & donkey.bas were monophonic design, but the PCjr shipped with 3-channel polyphonic sound plus a noise generator. It might have been capable of doing the sounds in this port of donkey that took “some liberties”. ;)
I remember some sound demos on the PC that emulated polyphonic sound by fast/audible switching between notes in a chord. Hey it seemed cool at the time. :P I just looked and couldn’t find any quickly enough but bumped into examples of even better true polyphony on the PC achieved by assembly hacking.
Didn't know that about the PCjr! I'll have to see if I can find some examples of the generator online. Polyphony by rapidly switching between notes in a chord was also one of the common tricks on the SID chip for the C64.
Even though it has separate channels, you could use get away with a single channel to play triads by arpeggiating extremely fast between the three notes.
https://en.wikipedia.org/wiki/Arpeggio
Many of my favorite chiptunes use this technique.
...Until you found the BASIC dialect that came with MS-DOS, that is! GORILLA.BAS was bundled with DOS and was a fun little game you could play in those computers. It's not like you could access web games on the Internet - there was no Internet!
You could get a PC for a thousand bucks back then, and shareware was a thing in 1990-91. Crystal Caves, Commander Keen, Duke Nukem were huge hits and there were tons of less popular games...not to mention copying commercial games from friends.
I say presumably because I played their excellent Secret Agent HD port but haven't played Crystal Caves yet.
In the United States... In a lot of countries, computers cost a lot more than that in the local currency which, together with lower salaries, made computers inaccessible to most people.
I remember seeing people playing GORILLA.BAS in computer stores...
However QBASIC was likely the first freely available, all‑in‑one "batteries included" environment that came bundled with MS‑DOS 5 with a relatively friendly IDE that had built‑in help for every single command. GORILLA.BAS and NIBBLES.BAS were the gateway drugs for many future programmers.
I'm not saying we should go back to BASIC but that spirit of easy to build has been lost a little. Nowadays you need to pull in like 40 dependencies before things can get really moving. Yeah it is OK after that but the barrier to entry can be a little tough at times. This is the same complaint I have about multimedia on the web, Flash solved the issue in a terrible fashion but the core idea was great.
But just like QBASIC, it was a “batteries included.” environment. That’s what made it so compelling.
QBASIC was the same way. It's a literal siren song for inquisitive kids to just experiment, because everything is right there. Like you said, there’s no importing libraries. It’s a completely self-contained sandbox of possibilities.
If you have a question, you just slap that F1 on your buckler-spring mechanical keyboard and boom there’s documentation/examples.
And there were "IDEs" that sometimes were offered in cover tapes, at the expense of even lesser RAM, I got one for the Spectrum.
And the 8 bit computers with at least 128 KB, already could run CP/M, which opened the door for better BASICs, including compilers.
I could have worded that a bit better. What i meant was that as far as I'm aware, QBASIC was the first free OS-bundled fully featured BASIC IDE which even by today’s standards still kind of holds up:
• find and replace
• split panes
• an immediate mode
• debugging
• breakpoints
• built‑in help for every basic keyword and command.
• editing any lines (no need for line number at multiples of 10 to insert and modify at a later time)
In terms of commercial products, there were already a few to chose from, including the big brother Quick BASIC, which introduced its IDE in 1986.
QBASIC was a subset from QuickBASIC 4.5.
10 PRINT "YOU'RE DEFINITELY GOING TO GET FATIGUED"
20 PRINT "AFTER A FEW HUNDRED LINES OF TYPING THIS"
30 PRINT "IN AND MAKE A MISTAKE. HAVE FUN!"
40 PRINT CHR$(7)And this is how we got many of our games from the local library, or bookstore, Atari as example, but similar existed for the other 8 bit home computers,
Kind of reminds me of how most people don’t know “Korobeiniki” (Коробейники) by name, they just call it the Tetris song.
"Oh, yes-- I play in the orchestra. I am in the auxiliary percussion and artillery sections."
First time I played it was 8th grade, in Randy Seaman's Algebra class. He also had wolf3d on that machine.
- https://codepen.io/manz/pen/RmEQgv
For 131 lines?
Happy 45th Birthday to the IBM PC and Model F/XT
He was involved in setting up the radar systems at Pearl Harbor, much good that did.
I have said it for a very long time, Gates wasn't innovative in technology but he absolutely innovated in bringing the most ruthless business practices into software.
And you may also want to correct this one about the Pancake Sorting algorithm he invented as a student that was not improved for another 30 years: https://en.wikipedia.org/wiki/Pancake_sorting#The_original_p...
Never mind how compact, beginner-friendly, and just plain fun they were to use. It's been said countless times but I'll say it again - we've lost something over the years.
Then port it to UE if they are interested in skill reuse for future projects:
SDL has a lot of issues, and falls into the "only if you must" category. Still better than .NET or Java in many ways, as spacial audio is easy in the mixer. =3
> we've lost something over the years.
Indeed, Information Appliances were never general-purpose computers. Some people used to care about that sort of thing, and left civilization the GNU compilers as one of the most important intellectual artifacts of our generation. =3
That being said, SDL isn't actually that bad either. A minimal example is about 40 lines of code [1], not counting comments and blank lines, but including lines with just a curly brace which you could easily remove if you were concerned about size. A slightly more serious implementation of Snake runs about 345 lines of code [2].
And to be fair, DONKEY.BAS is also cheating slightly on the line metric by stuffing lines full of statements, like for example:
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
1. https://examples.libsdl.org/SDL3/renderer/01-clear/
2. https://examples.libsdl.org/SDL3/demo/01-snake/The only thing is that since the SDL example uses a 640x480 resolution, which corresponds to SCREEN 12, and in QBASIC it only gives you access to 16 indexed colors at once.
So you have to "cheat" by redefining a single entry (like index 1) throughout the loop with calculated RGB using the PALETTE command. It's basically the equivalent of palette color cycling used in some older games.
The basics (window, events, renderer) can be done in about 30 lines:
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
static SDL_Window* window;
static SDL_Renderer* renderer;
int main(int argc, char* argv) {
SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO|SDL_INIT_GAMEPAD);
SDL_CreateWindowAndRenderer("test", 640, 480, SDL_WINDOW_RESIZABLE, &window, &renderer);
SDL_Event event;
while(true) {
while(SDL_PollEvent(&event) != 0) {
if (event.type == SDL_EVENT_QUIT) {
goto ENDGAME;
}
//events go here
}
// update here
SDL_SetRenderDrawColor(renderer,0,0,0,255);
SDL_RenderClear(renderer);
// render here
SDL_RenderPresent(renderer);
}
ENDGAME:
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
}
I don't think you could get all of donkey.bas done in 131 lines, though. SDL3 does ship with an embedded debug font but that seems like cheating. You probably couldn't replicate the drawing code easily, it would probably need to be faked with images, and you'd need a font atlas for the text.I learned to program with BASIC. It was awful. I didn’t know how awful it was until many years later. So I don’t miss the language. But something I miss is how easy it was to learn what your machine was doing.
The DOS boot and config involved only two files: CONFIG.SYS and AUTOEXEC.BAT, that was it. Most programs were self-contained, so you could copy the directory to a floppy disk and run them on another machine. If you broke something, copy the files again and restart; that was it… I “broke” config and programs many times, and it was a good way to learn.
Other than that, either you would have machine code via DATA statement, be lucky that there was support for entering Assembly like on the BBC, or have the opportunity to actually get a proper assembler.
Edit: line 1750 is where it does a simple collision check and yep looks like it registers a collision without checking you’re past the donkey or not
OSX, Firefox, browser size 3326×2830 pixels. Only happens at or around that particular size - resizing the window fixes the issue.
TIL there is an “Advanced Basic”. I hope the naming was tongue in cheek.
EDIT: That must be the easter egg mentioned in the repo.
Gorillas.bas (it's more or less like worms, except with only 1 gorilla per team)
On the plus side: it was much prettier.
Similar experience I was stuck with Timex 2068 until the 386SX kind of became affordable enough for leasing, however our school had computer labs, thus I did my typography lessons on MS-DOS 3.3, on nice 5.25" inch floppies.