PASM

PASM (PythonshellDebugwindow's Assembly) is an assembly language for a hypothetical machine, the P-Machine. It was created by User:PythonshellDebugwindow in December 2020.
==The P-Machine==
The P-Machine uses—or rather, would use—65536 (2^16) bits of ROM, the same as 8192 bytes or 64kb, and 256 bits of display memory (16x16 pixel screen). It also uses 6 registers (ba, bb, na, nb, ya, yb), a 1-bit conditional flag, and a call stack. It uses a bus width of 1 bit.
==Memory==
PASM uses the same memory as the P-Machine: 65536 bits of ROM, 256 bits of display memory, 6 registers, a conditional flag, and a call stack.
===ROM===
The P-Machine, and by extension PASM, uses 65536 bits of ROM.
===Display memory===
The P-Machine has a 16x16 pixel black-and-white (1-bit colour) screen, and as such has 256 bits of display memory. It also has a display pointer, which can point to one pixel on the screen at a time.
===Registers===
PASM has access to 6 registers: ba, bb, na, nb, ya, yb. Registers whose names start with b store 1 bit, n registers store 1 nybble, and y registers store 1 byte.
===Conditional flag===
The conditional flag a 1-bit flag.
===Call stack===
The P-Machine also uses a call stack of unbounded size.
==Syntax==
PASM code is grouped into sections. Sections can be declared by writing .[name], where [name] is the (alphanumeric) name of the section. The .ent section is the entry point of the program. A section lasts until another section is declared. Within sections, instructions and labels can be written. Instruction arguments are separated by commas. Labels are delared by writing [name]: before an instruction, and act partially like sections, except that they don't affect the call stack (see #Sections vs. labels).
An unlimited amount of instructions can be put within sections.
In instruction arguments, [hex]h is a literal case-insensitive hexadecimal number, where [hex] is the hexadecimal number; ROM can be referenced in programs by writing &[addr]h, where [addr] is the address in hexadecimal; display memory, the display pointer, and the condition flag can not be referenced directly in programs; registers can be referenced in programs by writing %[reg], where [reg] is the name of a register; and @[name] represents the section or label called [name].
; declares a comment until the end of a line. Spaces and tabs are ignored in programs.
==Sections vs. labels==
Jumping to a section pushes the location jumped to onto the call stack; jumping to a label does not.
==List of instructions==
Instruction 	Arguments 	Effect
Memory manipulation 	Memory manipulation 	Memory manipulation
mov 	a, b 	Sets the memory at a to b
Comparison 	Comparison 	Comparison
cmp 	a, b 	Sets the conditional flag to 1 if a and b are equal, and does nothing otherwise
Mathematical and logical operations	Mathematical and logical operations	Mathematical and logical operations
add 	a, b 	Adds b to a in place, which must not be a literal value
sub 	a, b 	Subtracts b from a in place, which must not be a literal value
mul 	a, b 	Multiplies b by a into a, which must not be a literal value
div 	a, b 	Floor-divides a by b into a, which must not be a literal value
Control flow 	Control flow 	Control flow
jmp 	a 	Jumps to a
jz 	a 	Jumps to a if the conditional flag is set to 0
jnz 	a 	Jumps to a if the conditional flag is set to 1
hlt 	a 	Halts the program with exit status a (zero is success, all other values are failure)
nop 	None 	Do nothing (nop)
Display-related commands 	Display-related commands 	Display-related commands
dofft 	x, y 	Sets the display pointer to (x,y)
din 	a 	Read the display at the display pointer and write it to a, which must not be a literal value
dout 	a 	Write a to the display at the display pointer
==Examples==
===Clear the screen to white===
 .ent
 mov %na,0h
 x: mov %nb,0h
 dofft %na,%nb
 y: dout 0h
 add %nb,1h
 cmp %nb,fh
 jz @y
 add %na,1h
 cmp %na,fh
 jz @x
===Truth-machine===
Takes the top-left pixel of the screen as input (white is 0, black is 1). Sets the bottom-right pixel to 0 on input 0, infinitely toggles it on input 1.
 .ent
 dofft 0h, 0h
 din %na
 cmp %na,1h
 dofft fh, fh
 inf: dout %na
 dout 0h
 jnz @inf
Category:Languages Category:2020 Category:Unimplemented Category:Low-level Category:Finite state automata