Pico Garry 2350 Part 1 – Signals
In 2020 I began a project to emulate the gate array from an Amstrad CPC computer using a Raspberry Pi RP2040 IC (as used in the first generation RPi Pico microcontroller boards). The project ran into challenges due to insufficient GPIO pins on the chips and the need to convert voltage levels for signals between …. Read More
Why Your Amstrad CPC Might Crash in 2104!
Recently I was reading the source code of the firmware routine which updates the system TIME in the Amstrad CPC. This code contains a bug which will eventually crash your machine! Read on for the full gory details! Updating the Timer The TIME counter is a is 32-bit wide integer (four bytes) which is updated …. Read More
Writing a Compiler 3: The Branch Fixup
I left the last article by talking about a bug. Look at this source code: and the IL which is being generated from it: Assignments to a variable are versioned. I.e. every variable reference has a ‘subscript’, which is incremented for every write. So in this example we have %a_0, %a_1, and %a_2, all of …. Read More
Writing a Compiler 2: Conditionals
In part one I showed how my compiler is parsing expressions and converting this into an intermediate language format suitable for optimisation and code generation. The code in part one was purely linear with no branches or loops. In this second article I begin to deal with code which has multiple execution paths. I’ll start …. Read More
Writing a Compiler 1: Expressions and Intermediate Language
Recently I’ve been getting increasingly broody to write a compiler. They’ve always been something of a mystery to me and, while I’ve always fancied writing one, I’ve never had a convincing reason to do so. But, since I’ve returned to retro computing, I can see definite limitations in the options currently available for writing software …. Read More
Designing an Intel 8008 Computer. Part 1: Power, Clocks and Signals
The Intel 8008 was the second microprocessor, and the first 8-bit one, as well as being the first microprocessor to go on general sale. It’s an interesting and quirky beast which was constrained by bleeding edge technology and a curious edict from the Intel management. In terms of history, the 8008 was designed under contract …. Read More
Passing Code Pointers as Data in Amstrad CPC BASIC
One of my secret coding pleasures is passing a function as a parameter to a subroutine. Most modern languages have what’s called ‘first class code’. That means that you can assign the address of a function to a variable, store it in an array, and pass it as a parameter to a function. This enables …. Read More
How Amstrad CPC BASIC Compresses Error Messages
Amstrad CPC BASIC saves a few bytes by using some interesting compression in the way it stores error messages. Let’s take a look at how it works and how much space it saves. Below is the table of error messages. The messages are stored in what I refer to as ASCII7 format – bit 7 …. Read More
Comparing Datapoint 2200, 8008, 8080 and Z80 Instruction Sets
Before Intel created the 8080 it designed the 8008, the first eight bit microprocessor, and the first microprocessor to go on general sale. The 8008 was designed as a single chip version of the TTL processor in the Datapoint 2200, itself the first desktop computer. I’ve long known that the Datapoint 2200 had a very …. Read More
Variables, DEF FN Definitions and Arrays Storage in Amstrad CPC/Locomotive BASIC
(The information in this article comes from reverse engineering Amstrad CPC BASIC. You can find the reverse engineered source code in my CPC BASIC source code repository. You can find an example BASIC program which ‘walks’ the storage areas in the Examples folder of that repository. See also the CPC Wiki page for more technical …. Read More