PASM

From Esolang
Jump to navigation Jump to search

PASM (PythonshellDebugwindow's Assembler) 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, l 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
mov a, b Sets the memory at a to b
Comparison
cmp a, b Sets the conditional flag to 1 if a and b are equal, and does nothing otherwise
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
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
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