The Spectrum keyboard is unlike a PC keyboard. In JSSpeccy, Ctrl
acts as Symbol Shift. On a real Spectrum running Aspect, delete is
Symbol Shift + 0 — not Caps Shift + 0.
This page remaps common PC keys automatically. You can also type the Spectrum combinations directly:
| You want | Press (PC) | Or Spectrum-style |
|---|---|---|
| Delete | Backspace | Ctrl + 0 |
, | , | Ctrl + N |
; | ; | Ctrl + O |
: | Shift + ; | Ctrl + Z |
" | Shift + ' | Ctrl + P |
. | . | Ctrl + M |
Click the emulator screen first if keys seem ignored. This page remaps
PC punctuation and Backspace to the Symbol Shift combinations Aspect
expects. You can also type them Spectrum-style, e.g.
Ctrl+N for ,.
Each line follows standard Z80 assembly form:
Label: Operator Operand; Comment
For example:
START: LD HL,MSG1; load message address MSG1: DB "Hello"; store a string
:, used as a target for jumps and calls, and listed in the symbol table (S).H suffix, e.g. 0FFFFH.$ represents the current program counter, useful for relative jumps.A label marks a position in your source. Other instructions can refer to it by name:
START: JP START ; jump to this label
MSG: DB "text"
LD HL,MSG ; HL points at MSG
After assembly, command S prints a cross-reference of every label and its address.
Labels are not required on every line — only where you need a named location.
These are not Z80 instructions; Aspect understands them as assembler directives:
| Directive | Purpose |
|---|---|
ORG | Set the assembly origin — where the program counter starts. |
LOAD | Set where object code is written in memory. |
EQU | Assign a value to a symbol, e.g. SCREEN: EQU 4000H. |
DS | Reserve storage bytes. Put the label on one line, DS n on the next. |
DW | Emit a 16-bit word (bytes reversed, as the Z80 expects). |
DB | Emit one or more bytes, e.g. DB 20H,24H or DB "text". |
END | Marks the end of the source. Required — omitting it causes an EOF error. |
Every program must begin with both ORG and LOAD.
In the common case they are the same address:
ORG 7800H LOAD 7800H
6000H (24576 decimal). Avoid placing your code below roughly 7800H or you risk overwriting Sinclair BASIC.7800H is a safe default load address for small machine-code routines on a 48K Spectrum.ORG controls how addresses are calculated during assembly (labels, $, relative jumps).LOAD controls where the generated bytes are actually stored. Set it differently from ORG only when the code will eventually run at an address that is not free while you are assembling.W to see the current text-buffer limits and top of memory before choosing an address.DS) — common pitfallPut the label and DS on separate lines:
DATA: DS 100
Do not write DATA: DS 100 on a single line.
I (insert). Use V16 to review listing pages.A and press Enter to assemble. Press any key to pause or resume a long listing.EOF appears and object code sits in memory from the LOAD address.S to view the label cross-reference.R returns to BASIC with your source intact. Re-enter Aspect with PRINT USR 24576.W to find the end of the text buffer.SAVE "name" CODE 24576,<length>SAVE "name" CODE <load addr>,<length>LOAD "" CODE then PRINT USR 24576. Aspect itself need not be reloaded first.