SQ

SQ is esoteric programming language created by CatLooks without conditional jumps. The file with code must be exactly 32 Kb. Because a file is binary, source code can be compiled into one (compiler indev).
==Code==
SQ is designed to emulate 8-bit CPU (like 6502). There are lots of features that present in both.
===Syntax===
Source code resembles 6502 Assembly (most opcodes from 6502 are not present but there are few new ones).
For example:
 label:
 lda #A9
There is one difference in syntax, namely no need for $ sign to mark hexadecimal numbers.
===Registers===
There are 6 registers to work with: A (Accumulator), B (Buffer), X (IndeX), I (Instruction pointer), S (Stack pointer), P (Processor status). All of them are 8-bit except for I (16-bit) and P (3-bit).
Accumulator is used mainly for data transfer and math.
Buffer is used to record Accumulator state and restore it later.
Index is used to set offset for Accumulator load.
Instruction pointer contains a pointer to current opcode.
Stack pointer contains a pointer to current object on stack.
Processor status contains some info about last operation details.
===Status Register===
When pushed to the stack, status register will have this form:
 -----NZC
C - carry (usually math overflow bit or shifted out bit)
Z - zero (set when number last accessed register is zero)
N - negative (copy of bit 7 of last accessed register)
===Parameter Modes===
There are only 52 opcodes (from 256 available values) in SQ (often implied or with register). They are either followed by an argument, an argument with x or just single. Here's the list of all possible argument variations:
Name 	Syntax 	Bits	Description
Immediate (#) 	#byte 	000 	Straight usage of the number.
Implied 	- 	001 	No parameter.
Indirect (ind) 	(word) 	010 	Value at address located at parameter address.
Indirect with X (ind, x)	(word, x)	011 	Same as Indirect except parameter address is shifted with X.
Zeropage (zp) 	byte 	100 	Value at first 256 bytes of address space (RAM).
Zeropage with X (zp, x) 	byte, x 	101 	Same as Zeropage except address is shifted with X.
Absolute (abs) 	word 	110 	Value at parameter address.
Absolute with X (abs, x)	word, x 	111 	Same as Absolute except address is shifted with X.
Note: unlike 6502, Zeropage with X mode can cross 256-byte page.
==Opcodes==
Here's the list of all opcodes in SQ:
Instruction 	Opcode	Description
brk 	00 	Exits program.
lda # 	A0 	Loads A with direct value.
lda abs 	A6 	Loads A with value at address.
lda abs, x 	A7 	Loads A with value at address + X.
lda zp 	A4 	Loads A with value at zeropage address.
lda zp, x 	A5 	Loads A with value at zeropage address + X.
lda (ind) 	A2 	Loads A with value at address at address.
lda (ind, x)	A3 	Loads A with value at address at (address + X).
lda (ind), x	AF 	Loads A with value at (address at address) + X.
ldx # 	E0 	Loads X with direct value.
ldx abs 	E6 	Loads X with value at address.
ldx zp 	E4 	Loads X with value at zeropage address.
ldx (ind) 	E2 	Loads X with value at address at address.
sta abs 	FE 	Stores A at address.
sta abs, x 	FF 	Stores A at address + X.
sta zp 	FC 	Stores A at zeropage address.
sta zp, x 	FD 	Stores A at zeropage address + X.
sta (ind) 	F2 	Stores A at address at address.
stx abs 	8E 	Stores X at address.
stx zp 	8C 	Stores X at zeropage address.
stx (ind) 	82 	Stores X at address at address.
jmp abs 	06 	Loads I with 16-bit value.
jmp (ind, x)	03 	Loads I with 16-bit value at address + X.
jsr abs 	0E 	Pushes I on the stack and jumps to address.
rts 	09 	Loads I with 16-bit value poped from the stack.
tab 	41 	Records value of A.
rea 	51 	Restores value of A.
lsr # 	60 	Shifts A right # times (shifted bit -> carry).
lsl # 	68 	Shifts A left # times (shifted bit -> carry).
lsr 	61 	Shifts A right 1 time (shifted bit -> carry).
lsl 	69 	Shifts A left 1 time (shifted bit -> carry).
Category:Languages Category:Low-level Category:Unimplemented