Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

About CMake 3.15C 99

SAL-8 is an interpreted 8-bit simple assembly-like language designed to be embedded in games or other projects. More specifically, it was created for games which revolve around solving programming challenges.

This is a cross-platform C99 implementation of SAL-8, in the form of a library. A simple main.c file for generating an executable is also included.

Introduction

SAL-8 is an 8-bit language. Therefore, 8-bit numbers (0-255) are the only available data type.

All of the instructions are executed by a virtual machine. Each virtual machine gives the programmer access to two types of resources: a stack, and multiple registers.

  • a register simply holds an 8-bit number
  • the stack can hold multiple 8-bit numbers, but only the last one is directly accessible.

The registers can be directly referenced, while the stack can be manipulated via the PUSH and POP operations.

The number of registers and the stack size can be specified when creating a virtual machine. However, the usual values are 4 registers and a stack size of 8. These usual values are also used by the provided main.c file.

There is also a special register called CMP, which stores the result of the last CMP operation:

  • 0, if the operands are equal
  • 1, if the left operand is below the right one
  • 2, if the left operand is above the right one

Running the executable

To run a SAL-8 file with the executable, simply pass the path to the file as the first argument.

sal8 <FILE>

Syntax

Instructions

Each instruction is written on a separate line, and has the following form.

<OP> [LEFT] [, RIGHT]

The list of all operations is listed in a table below.

Comments

Comments are preceded by the # character.

# Single-line comment.

Labels

Labels can be created in the following way.

<label_name>:

To refer to a label, simply write the label name without :.

Registers

To refer to a register, use the Rn syntax, where n is the register number (e.g.R0, R3).

Operation Codes

Legend:

  • R - register
  • N - 8-bit number (0-255)
  • L - label

The result is stored in the left register (if applicable).

OPLeftRightDescription
ADDRR/NAdds the right number/register to the left register
ANDRR/NApplies the bitwise AND operator on the left register and the right number/register
CMPR/NR/NCompares a register/number value with another register/number value, and stores the result in the CMP register
DIVRR/NDivides the left register value by the right number/register value
INR-Reads an 8-bit number from STDIN (or IO interface), and stores it in the left register (if there is no more input, the VM is halted)
JAL-Checks the CMP register, and jumps to the specified label if the left operand is above the right
JAEL-Similar to JA, but also jumps if the two operands are equal
JBL-Similar to JA, but jumps only if the first operand is below the first
JBEL-Similar to JB, but also jumps if the two operands are equal
JEL-Similar to JA, but jumps only if the operands are equal
JMPL-Jumps to the specified label
MODRR/NApplies the mod operator between the left register and right number/register
MOVRRCopies the right register value in the left register
MULRR/NMultiplies the left register value by the right number/register value
NOTR-Applies the bitwise NOT operator on the left register value
ORRR/NApplies the bitwise OR operator on the left register value and right number/register value
OUTR/N-Writes the left register/number value to STDOUT (or IO interface)
SHLRR/NApplies the left shift operator on the left register value, with the right register/number value as the shift count
SHRRR/NSimilar to SHL, but shifts to the right
POPR-Pops the stack and stores the popped element in the left register
PUSHR/N-Pushes the left register/number value onto the stack
SUBRR/NSubtracts the right register/number value from the left register
XORRR/NApplies the bitwise XOR operator on the left register value and the right register/number value

Examples

Echo

Reads numbers and outputs them.

_loop:IN R0 # Read a number and store it in the first register. If there is no more input,or the input is invalid, the VM will be halted.OUT R0 # Output the number stored in the first register.JMP _loop # Jump back.

Count

Reads a number n and prints all numbers from n to 0 (inclusive).

IN R0ADD R0,1 # The number is first subtracted, so add1 to the initial number.loop:SUB R0,1 # 0 needs to be included. Subtracting 1 from 0 gives 255. So, first subtract, print,and then check.OUT R0CMP R0,0JAloop

Reverse

Reads 8 numbers and prints them in reverse order.

MOV R0,0_input_loop:IN R1PUSH R1 # Read each number andpush it onto the stack.ADD R0,1CMP R0,8JB _input_loopMOV R0,8_output_loop:POP R1 # Popeach number from the stack and output it.OUT R1SUB R0,1CMP R0,0JA _output_loop

License License: MIT

This project was created by The Exom Developers. It is licensed under the MIT license.

About

8-bit simple assembly-like language.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - exom-dev/SAL-8: 8-bit simple assembly-like language. · GitHub
Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

About CMake 3.15C 99

SAL-8 is an interpreted 8-bit simple assembly-like language designed to be embedded in games or other projects. More specifically, it was created for games which revolve around solving programming challenges.

This is a cross-platform C99 implementation of SAL-8, in the form of a library. A simple main.c file for generating an executable is also included.

Introduction

SAL-8 is an 8-bit language. Therefore, 8-bit numbers (0-255) are the only available data type.

All of the instructions are executed by a virtual machine. Each virtual machine gives the programmer access to two types of resources: a stack, and multiple registers.

  • a register simply holds an 8-bit number
  • the stack can hold multiple 8-bit numbers, but only the last one is directly accessible.

The registers can be directly referenced, while the stack can be manipulated via the PUSH and POP operations.

The number of registers and the stack size can be specified when creating a virtual machine. However, the usual values are 4 registers and a stack size of 8. These usual values are also used by the provided main.c file.

There is also a special register called CMP, which stores the result of the last CMP operation:

  • 0, if the operands are equal
  • 1, if the left operand is below the right one
  • 2, if the left operand is above the right one

Running the executable

To run a SAL-8 file with the executable, simply pass the path to the file as the first argument.

sal8 <FILE>

Syntax

Instructions

Each instruction is written on a separate line, and has the following form.

<OP> [LEFT] [, RIGHT]

The list of all operations is listed in a table below.

Comments

Comments are preceded by the # character.

# Single-line comment.

Labels

Labels can be created in the following way.

<label_name>:

To refer to a label, simply write the label name without :.

Registers

To refer to a register, use the Rn syntax, where n is the register number (e.g.R0, R3).

Operation Codes

Legend:

  • R - register
  • N - 8-bit number (0-255)
  • L - label

The result is stored in the left register (if applicable).

OPLeftRightDescription
ADDRR/NAdds the right number/register to the left register
ANDRR/NApplies the bitwise AND operator on the left register and the right number/register
CMPR/NR/NCompares a register/number value with another register/number value, and stores the result in the CMP register
DIVRR/NDivides the left register value by the right number/register value
INR-Reads an 8-bit number from STDIN (or IO interface), and stores it in the left register (if there is no more input, the VM is halted)
JAL-Checks the CMP register, and jumps to the specified label if the left operand is above the right
JAEL-Similar to JA, but also jumps if the two operands are equal
JBL-Similar to JA, but jumps only if the first operand is below the first
JBEL-Similar to JB, but also jumps if the two operands are equal
JEL-Similar to JA, but jumps only if the operands are equal
JMPL-Jumps to the specified label
MODRR/NApplies the mod operator between the left register and right number/register
MOVRRCopies the right register value in the left register
MULRR/NMultiplies the left register value by the right number/register value
NOTR-Applies the bitwise NOT operator on the left register value
ORRR/NApplies the bitwise OR operator on the left register value and right number/register value
OUTR/N-Writes the left register/number value to STDOUT (or IO interface)
SHLRR/NApplies the left shift operator on the left register value, with the right register/number value as the shift count
SHRRR/NSimilar to SHL, but shifts to the right
POPR-Pops the stack and stores the popped element in the left register
PUSHR/N-Pushes the left register/number value onto the stack
SUBRR/NSubtracts the right register/number value from the left register
XORRR/NApplies the bitwise XOR operator on the left register value and the right register/number value

Examples

Echo

Reads numbers and outputs them.

_loop:IN R0 # Read a number and store it in the first register. If there is no more input,or the input is invalid, the VM will be halted.OUT R0 # Output the number stored in the first register.JMP _loop # Jump back.

Count

Reads a number n and prints all numbers from n to 0 (inclusive).

IN R0ADD R0,1 # The number is first subtracted, so add1 to the initial number.loop:SUB R0,1 # 0 needs to be included. Subtracting 1 from 0 gives 255. So, first subtract, print,and then check.OUT R0CMP R0,0JAloop

Reverse

Reads 8 numbers and prints them in reverse order.

MOV R0,0_input_loop:IN R1PUSH R1 # Read each number andpush it onto the stack.ADD R0,1CMP R0,8JB _input_loopMOV R0,8_output_loop:POP R1 # Popeach number from the stack and output it.OUT R1SUB R0,1CMP R0,0JA _output_loop

License License: MIT

This project was created by The Exom Developers. It is licensed under the MIT license.

About

8-bit simple assembly-like language.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - exom-dev/SAL-8: 8-bit simple assembly-like language. · GitHub
Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

About CMake 3.15C 99

SAL-8 is an interpreted 8-bit simple assembly-like language designed to be embedded in games or other projects. More specifically, it was created for games which revolve around solving programming challenges.

This is a cross-platform C99 implementation of SAL-8, in the form of a library. A simple main.c file for generating an executable is also included.

Introduction

SAL-8 is an 8-bit language. Therefore, 8-bit numbers (0-255) are the only available data type.

All of the instructions are executed by a virtual machine. Each virtual machine gives the programmer access to two types of resources: a stack, and multiple registers.

  • a register simply holds an 8-bit number
  • the stack can hold multiple 8-bit numbers, but only the last one is directly accessible.

The registers can be directly referenced, while the stack can be manipulated via the PUSH and POP operations.

The number of registers and the stack size can be specified when creating a virtual machine. However, the usual values are 4 registers and a stack size of 8. These usual values are also used by the provided main.c file.

There is also a special register called CMP, which stores the result of the last CMP operation:

  • 0, if the operands are equal
  • 1, if the left operand is below the right one
  • 2, if the left operand is above the right one

Running the executable

To run a SAL-8 file with the executable, simply pass the path to the file as the first argument.

sal8 <FILE>

Syntax

Instructions

Each instruction is written on a separate line, and has the following form.

<OP> [LEFT] [, RIGHT]

The list of all operations is listed in a table below.

Comments

Comments are preceded by the # character.

# Single-line comment.

Labels

Labels can be created in the following way.

<label_name>:

To refer to a label, simply write the label name without :.

Registers

To refer to a register, use the Rn syntax, where n is the register number (e.g.R0, R3).

Operation Codes

Legend:

  • R - register
  • N - 8-bit number (0-255)
  • L - label

The result is stored in the left register (if applicable).

OPLeftRightDescription
ADDRR/NAdds the right number/register to the left register
ANDRR/NApplies the bitwise AND operator on the left register and the right number/register
CMPR/NR/NCompares a register/number value with another register/number value, and stores the result in the CMP register
DIVRR/NDivides the left register value by the right number/register value
INR-Reads an 8-bit number from STDIN (or IO interface), and stores it in the left register (if there is no more input, the VM is halted)
JAL-Checks the CMP register, and jumps to the specified label if the left operand is above the right
JAEL-Similar to JA, but also jumps if the two operands are equal
JBL-Similar to JA, but jumps only if the first operand is below the first
JBEL-Similar to JB, but also jumps if the two operands are equal
JEL-Similar to JA, but jumps only if the operands are equal
JMPL-Jumps to the specified label
MODRR/NApplies the mod operator between the left register and right number/register
MOVRRCopies the right register value in the left register
MULRR/NMultiplies the left register value by the right number/register value
NOTR-Applies the bitwise NOT operator on the left register value
ORRR/NApplies the bitwise OR operator on the left register value and right number/register value
OUTR/N-Writes the left register/number value to STDOUT (or IO interface)
SHLRR/NApplies the left shift operator on the left register value, with the right register/number value as the shift count
SHRRR/NSimilar to SHL, but shifts to the right
POPR-Pops the stack and stores the popped element in the left register
PUSHR/N-Pushes the left register/number value onto the stack
SUBRR/NSubtracts the right register/number value from the left register
XORRR/NApplies the bitwise XOR operator on the left register value and the right register/number value

Examples

Echo

Reads numbers and outputs them.

_loop:IN R0 # Read a number and store it in the first register. If there is no more input,or the input is invalid, the VM will be halted.OUT R0 # Output the number stored in the first register.JMP _loop # Jump back.

Count

Reads a number n and prints all numbers from n to 0 (inclusive).

IN R0ADD R0,1 # The number is first subtracted, so add1 to the initial number.loop:SUB R0,1 # 0 needs to be included. Subtracting 1 from 0 gives 255. So, first subtract, print,and then check.OUT R0CMP R0,0JAloop

Reverse

Reads 8 numbers and prints them in reverse order.

MOV R0,0_input_loop:IN R1PUSH R1 # Read each number andpush it onto the stack.ADD R0,1CMP R0,8JB _input_loopMOV R0,8_output_loop:POP R1 # Popeach number from the stack and output it.OUT R1SUB R0,1CMP R0,0JA _output_loop

License License: MIT

This project was created by The Exom Developers. It is licensed under the MIT license.

About

8-bit simple assembly-like language.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - exom-dev/SAL-8: 8-bit simple assembly-like language. · GitHub
Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

About CMake 3.15C 99

SAL-8 is an interpreted 8-bit simple assembly-like language designed to be embedded in games or other projects. More specifically, it was created for games which revolve around solving programming challenges.

This is a cross-platform C99 implementation of SAL-8, in the form of a library. A simple main.c file for generating an executable is also included.

Introduction

SAL-8 is an 8-bit language. Therefore, 8-bit numbers (0-255) are the only available data type.

All of the instructions are executed by a virtual machine. Each virtual machine gives the programmer access to two types of resources: a stack, and multiple registers.

  • a register simply holds an 8-bit number
  • the stack can hold multiple 8-bit numbers, but only the last one is directly accessible.

The registers can be directly referenced, while the stack can be manipulated via the PUSH and POP operations.

The number of registers and the stack size can be specified when creating a virtual machine. However, the usual values are 4 registers and a stack size of 8. These usual values are also used by the provided main.c file.

There is also a special register called CMP, which stores the result of the last CMP operation:

  • 0, if the operands are equal
  • 1, if the left operand is below the right one
  • 2, if the left operand is above the right one

Running the executable

To run a SAL-8 file with the executable, simply pass the path to the file as the first argument.

sal8 <FILE>

Syntax

Instructions

Each instruction is written on a separate line, and has the following form.

<OP> [LEFT] [, RIGHT]

The list of all operations is listed in a table below.

Comments

Comments are preceded by the # character.

# Single-line comment.

Labels

Labels can be created in the following way.

<label_name>:

To refer to a label, simply write the label name without :.

Registers

To refer to a register, use the Rn syntax, where n is the register number (e.g.R0, R3).

Operation Codes

Legend:

  • R - register
  • N - 8-bit number (0-255)
  • L - label

The result is stored in the left register (if applicable).

OPLeftRightDescription
ADDRR/NAdds the right number/register to the left register
ANDRR/NApplies the bitwise AND operator on the left register and the right number/register
CMPR/NR/NCompares a register/number value with another register/number value, and stores the result in the CMP register
DIVRR/NDivides the left register value by the right number/register value
INR-Reads an 8-bit number from STDIN (or IO interface), and stores it in the left register (if there is no more input, the VM is halted)
JAL-Checks the CMP register, and jumps to the specified label if the left operand is above the right
JAEL-Similar to JA, but also jumps if the two operands are equal
JBL-Similar to JA, but jumps only if the first operand is below the first
JBEL-Similar to JB, but also jumps if the two operands are equal
JEL-Similar to JA, but jumps only if the operands are equal
JMPL-Jumps to the specified label
MODRR/NApplies the mod operator between the left register and right number/register
MOVRRCopies the right register value in the left register
MULRR/NMultiplies the left register value by the right number/register value
NOTR-Applies the bitwise NOT operator on the left register value
ORRR/NApplies the bitwise OR operator on the left register value and right number/register value
OUTR/N-Writes the left register/number value to STDOUT (or IO interface)
SHLRR/NApplies the left shift operator on the left register value, with the right register/number value as the shift count
SHRRR/NSimilar to SHL, but shifts to the right
POPR-Pops the stack and stores the popped element in the left register
PUSHR/N-Pushes the left register/number value onto the stack
SUBRR/NSubtracts the right register/number value from the left register
XORRR/NApplies the bitwise XOR operator on the left register value and the right register/number value

Examples

Echo

Reads numbers and outputs them.

_loop:IN R0 # Read a number and store it in the first register. If there is no more input,or the input is invalid, the VM will be halted.OUT R0 # Output the number stored in the first register.JMP _loop # Jump back.

Count

Reads a number n and prints all numbers from n to 0 (inclusive).

IN R0ADD R0,1 # The number is first subtracted, so add1 to the initial number.loop:SUB R0,1 # 0 needs to be included. Subtracting 1 from 0 gives 255. So, first subtract, print,and then check.OUT R0CMP R0,0JAloop

Reverse

Reads 8 numbers and prints them in reverse order.

MOV R0,0_input_loop:IN R1PUSH R1 # Read each number andpush it onto the stack.ADD R0,1CMP R0,8JB _input_loopMOV R0,8_output_loop:POP R1 # Popeach number from the stack and output it.OUT R1SUB R0,1CMP R0,0JA _output_loop

License License: MIT

This project was created by The Exom Developers. It is licensed under the MIT license.

About

8-bit simple assembly-like language.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - exom-dev/SAL-8: 8-bit simple assembly-like language. · GitHub
Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

About CMake 3.15C 99

SAL-8 is an interpreted 8-bit simple assembly-like language designed to be embedded in games or other projects. More specifically, it was created for games which revolve around solving programming challenges.

This is a cross-platform C99 implementation of SAL-8, in the form of a library. A simple main.c file for generating an executable is also included.

Introduction

SAL-8 is an 8-bit language. Therefore, 8-bit numbers (0-255) are the only available data type.

All of the instructions are executed by a virtual machine. Each virtual machine gives the programmer access to two types of resources: a stack, and multiple registers.

  • a register simply holds an 8-bit number
  • the stack can hold multiple 8-bit numbers, but only the last one is directly accessible.

The registers can be directly referenced, while the stack can be manipulated via the PUSH and POP operations.

The number of registers and the stack size can be specified when creating a virtual machine. However, the usual values are 4 registers and a stack size of 8. These usual values are also used by the provided main.c file.

There is also a special register called CMP, which stores the result of the last CMP operation:

  • 0, if the operands are equal
  • 1, if the left operand is below the right one
  • 2, if the left operand is above the right one

Running the executable

To run a SAL-8 file with the executable, simply pass the path to the file as the first argument.

sal8 <FILE>

Syntax

Instructions

Each instruction is written on a separate line, and has the following form.

<OP> [LEFT] [, RIGHT]

The list of all operations is listed in a table below.

Comments

Comments are preceded by the # character.

# Single-line comment.

Labels

Labels can be created in the following way.

<label_name>:

To refer to a label, simply write the label name without :.

Registers

To refer to a register, use the Rn syntax, where n is the register number (e.g.R0, R3).

Operation Codes

Legend:

  • R - register
  • N - 8-bit number (0-255)
  • L - label

The result is stored in the left register (if applicable).

OPLeftRightDescription
ADDRR/NAdds the right number/register to the left register
ANDRR/NApplies the bitwise AND operator on the left register and the right number/register
CMPR/NR/NCompares a register/number value with another register/number value, and stores the result in the CMP register
DIVRR/NDivides the left register value by the right number/register value
INR-Reads an 8-bit number from STDIN (or IO interface), and stores it in the left register (if there is no more input, the VM is halted)
JAL-Checks the CMP register, and jumps to the specified label if the left operand is above the right
JAEL-Similar to JA, but also jumps if the two operands are equal
JBL-Similar to JA, but jumps only if the first operand is below the first
JBEL-Similar to JB, but also jumps if the two operands are equal
JEL-Similar to JA, but jumps only if the operands are equal
JMPL-Jumps to the specified label
MODRR/NApplies the mod operator between the left register and right number/register
MOVRRCopies the right register value in the left register
MULRR/NMultiplies the left register value by the right number/register value
NOTR-Applies the bitwise NOT operator on the left register value
ORRR/NApplies the bitwise OR operator on the left register value and right number/register value
OUTR/N-Writes the left register/number value to STDOUT (or IO interface)
SHLRR/NApplies the left shift operator on the left register value, with the right register/number value as the shift count
SHRRR/NSimilar to SHL, but shifts to the right
POPR-Pops the stack and stores the popped element in the left register
PUSHR/N-Pushes the left register/number value onto the stack
SUBRR/NSubtracts the right register/number value from the left register
XORRR/NApplies the bitwise XOR operator on the left register value and the right register/number value

Examples

Echo

Reads numbers and outputs them.

_loop:IN R0 # Read a number and store it in the first register. If there is no more input,or the input is invalid, the VM will be halted.OUT R0 # Output the number stored in the first register.JMP _loop # Jump back.

Count

Reads a number n and prints all numbers from n to 0 (inclusive).

IN R0ADD R0,1 # The number is first subtracted, so add1 to the initial number.loop:SUB R0,1 # 0 needs to be included. Subtracting 1 from 0 gives 255. So, first subtract, print,and then check.OUT R0CMP R0,0JAloop

Reverse

Reads 8 numbers and prints them in reverse order.

MOV R0,0_input_loop:IN R1PUSH R1 # Read each number andpush it onto the stack.ADD R0,1CMP R0,8JB _input_loopMOV R0,8_output_loop:POP R1 # Popeach number from the stack and output it.OUT R1SUB R0,1CMP R0,0JA _output_loop

License License: MIT

This project was created by The Exom Developers. It is licensed under the MIT license.

About

8-bit simple assembly-like language.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - exom-dev/SAL-8: 8-bit simple assembly-like language. · GitHub
Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

About CMake 3.15C 99

SAL-8 is an interpreted 8-bit simple assembly-like language designed to be embedded in games or other projects. More specifically, it was created for games which revolve around solving programming challenges.

This is a cross-platform C99 implementation of SAL-8, in the form of a library. A simple main.c file for generating an executable is also included.

Introduction

SAL-8 is an 8-bit language. Therefore, 8-bit numbers (0-255) are the only available data type.

All of the instructions are executed by a virtual machine. Each virtual machine gives the programmer access to two types of resources: a stack, and multiple registers.

  • a register simply holds an 8-bit number
  • the stack can hold multiple 8-bit numbers, but only the last one is directly accessible.

The registers can be directly referenced, while the stack can be manipulated via the PUSH and POP operations.

The number of registers and the stack size can be specified when creating a virtual machine. However, the usual values are 4 registers and a stack size of 8. These usual values are also used by the provided main.c file.

There is also a special register called CMP, which stores the result of the last CMP operation:

  • 0, if the operands are equal
  • 1, if the left operand is below the right one
  • 2, if the left operand is above the right one

Running the executable

To run a SAL-8 file with the executable, simply pass the path to the file as the first argument.

sal8 <FILE>

Syntax

Instructions

Each instruction is written on a separate line, and has the following form.

<OP> [LEFT] [, RIGHT]

The list of all operations is listed in a table below.

Comments

Comments are preceded by the # character.

# Single-line comment.

Labels

Labels can be created in the following way.

<label_name>:

To refer to a label, simply write the label name without :.

Registers

To refer to a register, use the Rn syntax, where n is the register number (e.g.R0, R3).

Operation Codes

Legend:

  • R - register
  • N - 8-bit number (0-255)
  • L - label

The result is stored in the left register (if applicable).

OPLeftRightDescription
ADDRR/NAdds the right number/register to the left register
ANDRR/NApplies the bitwise AND operator on the left register and the right number/register
CMPR/NR/NCompares a register/number value with another register/number value, and stores the result in the CMP register
DIVRR/NDivides the left register value by the right number/register value
INR-Reads an 8-bit number from STDIN (or IO interface), and stores it in the left register (if there is no more input, the VM is halted)
JAL-Checks the CMP register, and jumps to the specified label if the left operand is above the right
JAEL-Similar to JA, but also jumps if the two operands are equal
JBL-Similar to JA, but jumps only if the first operand is below the first
JBEL-Similar to JB, but also jumps if the two operands are equal
JEL-Similar to JA, but jumps only if the operands are equal
JMPL-Jumps to the specified label
MODRR/NApplies the mod operator between the left register and right number/register
MOVRRCopies the right register value in the left register
MULRR/NMultiplies the left register value by the right number/register value
NOTR-Applies the bitwise NOT operator on the left register value
ORRR/NApplies the bitwise OR operator on the left register value and right number/register value
OUTR/N-Writes the left register/number value to STDOUT (or IO interface)
SHLRR/NApplies the left shift operator on the left register value, with the right register/number value as the shift count
SHRRR/NSimilar to SHL, but shifts to the right
POPR-Pops the stack and stores the popped element in the left register
PUSHR/N-Pushes the left register/number value onto the stack
SUBRR/NSubtracts the right register/number value from the left register
XORRR/NApplies the bitwise XOR operator on the left register value and the right register/number value

Examples

Echo

Reads numbers and outputs them.

_loop:IN R0 # Read a number and store it in the first register. If there is no more input,or the input is invalid, the VM will be halted.OUT R0 # Output the number stored in the first register.JMP _loop # Jump back.

Count

Reads a number n and prints all numbers from n to 0 (inclusive).

IN R0ADD R0,1 # The number is first subtracted, so add1 to the initial number.loop:SUB R0,1 # 0 needs to be included. Subtracting 1 from 0 gives 255. So, first subtract, print,and then check.OUT R0CMP R0,0JAloop

Reverse

Reads 8 numbers and prints them in reverse order.

MOV R0,0_input_loop:IN R1PUSH R1 # Read each number andpush it onto the stack.ADD R0,1CMP R0,8JB _input_loopMOV R0,8_output_loop:POP R1 # Popeach number from the stack and output it.OUT R1SUB R0,1CMP R0,0JA _output_loop

License License: MIT

This project was created by The Exom Developers. It is licensed under the MIT license.

About

8-bit simple assembly-like language.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - exom-dev/SAL-8: 8-bit simple assembly-like language. · GitHub
Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

About CMake 3.15C 99

SAL-8 is an interpreted 8-bit simple assembly-like language designed to be embedded in games or other projects. More specifically, it was created for games which revolve around solving programming challenges.

This is a cross-platform C99 implementation of SAL-8, in the form of a library. A simple main.c file for generating an executable is also included.

Introduction

SAL-8 is an 8-bit language. Therefore, 8-bit numbers (0-255) are the only available data type.

All of the instructions are executed by a virtual machine. Each virtual machine gives the programmer access to two types of resources: a stack, and multiple registers.

  • a register simply holds an 8-bit number
  • the stack can hold multiple 8-bit numbers, but only the last one is directly accessible.

The registers can be directly referenced, while the stack can be manipulated via the PUSH and POP operations.

The number of registers and the stack size can be specified when creating a virtual machine. However, the usual values are 4 registers and a stack size of 8. These usual values are also used by the provided main.c file.

There is also a special register called CMP, which stores the result of the last CMP operation:

  • 0, if the operands are equal
  • 1, if the left operand is below the right one
  • 2, if the left operand is above the right one

Running the executable

To run a SAL-8 file with the executable, simply pass the path to the file as the first argument.

sal8 <FILE>

Syntax

Instructions

Each instruction is written on a separate line, and has the following form.

<OP> [LEFT] [, RIGHT]

The list of all operations is listed in a table below.

Comments

Comments are preceded by the # character.

# Single-line comment.

Labels

Labels can be created in the following way.

<label_name>:

To refer to a label, simply write the label name without :.

Registers

To refer to a register, use the Rn syntax, where n is the register number (e.g.R0, R3).

Operation Codes

Legend:

  • R - register
  • N - 8-bit number (0-255)
  • L - label

The result is stored in the left register (if applicable).

OPLeftRightDescription
ADDRR/NAdds the right number/register to the left register
ANDRR/NApplies the bitwise AND operator on the left register and the right number/register
CMPR/NR/NCompares a register/number value with another register/number value, and stores the result in the CMP register
DIVRR/NDivides the left register value by the right number/register value
INR-Reads an 8-bit number from STDIN (or IO interface), and stores it in the left register (if there is no more input, the VM is halted)
JAL-Checks the CMP register, and jumps to the specified label if the left operand is above the right
JAEL-Similar to JA, but also jumps if the two operands are equal
JBL-Similar to JA, but jumps only if the first operand is below the first
JBEL-Similar to JB, but also jumps if the two operands are equal
JEL-Similar to JA, but jumps only if the operands are equal
JMPL-Jumps to the specified label
MODRR/NApplies the mod operator between the left register and right number/register
MOVRRCopies the right register value in the left register
MULRR/NMultiplies the left register value by the right number/register value
NOTR-Applies the bitwise NOT operator on the left register value
ORRR/NApplies the bitwise OR operator on the left register value and right number/register value
OUTR/N-Writes the left register/number value to STDOUT (or IO interface)
SHLRR/NApplies the left shift operator on the left register value, with the right register/number value as the shift count
SHRRR/NSimilar to SHL, but shifts to the right
POPR-Pops the stack and stores the popped element in the left register
PUSHR/N-Pushes the left register/number value onto the stack
SUBRR/NSubtracts the right register/number value from the left register
XORRR/NApplies the bitwise XOR operator on the left register value and the right register/number value

Examples

Echo

Reads numbers and outputs them.

_loop:IN R0 # Read a number and store it in the first register. If there is no more input,or the input is invalid, the VM will be halted.OUT R0 # Output the number stored in the first register.JMP _loop # Jump back.

Count

Reads a number n and prints all numbers from n to 0 (inclusive).

IN R0ADD R0,1 # The number is first subtracted, so add1 to the initial number.loop:SUB R0,1 # 0 needs to be included. Subtracting 1 from 0 gives 255. So, first subtract, print,and then check.OUT R0CMP R0,0JAloop

Reverse

Reads 8 numbers and prints them in reverse order.

MOV R0,0_input_loop:IN R1PUSH R1 # Read each number andpush it onto the stack.ADD R0,1CMP R0,8JB _input_loopMOV R0,8_output_loop:POP R1 # Popeach number from the stack and output it.OUT R1SUB R0,1CMP R0,0JA _output_loop

License License: MIT

This project was created by The Exom Developers. It is licensed under the MIT license.

About

8-bit simple assembly-like language.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages