But a few years later, the Amiga brought us DPaint and Blitz Basic, and suddenly it was very possible to make a pretty competent game in BASIC as a self-taught teenager with no Internet access. That’s probably a better choice for anyone wanting to experiment with retro game dev using the tools of the period without resorting to assembly language
Just cross-checked my memories, Worms was written in Blitz BASIC, another example of good ideas matter more than programming languages, assuming that it is good enough for the implementation.
I owe having learnt Timex BASIC, Turbo BASIC, AMOS, Turbo Pascal, Z80, 68000, and 80x86 Assembly, before learning C, to understanding it not being that special.
Assembly becomes really attractive really quickly.
A floating point
A$ string
A% int
as you would expect ints are quicker.
There were BASIC compilers for C64 which generated significantly faster code just because they actually used ints for integer operations.
It had a nice set of built-in graphics functions and an inline assembler, amongst other things.
I can still remember that VDU 23 was the command to redefine a character, so much easier than doing the same sort of thing on the C64 (copy the character set from ROM to RAM, get the VIC to use the RAM copy with POKE statements, modify the desired character)
In general, this is a routine that is super easy to write in 6502 assembly. Most magazine BASIC games had something like that, with a few such routines that were POKEd in memory at startup. Several were written in a relocatable fashion so that they could be copied easily from one game to the next.
http://1amstudios.com/2014/12/07/c64-smooth-scrolling/
https://www.c64-wiki.com/wiki/Scrolling
* The top 4 bits of $D018 (VM10-VM13) control the base of graphics memory
* The bottom 3 bits of $D011 (YSCROLL) and $D016 (XSCROLL) let you delay screen display by 0-7 pixels in either axis
* The 4th bit of $D011 (RSEL) and $D016 (CSEL) let you shrink the screen viewport so it's visibly 304x192 pixels (in NTSC) even though the screen memory is still 320x200.
VM10-13 lets you establish a double-buffer, you can switch instantly between a front and back buffer by changing $D018. While you are scrolling, you copy the front buffer to the back buffer, offset by 8 horizontal pixels (1 byte) or 4 vertical pixels, then add in new map data on the edge you're scrolling towards. On each frame, you update XSCROLL/YSCROLL by one pixel so the visible screen is moving towards your new screen, then once it's moved all 8/4 pixels, switch to the new buffer.
The cost of copying all that graphics memory is expensive, so split it across the 8/4 frames.