Planet Industrious Rabbit

Here you’ll find regularly updated posts from the various places where The Industrious Rabbit happens – across the Fediverse, here on this blog, and in the various apps that support the project.

Bun Runner Devlog -- 2025-01-10

Via Blog -- The Industrious Rabbit

January 10, 2025 12:00 AM

Not much in the way of visuals to show this week. My focus has been to flesh out more of the unit test suite, allowing me to fix a few bugs in the process as well as perform some nice optimizations on some oft-called code.

I also discovered a good, extensible approach to building switch statements in assember without using a big list of CMP/BEQ statements, which requires writing lots of code and is also costly execution-wise. Any code I’ve run into that uses the CMP/BEQ approach I’ve been converting to this new approach, which is another reason for no real visuals this week.

The approach comes from a post on English Amiga Board: https://eab.abime.net/showpost.php?p=1548231&postcount=7

The example in the post is specific to the original asker’s use case, so I’ll provide a more generic example for DevPac, along with a unit test written in CuTest for SAS/C:

; switch.asm   ENUM ; MyChoices  EITEM ItemOne  EITEM ItemTwo  EITEM ItemThree   ; make accessible to C  XDEF _MySwitch  ; @inreg D0 enum MyChoices ; @outreg D0 final value _MySwitch:  ADD.W D0,D0 ; jumpTable entries are word sized  MOVE.W .jumpTable(pc,D0.W),D0 ; get the offset from .jumpTargets  JMP .jumpTargets(pc,D0.W) ; go!  .jumpTable:  ; these are in enum order  DC.W .itemOne-.jumpTargets  DC.W .itemTwo-.jumpTargets  DC.W .itemThree-.jumpTargets  .jumpTargets: .itemOne:  MOVE.L #4,D0  RTS  .itemTwo:  MOVE.L #20,D0  RTS  .itemThree:  MOVE.L #50,D0  RTS 
// switch_test.c #include "cutest.h"  enum MyChoices {  ItemOne,  ItemTwo,  ItemThree };  // this looks for an exported _MySwitch symbol uint32_t __asm MySwitch(register __d0 uint32_t myChoice);  void T_switch(CuTest *tc) {  uinit32_t result;   result = MySwitch(ItemOne);  CuAssertIntEquals(tc, 4, result);   result = MySwitch(ItemTwo);  CuAssertIntEquals(tc, 20, result);   result = MySwitch(ItemThree);  CuAssertIntEquals(tc, 50, result); }  void switchSuite(CuSuite *suite) {  SUITE_ADD_TEST(suite, T_switch); } 

Bun Runner Devlog -- 2025-01-03

Via Blog -- The Industrious Rabbit

January 3, 2025 12:00 AM

Look at that smooth fade in:

Bun runner game map and sprite fade in from black

The palette manager I talked about on 2024-12-22 is finally plugged in at the right place to allow the game to fade in the palette from black (or, really, any color) when the level starts up.

Interfaces, implementations, and dependencies

As I’m writing unit tests for all this, it’s required me to really think a lot about how to structure everything. Originally, I had mashed together a lot of the implementation details into what I call the Game Screen, the main display of the game. This includes:

  • double buffering
  • palette color definitions
  • the Copperlist definition
  • an implementation of “wait for bottom of frame”
  • RastPort building for the lower part of the screen for using AmigaOS graphic routines like text drawing

This is a very shallow interface! And these also bring in a lot of dependencies. This makes unit testing difficult, and would make future reuse challenging as well. I ended up splitting out some of the Copperlist handling and the palette definitions to separate modules. The palettes are currently hardcoded via INCBIN, but they’ll soon enough be loaded dynamically for each level, so they need to be in a separate place anyway.

This allowed me to write some very specific tests for the following:

  • ensuring a palette fade structure could be built for all three palettes: the foreground, background, and sprite palettes. This structure is essentially a multidimensional array built to be easily iterated in assembler.
  • ensuring that I can pick an index in that multidimensional array and set the game screen Copperlist colors from that array data correctly
  • walking through the “level starting up” logic, which includes:
    • prepping a bunch of state and setting default copperlist colors
    • pausing for specific numbers of frames in between palette changes or when about to start the game

Mocking Amiga system libraries in unit tests

Anthropomorphic female squirrel in front of a bulleting board with cards with numbers

Testing that the pauses were working correctly was an additional challenge. I actually built out the ability to mock Library Vector Offset (LVO) routines in libraries so that I can call WaitTOF() directly in the code and not have to deal with:

  • some hacky solution in the assembler code to allow mocking
  • the inability to spy on real library function calls w/o patching the library itself
  • undesired side effects in unit tests like having real frame delays

I covered Library Vector Offsets a little bit in my video about revisiting the AMOS Pro BSDSocket code I wrote 20+ years ago, but never went into precise detail as to what they are. Essentially, they are a list of JMP instructions that live at negative offsets from the library’s base that you get from OpenLibrary(). The stuff actually at the library base varies – for the Graphics library, for example, it includes links to interrupts, fonts, and other data you’d want for OS-compliant graphics routines.

Using an LVO in assembler looks like this. There may be some sugar around the JSR call and how you get the LVO, but it all turns into this eventually:

_LVOWaitTOF EQU -270   MOVE.L _GfxBase,A6  JSR _LVOWaitTOF(A6)  ; the next instruction 

A6 is the address register that AmigaOS always uses for LVO-based calls. There’s no technical reason, just convention. JSR is “Jump to Subroutine”, which pushes the memory location of the next instruction onto the stack and changes the code executation location to the provided address. In this case, that address is “whatever is in A6 minus 270”. JSR expects that you’ll eventually RTS, or “Return from Subroutine”, which involves changing the code execution location to the value that’s popped off the stack.

What’s at “whatever is in A6 minus 270”? It’s this:

 JMP <place where the code actually lives> 

JMP is “Jump to Location” and it doesn’t expect that you RTS. However, the code that you do jump to does RTS, which means you’ll end up back where you left off in you own code anyway.

LVOs are always 6 bytes away from each other. Why six bytes? Because that’s how many bytes it takes to hold a JMP instruction:

4EF9 FFFF FFFF ; 4EF9 == JMP, FFFF FFFF == 32-bit (4 byte) memory address 

Check out the chart here for more opcode details: https://info.sonicretro.org/SCHG:68000_ASM-to-Hex_Code_Reference

This approach means you can change the contents of a library function to your heart’s content and not have to worry about updating function calls when you release a new version. The address of the JSR may change, but the LVO won’t (and can’t!).

Library bases in C and Assembler

_GfxBase is another Amiga library convention. C compilers like SAS/C can automatically open and close libraries for you, if they have the right information. When they do this, they normally place the address of the base of the library in a global variable. The name of that global variable comes from the library’s fd file, in the ##base field. That global variable is then used to JSR to the correct LVO and put the function’s parameter values in the correct registers. Look up pragma libcall in the SAS/C Development System Library Reference for details on how that works.

On the C side, if you do nothing but use Graphics library routines, you get that global _GfxBase variable (seen as GfxBase-no-underscore in C because of how variable and functions are made public in C code). With the right included file setup, your assembler routines that use _GfxBase can use either ones your assembler programs open, say in a system.asm file that opens and closes libraries and has that public variable, or the one that just happens to come along with your C unit tests.

So to get mocked Amiga library functions, I:

  • create a block of memory big enough to cover the size of the largest LVO call I’m going to make
  • place a JMP <address> instruction at each point from the end for each LVO, with the address being the pointer to a mock function in my C test suite
  • set the library base to the end of that memory block
  • call the library like I normally would in assembler or C

This means that my assembler code under test operates as expected, but now the calls to WaitTOF() are logged and I can treat them as you would any other mock in any other testing framework.

@TopazRabbit@oldbytes.space

Via Topaz 🐇

December 30, 2024 1:15 PM

I'm getting better at finding those wrong-sized MOVE and other commands in my M68K code that cause those weird flaky errors. Now to get better at not letting them in in the first place...

@TopazRabbit@oldbytes.space

Via Topaz 🐇

December 28, 2024 7:26 PM

Ok I think I will do my Night in the Woods stream tomorrow afternoon around 5PM EST on my PeerTube channel. See you then!

@TopazRabbit@oldbytes.space

Via Topaz 🐇

December 22, 2024 12:58 PM

Next piece of the Amiga gamedev puzzle for me was figuring out a good way to fade between arbitrary color palettes. While a fade to/from black is pretty straightforward, I will have some effects that will require moving to/from other full palettes. This was calculated within the assembler code and not pre-calculated, it's fully unit tested so it took way less time to ultimately build, and the module's reusable so I can calculate palettes anywhere, including in the C program running this small demo.

Bun Runner Devlog -- 2024-12-22

Via Blog -- The Industrious Rabbit

December 22, 2024 12:00 AM

I decided to work on the palette manager, and now I can fade between arbitrary palettes of colors:

Four colored blocks fading between different colors

The fading algorithm is a slightly tweaked implementation of Bresenham’s line algorithm. I know I built paletete fading code back in the AMOS days, very likely using a ratio approach like this:

m% "start color channel value" + "color channel delta" * ("current step" / "step count") %m

The issue is arbitrary multiplications and divisions on the 68000 processor are expensive. Compare the roughly worst-case cycle time cost of MULU and DIVU to MOVE, LSL, and ADD:

  • MULU: 70 cycles
  • DIVU: 140 cycles
  • MOVE.L to/from memory: 8 cycles
  • LSL.L: 8 cycles
  • ADD.L: 12 cycles

(Values from MC68000 Instructions Timing)

If you’re efficient, you can do a lot of stuff in the time it takes one division operation to take place!

The Bresenham implementation is all fixed point with no multiplications or divisions, and it’s pretty fast. This is also an algorithm I’m sure I’ll come back to a lot in retro development, so I wanted to get good with it:

A notebook page filled with Bresenham line drawing attempts

The unit testing I alluded to in my last post helped out a lot with implementing this. Being able to write code like this to test out the results of the assembler-based algorithm made it way easier to find bugs and discover issues in my algorithm:

void T_buildColorTransition(CuTest *tc) {  uint16_t targetMemory[7] = { 0, 0, 0, 0, 0, 0, 0 };  struct ColorTransition ct = {  0x845,  0xAC0,  0,  6  };  int i;   buildColorTransition(  targetMemory,  &ct  );   CuAssertIntEquals(tc, 0x845, targetMemory[0]);  CuAssertIntEquals(tc, 0x864, targetMemory[1]);  CuAssertIntEquals(tc, 0x983, targetMemory[2]);  CuAssertIntEquals(tc, 0x992, targetMemory[3]);  CuAssertIntEquals(tc, 0xab1, targetMemory[4]);  CuAssertIntEquals(tc, 0xac0, targetMemory[5]);  CuAssertIntEquals(tc, 0, targetMemory[6]); } 

Additionally writing unit tests forced me to build an interface to the palette manager that was reusable. Lots of structures to manage incoming data, and well-defined inputs and outputs means that reusing this code in future programs, like the demo code above, was trivial.

I’ll be getting back to the head collision physics, and probably implementing more unit tests around that, since hand-testing the collision code requires a lot of setup and me jumping really precisely. Tests should speed up that feedback loop a lot.

@TopazRabbit@oldbytes.space

Via Topaz 🐇

December 20, 2024 11:07 AM

Things are pretty busy for me at the moment but I'm still gonna try to do my Night in the Woods Longest Night stream tomorrow. If it doesn't happen then, then it may happen closer to the new year. Stay tuned...

@TopazRabbit@oldbytes.space

Via Topaz 🐇

December 17, 2024 10:51 PM

I now have a Sun Ultra 5 all fixed up and ready to serve up some Perl and C CGI scripts to my local machines. The future is now.

Bun Runner Devlog -- 2024-12-14

Via Blog -- The Industrious Rabbit

December 14, 2024 12:00 AM

All three collision types are now working! (well, mostly working):

Game footage of rabbit tripping, hitting a wall, and hitting their head on a wall

I need to do something about that last one, when you are going to go over an edge. I may just have to extend the physics engine a bit more to make that look good. Thankfully, I have a new tool in my retro development toolkit to make that a lot easier to implement.

I have unit tests with CuTest working with assembler code, so I can write tests for some of the more complicated data transformations (like collision physics) rather than using slow and error-prone hand testing:

Console window showing assembler and C unit test code, as well as test runner results in an emulated Amiga

As I describe on my wiki page about the subject, you have to set the stack up to around 30000 bytes on the Amiga for the test to run. You also have to include the math library. Get those in place, and you can easily run tests against any symbols exported from your assembler code.

Next is fixing that head konk collision ground slide, then implementing a palette manager which can set Copperlist palettes as well as perform transitions between two palette sets, to allow for color fades in and out and other effects.

@TopazRabbit@oldbytes.space

Via Topaz 🐇

December 12, 2024 8:30 PM

Gonna try some art streaming tonight to make sure my streaming setup is ready for my yearly Night in the Woods stream. I'll post a link later. If you have something you want me to try and draw (SFW plz), lemme know.

Bun Runner Devlog -- 2024-12-08

Via Blog -- The Industrious Rabbit

December 8, 2024 12:00 AM

I have two of the three collision types working! Well at least the basics of them working:

Game footage of rabbit tripping and hitting a wall

I also got the tiles background working, though for performance reasons I made the backgrounds 512px wide so it’s easier to do bitwise math for calculations.

Doing both of these things required restructuring a TON of code, and included working out good ways to do unit-ish testing in C of the assembler code I’ve been writing. It’s also helped me focus on ensuring dependencies between areas of the game code are as few and deep as possible.

Next is finishing up the final collision type, the rabbit hitting its head. This will involve the physics necessary to get the rabbit to fall correctly and hit the ground. Then I’ll be doing a few additional frames of animation and moving on to other parts of the game.

@TopazRabbit@oldbytes.space

Via Topaz 🐇

December 5, 2024 11:11 PM

Almost 6 hours later and I've completely restructured how sprites are loaded, stored, and referenced by other routines in my Amiga game. As annoying as restructuring is to do in assembler, I'm loving it right now. It's the kind of puzzle my brain needs at this moment.

@TopazRabbit@oldbytes.space

Via Topaz 🐇

December 2, 2024 12:11 PM

I decided to give up on the data recovery. It would have literally taken days to grab some now-swiss cheese files related to a demo reel I made when I was 22, and some other files I likely have other copies of strewn about elsewhere. I'll survive without it all.

Bun Runner Devlog -- 2024-11-22

Via Blog -- The Industrious Rabbit

November 22, 2024 12:00 AM

This week was about getting a basic level “editor” working, using a combination of a Ruby script with RMagick and an image from LibreSprite:

Lineart of a level

The level generation works, and I restructured a ton of code to make dynamic level loading work. However, the more complex levels revealed an issue in collision detection that I need to debug.

To make this easier, I’m finally adding some on-screen debugging to the game:

Bun Runner game with 1234 printed on screen

I needed the ability to write text to the info screen anyway. I also need to tweak the copperlist split screen a bit more (that’s the red glitch), but that can come later.

Next will be fixing that collision detection, then reworking the background art to be two 640px images that are tiled rather than one massive 1000px image and fixing the background rendering pipeline.

I went down to a retro computing meetup @bluewizard@mastodon.sdf.org runs on Sunday! I brought my MiSTer and the current build of Bun Runner 2000, which was a big hit. Next few posts will have more pictures from the event. More details at https://www.bluewizard.net/pages/vintagecomputermeetup/. #retrocomputing #commodore #amiga #acorn

Via Topaz on Pixelfed

November 18, 2024 11:18 PM
Wide shot of me in a conference room with retro computers and other people.

I went down to a retro computing meetup @bluewizard@mastodon.sdf.org runs on Sunday! I brought my MiSTer and the current build of Bun Runner 2000, which was a big hit. Next few posts will have more pictures from the event. More details at https://www.bluewizard.net/pages/vintagecomputermeetup/.

#retrocomputing #commodore #amiga #acorn

Bun Runner Devlog -- 2024-11-15

Via Blog -- The Industrious Rabbit

November 15, 2024 12:00 AM

We have a main menu! It’s very simple, but it also forced me to restructure huge chunks of code in order to allow swapping out the menu and the game code.

This included asset loading code, and this restructuring caused me to find a bug that took a few hours to track down. Symptoms:

  • The background would occasionally glitch out when swapping buffers
  • The glitching would mostly stop if I didn’t allocate memory for sprites.

What it came down to was this line:

; D0 contains the address to the background art ADD.W #GAME_SCREEN_LAST_WORD_POSITION,D0 

I was adding a value to an address and scoping to word boundaries, and it kinda worked, as long as I wasn’t wrapping around a 64k boundary when adding that value to the address. Changing how memory was allocated, as sprite memory was allocated before screen memory, would change the start address of screen memory and make this “work”.

But I have a menu now! Oh and some more animation! The rabbit will angle up and down depending on vertical velocity, and the jetpack has animation now, too!

A cartoon rabbit running around in a world of floors and ceilings

Next will be changing up some game behaviors, and then on to some fun bits of the game.

Bun Runner Devlog -- 2024-11-09

Via Blog -- The Industrious Rabbit

November 9, 2024 12:00 AM

Another week of slow progress, but this is mainly due to some really heavy refactoring work. I wanted to use ptplayer for music, and that required having my code in a ready-to-link format. If I was going to do this, I was going to do it right, and so I restructured all of the code using all of the techniques I use when working with higher level languages:

  • proper separation of concerns into deep modules
  • “data classes” that enforce structure

My biggest problem holding me back was that MonAm did not like it as all when I gave it linked code:

  • I lost all my symbols
  • Source code mode was non-existent, though that barely worked for me anyways

Along with all the refactoring, I switched to using BDebug in the Barfly assembler package, and I haven’t looked back. Symbols, source code, proper OS 2.0 windows, full mouse support, command line arguments, and lots and lots of great options.

Along with reworking the game code in this way, I restructured my art compression tool to get more practice. I’ve gotten a lot better at restructing assembler code and figuring out the good places to divide up modules. Once I feel really confident that this is the way to go, I’ll write up an article detailing my approach, if you want to try it out yourself.

Oh, and music playback works!

Bun Runner Devlog -- 2024-11-01

Via Blog -- The Industrious Rabbit

November 1, 2024 12:00 AM

Not as much progress this week, but some good code cleanups and performance enhancements:

  • Spreading out redraw work across multiple frames
  • Getting background rendering mostly working
  • Precalculating double buffer calculations

Next will be getting the double buffering to happen independently between the front and back planes, which will allow for smooth backgrounds and foregrounds. Then I’ll work on externalizing some more of the game from the code, moving maps to separate files that can be loaded in and adding some other colors to the output.

A cartoon rabbit running around in a world of floors and ceilings

Bun Runner Devlog -- 2024-10-25

Via Blog -- The Industrious Rabbit

October 25, 2024 12:00 AM

Lots of progress this week!

  • Full joystick handling, including getting the jetpack working and decent jumping physics
  • Drawing lots more stuff on screen:
    • Textured 4 bitplane floors
    • 1 bitplane ceilngs
    • The jetpack meter
  • Collisions with the floor, ceiling, and walls work
A cartoon rabbit running around in a world of floors and ceilings

I also fixed up some really stupid bugs and got the game working on my MiSTer and A1200:

Bun Runner running on my Amiga 1200
Bun Runner running on my MiSTer

Additionally, I tightened up the art pipeline so when I’m creating assets, it’s easy to get them into the game. I will need to figure out the best way to automate more of the XPK compression, too.

Next I’ll be getting the rest of the draw operations for the background into the game and spreading the writes to the double buffer over a few frames.

Bun Runner Devlog -- 2024-10-18

Via Blog -- The Industrious Rabbit

October 18, 2024 12:00 AM

Going to write up a blog post every week with the progress of my finite-at-first runner for the Amiga. My goals:

  • write something large in Assembler
  • learn as many of the Amiga subsystems as I can
  • make an entertaining, easy-to-pick-up game with as many modern sensibilities as possible

I have no timeline to get a WIP out for testing because I’ve never worked in Assembler nor this deeply with the Amiga and AmigaOS before!

This week:

  • set up the main game project
  • extracted out relevant code from some things I posted to Mastodon
  • cleaned up keyboard, mouse, and joystick handling, using OS routines for the first two, and direct CIA access for the joystick
    • The two dots in the upper left are the state of the joystick
  • set up file logging for debug messages as printing to stdout while I’ve turned off enough OS things doesn’t work, but writing to a file does
  • cleaned up my assembler XPK art compressor and made it more generic so I can compress more objects into different files as needed (think sprites vs. blitter objects vs. backgrounds vs. music)
  • Got rabbit rendered on the screen and movable with the joystick
  • Animated rabbit frames while moving around on screen
A cartoon rabbit running around on a black screen

I also learned:

  • doing assembler debugging on a PiStorm-equipped Amiga using something like MonAm doesn’t work: https://github.com/michalsc/Emu68/issues/282
    • I tried a build of this branch on my PiStorm32 Lite and tracing in MonAm crashed the machine

The Obligatory Amiga Blitter Video

Via MakerTube -- The Industrious Rabbit

September 26, 2024 10:19 PM

It's time...time for a video on the Commodore Amiga Blitter! Topaz walks through the memory copy capabilities of this feature in the context of a small demo written to exercise the blitter, copper, and sprites.

Thanks to Tyrel (@tyrel@mastodon.social), corb0!

References

Code:

Documentation:

Credits

Music:

SFX:

The Obligatory Amiga Blitter Video

Via Blog -- The Industrious Rabbit

September 26, 2024 6:15 PM

It’s time…time for a video on the Commodore Amiga Blitter! Topaz walks through the memory copy capabilities of this feature in the context of a small demo written to exercise the blitter, copper, and sprites.

Thanks to Tyrel (@tyrel@mastodon.social), corb0!

References

Code

Documentation

Credits

Music

SFX

How did DOS games draw to the screen so fast?

Via MakerTube -- The Industrious Rabbit

May 27, 2024 12:27 PM

The EGA and VGA video standards share some similarities with how the Amiga did graphics, but the similarities end when it comes to the 256 color graphics that defined 90s PC gaming. Topaz walks you through the basics of how those video modes worked, and what made them get so fast over time.

Thanks to Tyrel (@tyrel@mastodon.social)!

References

3d game source code:

Code on Hackerbun:

2d games and the EGA pipeline:

Why are, like, half these examples id Software games?:

  • Graphics Programming Black Book by Michael Abrash (https://www.phatcode.net/res/224/files/html/index.html) - This book not only has a lot of incredible detail about the x86 processor, the DOS platform, and how these EGA and VGA modes work, but the author also worked on the Quake engine, and his earlier articles helped John Carmack make games like Commander Keen run so smoothly. Even if you're not going to write low-level code for retro machines, the first three chapters are a fantastic read for any software developer who gets caught up in prematurely optimizing anything (code, date, features) at any level of the process. Highly recommended.

Credits

Music:

How did DOS games draw to the screen so fast?

Via Blog -- The Industrious Rabbit

May 27, 2024 8:25 AM

The EGA and VGA video standards share some similarities with how the Amiga did graphics, but the similarities end when it comes to the 256 color graphics that defined 90s PC gaming. Topaz walks you through the basics of how those video modes worked, and what made them get so fast over time.

Thanks to Tyrel (@tyrel@mastodon.social)!

References

3d game source code

Code on Hackerbun

2d games and the EGA pipeline

Why are, like, half these examples id Software games?

  • Graphics Programming Black Book by Michael Abrash (https://www.phatcode.net/res/224/files/html/index.html)
    • This book not only has a lot of incredible detail about the x86 processor, the DOS platform, and how these EGA and VGA modes work, but the author also worked on the Quake engine, and his earlier articles helped John Carmack make games like Commander Keen run so smoothly. Even if you’re not going to write low-level code for retro machines, the first three chapters are a fantastic read for any software developer who gets caught up in prematurely optimizing anything (code, date, features) at any level of the process. Highly recommended.

Credits

Music

AMOS Pro BSD Socket Extension 1.1.4 Released

Via Blog -- The Industrious Rabbit

May 2, 2024 12:00 AM

Version 1.1.4 of the AMOS Pro BSD Socket extension is out, and it’s a big one. Thanks to both an anonymous contributor and some improved M68K assembler debugging techniques, this version has multiple crash bugs fixed, as well as an issue that prevented the extension from working well on non-emulated Amigas. Upgrading is highly recommended!

Grab it from Hackerbun Gitea or Aminet:

(1.1.3 was an internal release and not published to the public)

code.hackerbun.dev activity

Via Gitea -- code.hackerbun.dev

April 26, 2024 12:33 PM

code.hackerbun.dev activity

Via Gitea -- code.hackerbun.dev

April 18, 2024 1:10 AM
John Bintz pushed to jb/rd-patches at TheIndustriousRabbit/amos-pro-bsdsocket-extensionc631b3fa49932b96f2d698cb3cb58c80747c2995 Bump version, fix multi-reg moves, add patches to gitignore 1ad514b80bfda7680a6d6af456e9c6fd8f883090 Change up documentation structure bd74050e06cd65406955e1200d88af0d2db1d0ac Ensure fdset macro works with D3 1645cf9ad4b94fc3544799af51df07b0eddee64e Use null-terminated IP address for socket addr lookup

Lots of other fun stuff! * A Nabu set up with a run'n'gun'n'fly game * A Tandy Color Computer running FujiNet and showing Mastodon toots about Sonic the Hedgehog * A SGI Personal Iris * @paulrickards@mastodon.social was pen plotting away #vcfeast #retrocomputing #nabu #fujinet #silicongraphics

Via Topaz on Pixelfed

April 17, 2024 10:20 PM
A Nabu computer running a game. Someone is standing on the left playing the game.

Lots of other fun stuff!

* A Nabu set up with a run'n'gun'n'fly game
* A Tandy Color Computer running FujiNet and showing Mastodon toots about Sonic the Hedgehog
* A SGI Personal Iris
* @paulrickards@mastodon.social was pen plotting away

#vcfeast #retrocomputing #nabu #fujinet #silicongraphics

AMOS Pro BSD Socket Extension 1.1.2 Released

Via Blog -- The Industrious Rabbit

March 18, 2024 12:00 AM

Hot on the heels of 1.1.1 comes even better fixes to string handling in the extension. The issue is that, while the strings returned from the functions were immediately usable, they weren’t being added correctly to the string space AMOS maintains, so you couldn’t do things like concatenate them. I documented the proper usage on the wiki. This fixes up all of the string returning functions in the extension, which means that Socket Recv$ should work as expected now.

Grab it from Hackerbun Gitea or Aminet:

AMOS Pro BSD Socket Extension 1.1.1 Released

Via Blog -- The Industrious Rabbit

March 17, 2024 12:00 AM

I’ve released version 1.1.1 of my BSD Socket extension for AMOS Professional. It fixes two bugs in Socket Inet Ntoa$, a crash bug and an issue where the null terminator in the original string was being copied into the AMOS string, causing issues. There was also an issue with the build script where the latest version of the library was appearing in the wrong place in the archive.

Grab it from Hackerbun Gitea or Aminet:

DOS Arena Game -- Super Alpha Version

Via Blog -- The Industrious Rabbit

March 5, 2024 12:00 AM

I put up the code and binary for a Smash TV/Robotron-like game I built for DOS and PCs with VGA graphics. It works well enough to be playable.

The code is up on Hackerbun Gitea. It has a bunch of code related to working with the PC and VGA card, and it’s the biggest program I’ve written in C so far. It also has unit tests using CuTest, inline assembler, and compiled sprites built using Ruby.

Take it for a spin if you like. Downloadable files are in the project’s Releases. If you have feedback, send it along. I’m not sure when I’ll get back to working on it because I have a video idea I want to do next, but who knows what the future will bring!

AMOS Pro BSD Socket Extension 1.1.0 Released

Via Blog -- The Industrious Rabbit

February 24, 2024 12:00 AM

I’ve released version 1.1.0 of my BSD Socket extension for AMOS Professional. It fixes a bug in Dns Get Host Address By Name$ where I was incorrectly handling string termination from AMOS strings. It also adds Socket Herrno to get error code information from the DNS resolver in the network stack.

Thanks to Allanon on Mastodon for finding the issue and testing out the fix!

Grab it from Hackerbun Gitea or Aminet:

Viewing Amiga images on a DOS PC without conversion? Let's find out how!

Via MakerTube -- The Industrious Rabbit

February 4, 2024 10:25 PM

Young Topaz has an IFF ILBM image he wants to show his dad, but his dad's on his PC. Learn about what it takes to write a simple IFF ILBM reader for DOS.

References

Source Code:

IFF Files:

PC Development:

Credits

Music:

Sound Effects:

Viewing Amiga images on a DOS PC without conversion? Let's find out how!

Via Blog -- The Industrious Rabbit

February 4, 2024 5:22 PM

Young Topaz has an IFF ILBM image he wants to show his dad, but his dad’s on his PC. Learn about what it takes to write a simple IFF ILBM reader for DOS.

References

Source Code

IFF Files

PC Development

Credits

Music

Sound Effects

Drawing YOUR REQUESTS on a Quantel Paintbox from the 90s! -- Full Stream

Via MakerTube -- The Industrious Rabbit

September 5, 2023 9:04 PM

I draw your requests on a Quantel Paintbox, specifically a Harriet from the early 90s. Due to streaming issues, I wasn't able to broadcast this live, but I did record the whole stream locally. I made it through three pieces: a rat holding a Quantel RAT (a mouse-like input device), a request from @imrustyok@meow.social for a TV show ad card recreation, and a request from @tyrel@social.tyrel.dev to draw his cat. I thought I was drawing his cat Henry, but it was actually Victor. Oops.

Learn more about the Quantel Paintbox:

Stream music by Nihilore: https://nihilore.com

Digital photo editing a decade before Photoshop? Meet the Quantel Paintbox

Via MakerTube -- The Industrious Rabbit

August 20, 2023 9:05 PM

The popular shorthand for digital photo editing is based on the name of software developed in the 90s. However, that activity was already being done by users of a bespoke art computer developed by a British company in the early 80s, and the public could see the output of this machine everywhere. So why is digital photo manipulation not called "being Paintboxed"?

Thanks to DextersTechLab for actual Paintbox footage and technical assistance, Adrian Wilson for lots of feedback and resources!

Chapters

00:00 - Introduction
00:36 - Digital Video History
01:23 - The Quantel Paintbox
02:33 - Music Videos
02:57 - Paintbox Machines
03:23 - Why is it not called being Paintboxed?

References

Quantel Paintbox Resources:

Credits

Music:

Amiga Art: "Disney Presents: The Animation Studio" - Ink & Paint Part 3

Via MakerTube -- The Industrious Rabbit

August 2, 2023 1:00 AM

I did it. I finished the animation. Working with this software is more challenging than I expected. It also didn't help that my tablet was having issues with Weylus after a while. I also learn just what Frisket does, and why it's important to Free the Frisket!

Skip to 2:23:54 if you want to see the finished animation playing!

I'll be taking a break from streaming while I focus on the next video, then I'll pick back up with either DeluxePaint V or True Brilliance as my next Amiga art tool to explore.

Stream music by Nihilore (CC-BY 4.0) - https://nihilore.com

Can I fix the non-functioning AMOS BASIC networking library I wrote in 1998?

Via MakerTube -- The Industrious Rabbit

August 2, 2023 12:59 AM

Bamboo figures out how to get code he wrote 23 years ago on the Amiga to work for someone today, and it involves a lot of work with libraries.

Thanks to Piotr Kuchno for contacting me and working through debugging the code, and for the videos of the code in use on real Amiga computers! Thanks also to @ijimkoz on Twitter for valuable feedback!

Note: The project name and URL have changed! Go to theindustriousrabbit.com to learn more!

Resources

Intro:

AMOS Extensions:

Amiga libraries:

Why was my server code not working?

Amiga Architecture 101: The Basics + Gaming

Via MakerTube -- The Industrious Rabbit

August 2, 2023 12:59 AM

Want to try out gaming on the classic Commodore Amiga computer? Topaz walks you through the basics of this retro computer's hardware, and the things you'll need to look for to get your own setup working.

I currently use these emulators:

If you're on Windows, you can run the venerable WinUAE (https://www.winuae.net/).

You can get Kickstart ROMs from Cloanto and their Amiga Forever pack (get at least the Plus Edition for the more modern Kickstarts) and/or from Hyperion if you want AmigaOS 3.2, a modern AmigaOS for applications.

I leave ADF and WHDLoad archive hunting to the viewer!

Thanks to Meredith, Tyrel, Dave!

Read more at https://theindustriousrabbit.com and subscribe to the channel and RSS feed for future updates!

Credits

MiSTerFS problems with AO486? Here's a workaround, and a quick explanation how it works

Via MakerTube -- The Industrious Rabbit

August 2, 2023 12:58 AM

Having trouble getting MiSTerFS to work on the AO486 core? Topaz Rabbit walks you through a workaround you can do on the Linux side of the MiSTer, then describes how that workaround works.

Thanks to Tyrel (@tyrel@social.tyrel.dev), Jim (@ijimkoz@mastodon.social)!

References

Credits

Can a Commodore Amiga help you cook a pizza? -- Amiga GUI app development in C

Via MakerTube -- The Industrious Rabbit

August 2, 2023 12:57 AM

Topaz Rabbit walks us through writing a pizza timer app in C on the Commodore Amiga. Follow along and learn about Intuition, GadTools, devices, message ports, IO, and even signals!

Thanks to Tyrel (@tyrel@social.tyrel.dev)!

Chapters

00:15 - Introduction
00:40 - Intuition
01:17 - Opening a Window
01:50 - GadTools
03:31 - setup and teardown
03:53 - Fonts
04:29 - Timer Logic
05:24 - Amiga code documentation
05:53 - Message Ports
06:34 - Intuition Direct Communication Message Port (IDCMP)
09:06 - Time & timer.device
10:01 - Synchronous & Asynchronous IO
11:40 - Alerting the user with DataTypes audio playback
12:43 - Signals
13:27 - Intuition menus
14:19 - The About window
14:45 - App testing with CodeWatcher and avail
15:25 - Conclusion

References

Amiga documentation and tools:

C tutorials:

Source code:

Credits

Music:

Sound Effects:

Last built: January 16, 2025 12:04 AM