A computer architecture
Go to file
CrazyEttin d4720f48c2 Add ability to shift multiple steps in one instruction 2022-09-11 19:44:53 +03:00
examples Add ability to shift multiple steps in one instruction 2022-09-11 19:44:53 +03:00
.gitignore Add an assembler, a section on the assembly language on the readme, example assembly files, and proper error handling to the emulator and disassembler 2022-07-31 15:02:09 +03:00
assembler.pas Add ability to shift multiple steps in one instruction 2022-09-11 19:44:53 +03:00
disassembler.pas Add ability to shift multiple steps in one instruction 2022-09-11 19:44:53 +03:00
emulator.pas Add ability to shift multiple steps in one instruction 2022-09-11 19:44:53 +03:00
license.md Reword the readme slightly in Gidubba and convert the readme, license, and example programs to a Gidubba-friendly format 2022-08-19 00:14:06 +03:00
readme.md Add ability to shift multiple steps in one instruction 2022-09-11 19:44:53 +03:00
tapectl.pas Add the ability to turn the local echo on or off in the emulator, make the rest of the included programs exit with a non-zero exit code on error, and fix and reword the readme slightly 2022-09-08 23:11:24 +03:00

readme.md

Thingamajig v1.1-dev

Thingamajig is a RISC/MISC homebrew computer architecture. Its git repository can be found at https://ahti.space/git/crazyettin/Thingamajig.

Included Software

The repository includes an emulator implementation of Thingamajig with a control program for the emulated punched tape reader and punch, and an assembler and a disassembler, all written in FreePascal. It also includes couple of simple example programs for Thingamajig written in assembly.

Registers and Memory

  • 24-bit instruction register IR
  • 16-bit instruction and return pointers IP and RP
  • 8-bit general-purpose registers R0-R3
  • 8-bit memory locations 0-FFFF

Multi-byte values are big-endian. Memory locations 0-FFEF are used for RAM while FFF0-FFFF are reserved for memory mapped devices. Input and output are mapped to address FFFF, while arbitrary devices can be mapped to the other reserved addresses.

Instructions

Instructions without an immediate or address argument are 8-bit, those with an immediate one 16-bit, and those with an address one 24-bit. The instruction pointer is incremented before being accessed or modified.

0 HALT 1 RET IP = *RP; RP += 2

2 SHL RX, N RX <<= N (logical) Shifts of 1-4 steps, 3 SHR RX, N RX >>= N (logical) with 4 encoded as 0 4 ROL RX, N RX <<= N (rotating) in machine code. 5 ROR RX, N RX >>= N (rotating)

6 NAND RX, RY RX = ~(RX & RY) 7 AND RX, RY RX &= RY 8 OR RX, RY RX |= RY 9 XOR RX, RY RX ^= RY

A LOAD RX, ~0, IMM RX = IMM Written as "LOAD RX, #IMM" 0, ADDR RX = *ADDR Written as "LOAD RX, ADDR" B STORE RY, ADDR *ADDR = RY Written as "STORE ADDR, RY"

C BREQ RX, RY, ADDR if (RX == RY) IP = ADDR D BRNEQ RX, RY, ADDR if (RX != RY) IP = ADDR E CLEQ RX, RY, ADDR if (RX == RY) {RP -= 2; *RP = IP; IP = ADDR} F CLNEQ RX, RY, ADDR if (RX != RY) {RP -= 2; *RP = IP; IP = ADDR}

Assembly Language

Lines of assembly are of the following form:

LABEL: OPER ARG1, ARG2, ARG3 ;Comment

The language is case-insensitive and uses hexadecimal numbers. A label can consist of any alphanumeric characters as long as it is not interpretable as a hexadecimal number. The label, instruction, and comment elements are all optional, as is spacing between the arguments. For the arguments of each instruction see the previous section.

Address arguments can be either absolute addresses or references to or relative to a label. Relative references are of the form LABEL +/- N; the spacing is optional.

In addition to the true instructions there are three pseudo-instructions. ORG defines the starting address of the program: it can only occur as the first instruction and cannot have a label, and is not required if the starting address is 0. DATA introduces a byte of data. ADDR introduces two bytes of data containing the address of a reference to or relative to a label.

Boot

At boot the initial program loader (IPL) loads a program to RAM starting at address 0 after which is cedes control to the CPU. If an implementation has a front panel the IPL is optional. The instruction and return pointers are initialised as 0 and the first address after RAM respectively, while other registers and RAM are uninitialised.

Emulator

By default the emulator runs at roughly 500 KIPS, has 2 KiB of RAM, and interacts with memory mapped devices at roughly 1000 B/s. The arguments -dRAM4, -dRAM8, -dRAM16, -dRAM32, and -dRAM64 can be used to compile the emulator with 4, 8, 16, 32, or 64 KiB (minus the reserved addresses) of RAM respectively instead and the speed limitations can be removed with the argument -dfast.

Input and output are handled by an emulated glass teletype terminal with local echo on by default. Of the control characters bell (^G), backspace (^H), line feed (^J), carriage return (^M), and device control characters two (^R) and four (^T) are used by the terminal: the device control characters are used to turn the local echo on and off respectively while the rest have their standard uses. The backspace and delete keys input their respective characters and non-character keys null.

In Linux the emulator can be compiled with support for a character printer and an emulated punched tape reader and punch with the arguments -dprinter and -dtape respectively. The printer is mapped to address FFFE and the tape reader and punch to FFFD. The printer prints into /dev/usb/lp0 and the tape files read from and punched to are (re)set using the program tapectl.

The IPL loads a program from a file specified when launching the emulator.