Thanks for using Compiler Explorer
Sponsors
Jakt
C++
Ada
Analysis
Android Java
Android Kotlin
Assembly
C
C3
Carbon
C++ (Circle)
CIRCT
Clean
CMake
CMakeScript
COBOL
C++ for OpenCL
MLIR
Cppx
Cppx-Blue
Cppx-Gold
Cpp2-cppfront
Crystal
C#
CUDA C++
D
Dart
Elixir
Erlang
Fortran
F#
GLSL
Go
Haskell
HLSL
Hook
Hylo
IL
ispc
Java
Julia
Kotlin
LLVM IR
LLVM MIR
Modula-2
Nim
Objective-C
Objective-C++
OCaml
OpenCL C
Pascal
Pony
Python
Racket
Ruby
Rust
Snowball
Scala
Solidity
Spice
SPIR-V
Swift
LLVM TableGen
Toit
TypeScript Native
V
Vala
Visual Basic
Vyper
WASM
Zig
Javascript
GIMPLE
Ygen
c++ source #1
Output
Compile to binary object
Link to binary
Execute the code
Intel asm syntax
Demangle identifiers
Verbose demangling
Filters
Unused labels
Library functions
Directives
Comments
Horizontal whitespace
Debug intrinsics
Compiler
6502-c++ 11.1.0
ARM GCC 10.2.0
ARM GCC 10.3.0
ARM GCC 10.4.0
ARM GCC 10.5.0
ARM GCC 11.1.0
ARM GCC 11.2.0
ARM GCC 11.3.0
ARM GCC 11.4.0
ARM GCC 12.1.0
ARM GCC 12.2.0
ARM GCC 12.3.0
ARM GCC 12.4.0
ARM GCC 13.1.0
ARM GCC 13.2.0
ARM GCC 13.2.0 (unknown-eabi)
ARM GCC 13.3.0
ARM GCC 13.3.0 (unknown-eabi)
ARM GCC 14.1.0
ARM GCC 14.1.0 (unknown-eabi)
ARM GCC 14.2.0
ARM GCC 14.2.0 (unknown-eabi)
ARM GCC 4.5.4
ARM GCC 4.6.4
ARM GCC 5.4
ARM GCC 6.3.0
ARM GCC 6.4.0
ARM GCC 7.3.0
ARM GCC 7.5.0
ARM GCC 8.2.0
ARM GCC 8.5.0
ARM GCC 9.3.0
ARM GCC 9.4.0
ARM GCC 9.5.0
ARM GCC trunk
ARM gcc 10.2.1 (none)
ARM gcc 10.3.1 (2021.07 none)
ARM gcc 10.3.1 (2021.10 none)
ARM gcc 11.2.1 (none)
ARM gcc 5.4.1 (none)
ARM gcc 7.2.1 (none)
ARM gcc 8.2 (WinCE)
ARM gcc 8.3.1 (none)
ARM gcc 9.2.1 (none)
ARM msvc v19.0 (WINE)
ARM msvc v19.10 (WINE)
ARM msvc v19.14 (WINE)
ARM64 Morello gcc 10.1 Alpha 2
ARM64 gcc 10.2
ARM64 gcc 10.3
ARM64 gcc 10.4
ARM64 gcc 10.5.0
ARM64 gcc 11.1
ARM64 gcc 11.2
ARM64 gcc 11.3
ARM64 gcc 11.4.0
ARM64 gcc 12.1
ARM64 gcc 12.2.0
ARM64 gcc 12.3.0
ARM64 gcc 12.4.0
ARM64 gcc 13.1.0
ARM64 gcc 13.2.0
ARM64 gcc 13.3.0
ARM64 gcc 14.1.0
ARM64 gcc 14.2.0
ARM64 gcc 4.9.4
ARM64 gcc 5.4
ARM64 gcc 5.5.0
ARM64 gcc 6.3
ARM64 gcc 6.4
ARM64 gcc 7.3
ARM64 gcc 7.5
ARM64 gcc 8.2
ARM64 gcc 8.5
ARM64 gcc 9.3
ARM64 gcc 9.4
ARM64 gcc 9.5
ARM64 gcc trunk
ARM64 msvc v19.14 (WINE)
AVR gcc 10.3.0
AVR gcc 11.1.0
AVR gcc 12.1.0
AVR gcc 12.2.0
AVR gcc 12.3.0
AVR gcc 12.4.0
AVR gcc 13.1.0
AVR gcc 13.2.0
AVR gcc 13.3.0
AVR gcc 14.1.0
AVR gcc 14.2.0
AVR gcc 4.5.4
AVR gcc 4.6.4
AVR gcc 5.4.0
AVR gcc 9.2.0
AVR gcc 9.3.0
Arduino Mega (1.8.9)
Arduino Uno (1.8.9)
BPF clang (trunk)
BPF clang 13.0.0
BPF clang 14.0.0
BPF clang 15.0.0
BPF clang 16.0.0
BPF clang 17.0.1
BPF clang 18.1.0
BPF clang 19.1.0
BPF gcc 13.1.0
BPF gcc 13.2.0
BPF gcc 13.3.0
BPF gcc trunk
EDG (experimental reflection)
EDG 6.5
EDG 6.5 (GNU mode gcc 13)
EDG 6.6
EDG 6.6 (GNU mode gcc 13)
FRC 2019
FRC 2020
FRC 2023
HPPA gcc 14.2.0
KVX ACB 4.1.0 (GCC 7.5.0)
KVX ACB 4.1.0-cd1 (GCC 7.5.0)
KVX ACB 4.10.0 (GCC 10.3.1)
KVX ACB 4.11.1 (GCC 10.3.1)
KVX ACB 4.12.0 (GCC 11.3.0)
KVX ACB 4.2.0 (GCC 7.5.0)
KVX ACB 4.3.0 (GCC 7.5.0)
KVX ACB 4.4.0 (GCC 7.5.0)
KVX ACB 4.6.0 (GCC 9.4.1)
KVX ACB 4.8.0 (GCC 9.4.1)
KVX ACB 4.9.0 (GCC 9.4.1)
KVX ACB 5.0.0 (GCC 12.2.1)
KVX ACB 5.2.0 (GCC 13.2.1)
LoongArch64 clang (trunk)
LoongArch64 clang 17.0.1
LoongArch64 clang 18.1.0
LoongArch64 clang 19.1.0
M68K gcc 13.1.0
M68K gcc 13.2.0
M68K gcc 13.3.0
M68K gcc 14.1.0
M68K gcc 14.2.0
M68k clang (trunk)
MRISC32 gcc (trunk)
MSP430 gcc 4.5.3
MSP430 gcc 5.3.0
MSP430 gcc 6.2.1
MinGW clang 14.0.3
MinGW clang 14.0.6
MinGW clang 15.0.7
MinGW clang 16.0.0
MinGW clang 16.0.2
MinGW gcc 11.3.0
MinGW gcc 12.1.0
MinGW gcc 12.2.0
MinGW gcc 13.1.0
RISC-V (32-bits) gcc (trunk)
RISC-V (32-bits) gcc 10.2.0
RISC-V (32-bits) gcc 10.3.0
RISC-V (32-bits) gcc 11.2.0
RISC-V (32-bits) gcc 11.3.0
RISC-V (32-bits) gcc 11.4.0
RISC-V (32-bits) gcc 12.1.0
RISC-V (32-bits) gcc 12.2.0
RISC-V (32-bits) gcc 12.3.0
RISC-V (32-bits) gcc 12.4.0
RISC-V (32-bits) gcc 13.1.0
RISC-V (32-bits) gcc 13.2.0
RISC-V (32-bits) gcc 13.3.0
RISC-V (32-bits) gcc 14.1.0
RISC-V (32-bits) gcc 14.2.0
RISC-V (32-bits) gcc 8.2.0
RISC-V (32-bits) gcc 8.5.0
RISC-V (32-bits) gcc 9.4.0
RISC-V (64-bits) gcc (trunk)
RISC-V (64-bits) gcc 10.2.0
RISC-V (64-bits) gcc 10.3.0
RISC-V (64-bits) gcc 11.2.0
RISC-V (64-bits) gcc 11.3.0
RISC-V (64-bits) gcc 11.4.0
RISC-V (64-bits) gcc 12.1.0
RISC-V (64-bits) gcc 12.2.0
RISC-V (64-bits) gcc 12.3.0
RISC-V (64-bits) gcc 12.4.0
RISC-V (64-bits) gcc 13.1.0
RISC-V (64-bits) gcc 13.2.0
RISC-V (64-bits) gcc 13.3.0
RISC-V (64-bits) gcc 14.1.0
RISC-V (64-bits) gcc 14.2.0
RISC-V (64-bits) gcc 8.2.0
RISC-V (64-bits) gcc 8.5.0
RISC-V (64-bits) gcc 9.4.0
RISC-V rv32gc clang (trunk)
RISC-V rv32gc clang 10.0.0
RISC-V rv32gc clang 10.0.1
RISC-V rv32gc clang 11.0.0
RISC-V rv32gc clang 11.0.1
RISC-V rv32gc clang 12.0.0
RISC-V rv32gc clang 12.0.1
RISC-V rv32gc clang 13.0.0
RISC-V rv32gc clang 13.0.1
RISC-V rv32gc clang 14.0.0
RISC-V rv32gc clang 15.0.0
RISC-V rv32gc clang 16.0.0
RISC-V rv32gc clang 17.0.1
RISC-V rv32gc clang 18.1.0
RISC-V rv32gc clang 19.1.0
RISC-V rv32gc clang 9.0.0
RISC-V rv32gc clang 9.0.1
RISC-V rv64gc clang (trunk)
RISC-V rv64gc clang 10.0.0
RISC-V rv64gc clang 10.0.1
RISC-V rv64gc clang 11.0.0
RISC-V rv64gc clang 11.0.1
RISC-V rv64gc clang 12.0.0
RISC-V rv64gc clang 12.0.1
RISC-V rv64gc clang 13.0.0
RISC-V rv64gc clang 13.0.1
RISC-V rv64gc clang 14.0.0
RISC-V rv64gc clang 15.0.0
RISC-V rv64gc clang 16.0.0
RISC-V rv64gc clang 17.0.1
RISC-V rv64gc clang 18.1.0
RISC-V rv64gc clang 19.1.0
RISC-V rv64gc clang 9.0.0
RISC-V rv64gc clang 9.0.1
Raspbian Buster
Raspbian Stretch
SPARC LEON gcc 12.2.0
SPARC LEON gcc 12.3.0
SPARC LEON gcc 12.4.0
SPARC LEON gcc 13.1.0
SPARC LEON gcc 13.2.0
SPARC LEON gcc 13.3.0
SPARC LEON gcc 14.1.0
SPARC LEON gcc 14.2.0
SPARC gcc 12.2.0
SPARC gcc 12.3.0
SPARC gcc 12.4.0
SPARC gcc 13.1.0
SPARC gcc 13.2.0
SPARC gcc 13.3.0
SPARC gcc 14.1.0
SPARC gcc 14.2.0
SPARC64 gcc 12.2.0
SPARC64 gcc 12.3.0
SPARC64 gcc 12.4.0
SPARC64 gcc 13.1.0
SPARC64 gcc 13.2.0
SPARC64 gcc 13.3.0
SPARC64 gcc 14.1.0
SPARC64 gcc 14.2.0
TI C6x gcc 12.2.0
TI C6x gcc 12.3.0
TI C6x gcc 12.4.0
TI C6x gcc 13.1.0
TI C6x gcc 13.2.0
TI C6x gcc 13.3.0
TI C6x gcc 14.1.0
TI C6x gcc 14.2.0
TI CL430 21.6.1
VAX gcc NetBSDELF 10.4.0
VAX gcc NetBSDELF 10.5.0 (Nov 15 03:50:22 2023)
WebAssembly clang (trunk)
Xtensa ESP32 gcc 11.2.0 (2022r1)
Xtensa ESP32 gcc 12.2.0 (20230208)
Xtensa ESP32 gcc 8.2.0 (2019r2)
Xtensa ESP32 gcc 8.2.0 (2020r1)
Xtensa ESP32 gcc 8.2.0 (2020r2)
Xtensa ESP32 gcc 8.4.0 (2020r3)
Xtensa ESP32 gcc 8.4.0 (2021r1)
Xtensa ESP32 gcc 8.4.0 (2021r2)
Xtensa ESP32-S2 gcc 11.2.0 (2022r1)
Xtensa ESP32-S2 gcc 12.2.0 (20230208)
Xtensa ESP32-S2 gcc 8.2.0 (2019r2)
Xtensa ESP32-S2 gcc 8.2.0 (2020r1)
Xtensa ESP32-S2 gcc 8.2.0 (2020r2)
Xtensa ESP32-S2 gcc 8.4.0 (2020r3)
Xtensa ESP32-S2 gcc 8.4.0 (2021r1)
Xtensa ESP32-S2 gcc 8.4.0 (2021r2)
Xtensa ESP32-S3 gcc 11.2.0 (2022r1)
Xtensa ESP32-S3 gcc 12.2.0 (20230208)
Xtensa ESP32-S3 gcc 8.4.0 (2020r3)
Xtensa ESP32-S3 gcc 8.4.0 (2021r1)
Xtensa ESP32-S3 gcc 8.4.0 (2021r2)
arm64 msvc v19.20 VS16.0
arm64 msvc v19.21 VS16.1
arm64 msvc v19.22 VS16.2
arm64 msvc v19.23 VS16.3
arm64 msvc v19.24 VS16.4
arm64 msvc v19.25 VS16.5
arm64 msvc v19.27 VS16.7
arm64 msvc v19.28 VS16.8
arm64 msvc v19.28 VS16.9
arm64 msvc v19.29 VS16.10
arm64 msvc v19.29 VS16.11
arm64 msvc v19.30 VS17.0
arm64 msvc v19.31 VS17.1
arm64 msvc v19.32 VS17.2
arm64 msvc v19.33 VS17.3
arm64 msvc v19.34 VS17.4
arm64 msvc v19.35 VS17.5
arm64 msvc v19.36 VS17.6
arm64 msvc v19.37 VS17.7
arm64 msvc v19.38 VS17.8
arm64 msvc v19.39 VS17.9
arm64 msvc v19.40 VS17.10
arm64 msvc v19.latest
armv7-a clang (trunk)
armv7-a clang 10.0.0
armv7-a clang 10.0.1
armv7-a clang 11.0.0
armv7-a clang 11.0.1
armv7-a clang 12.0.0
armv7-a clang 12.0.1
armv7-a clang 13.0.0
armv7-a clang 13.0.1
armv7-a clang 14.0.0
armv7-a clang 15.0.0
armv7-a clang 16.0.0
armv7-a clang 17.0.1
armv7-a clang 18.1.0
armv7-a clang 19.1.0
armv7-a clang 9.0.0
armv7-a clang 9.0.1
armv8-a clang (all architectural features, trunk)
armv8-a clang (trunk)
armv8-a clang 10.0.0
armv8-a clang 10.0.1
armv8-a clang 11.0.0
armv8-a clang 11.0.1
armv8-a clang 12.0.0
armv8-a clang 13.0.0
armv8-a clang 14.0.0
armv8-a clang 15.0.0
armv8-a clang 16.0.0
armv8-a clang 17.0.1
armv8-a clang 18.1.0
armv8-a clang 19.1.0
armv8-a clang 9.0.0
armv8-a clang 9.0.1
clang-cl 18.1.0
ellcc 0.1.33
ellcc 0.1.34
ellcc 2017-07-16
hexagon-clang 16.0.5
llvm-mos atari2600-3e
llvm-mos atari2600-4k
llvm-mos atari2600-common
llvm-mos atari5200-supercart
llvm-mos atari8-cart-megacart
llvm-mos atari8-cart-std
llvm-mos atari8-cart-xegs
llvm-mos atari8-common
llvm-mos atari8-dos
llvm-mos c128
llvm-mos c64
llvm-mos commodore
llvm-mos cpm65
llvm-mos cx16
llvm-mos dodo
llvm-mos eater
llvm-mos mega65
llvm-mos nes
llvm-mos nes-action53
llvm-mos nes-cnrom
llvm-mos nes-gtrom
llvm-mos nes-mmc1
llvm-mos nes-mmc3
llvm-mos nes-nrom
llvm-mos nes-unrom
llvm-mos nes-unrom-512
llvm-mos osi-c1p
llvm-mos pce
llvm-mos pce-cd
llvm-mos pce-common
llvm-mos pet
llvm-mos rp6502
llvm-mos rpc8e
llvm-mos supervision
llvm-mos vic20
loongarch64 gcc 12.2.0
loongarch64 gcc 12.3.0
loongarch64 gcc 12.4.0
loongarch64 gcc 13.1.0
loongarch64 gcc 13.2.0
loongarch64 gcc 13.3.0
loongarch64 gcc 14.1.0
loongarch64 gcc 14.2.0
mips clang 13.0.0
mips clang 14.0.0
mips clang 15.0.0
mips clang 16.0.0
mips clang 17.0.1
mips clang 18.1.0
mips clang 19.1.0
mips gcc 11.2.0
mips gcc 12.1.0
mips gcc 12.2.0
mips gcc 12.3.0
mips gcc 12.4.0
mips gcc 13.1.0
mips gcc 13.2.0
mips gcc 13.3.0
mips gcc 14.1.0
mips gcc 14.2.0
mips gcc 4.9.4
mips gcc 5.4
mips gcc 5.5.0
mips gcc 9.3.0 (codescape)
mips gcc 9.5.0
mips64 (el) gcc 12.1.0
mips64 (el) gcc 12.2.0
mips64 (el) gcc 12.3.0
mips64 (el) gcc 12.4.0
mips64 (el) gcc 13.1.0
mips64 (el) gcc 13.2.0
mips64 (el) gcc 13.3.0
mips64 (el) gcc 14.1.0
mips64 (el) gcc 14.2.0
mips64 (el) gcc 4.9.4
mips64 (el) gcc 5.4.0
mips64 (el) gcc 5.5.0
mips64 (el) gcc 9.5.0
mips64 clang 13.0.0
mips64 clang 14.0.0
mips64 clang 15.0.0
mips64 clang 16.0.0
mips64 clang 17.0.1
mips64 clang 18.1.0
mips64 clang 19.1.0
mips64 gcc 11.2.0
mips64 gcc 12.1.0
mips64 gcc 12.2.0
mips64 gcc 12.3.0
mips64 gcc 12.4.0
mips64 gcc 13.1.0
mips64 gcc 13.2.0
mips64 gcc 13.3.0
mips64 gcc 14.1.0
mips64 gcc 14.2.0
mips64 gcc 4.9.4
mips64 gcc 5.4.0
mips64 gcc 5.5.0
mips64 gcc 9.5.0
mips64el clang 13.0.0
mips64el clang 14.0.0
mips64el clang 15.0.0
mips64el clang 16.0.0
mips64el clang 17.0.1
mips64el clang 18.1.0
mips64el clang 19.1.0
mipsel clang 13.0.0
mipsel clang 14.0.0
mipsel clang 15.0.0
mipsel clang 16.0.0
mipsel clang 17.0.1
mipsel clang 18.1.0
mipsel clang 19.1.0
mipsel gcc 12.1.0
mipsel gcc 12.2.0
mipsel gcc 12.3.0
mipsel gcc 12.4.0
mipsel gcc 13.1.0
mipsel gcc 13.2.0
mipsel gcc 13.3.0
mipsel gcc 14.1.0
mipsel gcc 14.2.0
mipsel gcc 4.9.4
mipsel gcc 5.4.0
mipsel gcc 5.5.0
mipsel gcc 9.5.0
nanoMIPS gcc 6.3.0 (mtk)
power gcc 11.2.0
power gcc 12.1.0
power gcc 12.2.0
power gcc 12.3.0
power gcc 12.4.0
power gcc 13.1.0
power gcc 13.2.0
power gcc 13.3.0
power gcc 14.1.0
power gcc 14.2.0
power gcc 4.8.5
power64 AT12.0 (gcc8)
power64 AT13.0 (gcc9)
power64 gcc 11.2.0
power64 gcc 12.1.0
power64 gcc 12.2.0
power64 gcc 12.3.0
power64 gcc 12.4.0
power64 gcc 13.1.0
power64 gcc 13.2.0
power64 gcc 13.3.0
power64 gcc 14.1.0
power64 gcc 14.2.0
power64 gcc trunk
power64le AT12.0 (gcc8)
power64le AT13.0 (gcc9)
power64le clang (trunk)
power64le gcc 11.2.0
power64le gcc 12.1.0
power64le gcc 12.2.0
power64le gcc 12.3.0
power64le gcc 12.4.0
power64le gcc 13.1.0
power64le gcc 13.2.0
power64le gcc 13.3.0
power64le gcc 14.1.0
power64le gcc 14.2.0
power64le gcc 6.3.0
power64le gcc trunk
powerpc64 clang (trunk)
s390x gcc 11.2.0
s390x gcc 12.1.0
s390x gcc 12.2.0
s390x gcc 12.3.0
s390x gcc 12.4.0
s390x gcc 13.1.0
s390x gcc 13.2.0
s390x gcc 13.3.0
s390x gcc 14.1.0
s390x gcc 14.2.0
sh gcc 12.2.0
sh gcc 12.3.0
sh gcc 12.4.0
sh gcc 13.1.0
sh gcc 13.2.0
sh gcc 13.3.0
sh gcc 14.1.0
sh gcc 14.2.0
sh gcc 4.9.4
sh gcc 9.5.0
vast (trunk)
x64 msvc v19.0 (WINE)
x64 msvc v19.10 (WINE)
x64 msvc v19.14 (WINE)
x64 msvc v19.20 VS16.0
x64 msvc v19.21 VS16.1
x64 msvc v19.22 VS16.2
x64 msvc v19.23 VS16.3
x64 msvc v19.24 VS16.4
x64 msvc v19.25 VS16.5
x64 msvc v19.27 VS16.7
x64 msvc v19.28 VS16.8
x64 msvc v19.28 VS16.9
x64 msvc v19.29 VS16.10
x64 msvc v19.29 VS16.11
x64 msvc v19.30 VS17.0
x64 msvc v19.31 VS17.1
x64 msvc v19.32 VS17.2
x64 msvc v19.33 VS17.3
x64 msvc v19.34 VS17.4
x64 msvc v19.35 VS17.5
x64 msvc v19.36 VS17.6
x64 msvc v19.37 VS17.7
x64 msvc v19.38 VS17.8
x64 msvc v19.39 VS17.9
x64 msvc v19.40 VS17.10
x64 msvc v19.latest
x86 djgpp 4.9.4
x86 djgpp 5.5.0
x86 djgpp 6.4.0
x86 djgpp 7.2.0
x86 msvc v19.0 (WINE)
x86 msvc v19.10 (WINE)
x86 msvc v19.14 (WINE)
x86 msvc v19.20 VS16.0
x86 msvc v19.21 VS16.1
x86 msvc v19.22 VS16.2
x86 msvc v19.23 VS16.3
x86 msvc v19.24 VS16.4
x86 msvc v19.25 VS16.5
x86 msvc v19.27 VS16.7
x86 msvc v19.28 VS16.8
x86 msvc v19.28 VS16.9
x86 msvc v19.29 VS16.10
x86 msvc v19.29 VS16.11
x86 msvc v19.30 VS17.0
x86 msvc v19.31 VS17.1
x86 msvc v19.32 VS17.2
x86 msvc v19.33 VS17.3
x86 msvc v19.34 VS17.4
x86 msvc v19.35 VS17.5
x86 msvc v19.36 VS17.6
x86 msvc v19.37 VS17.7
x86 msvc v19.38 VS17.8
x86 msvc v19.39 VS17.9
x86 msvc v19.40 VS17.10
x86 msvc v19.latest
x86 nvc++ 22.11
x86 nvc++ 22.7
x86 nvc++ 22.9
x86 nvc++ 23.1
x86 nvc++ 23.11
x86 nvc++ 23.3
x86 nvc++ 23.5
x86 nvc++ 23.7
x86 nvc++ 23.9
x86 nvc++ 24.1
x86 nvc++ 24.11
x86 nvc++ 24.3
x86 nvc++ 24.5
x86 nvc++ 24.7
x86 nvc++ 24.9
x86-64 Zapcc 190308
x86-64 clang (EricWF contracts)
x86-64 clang (amd-staging)
x86-64 clang (assertions trunk)
x86-64 clang (clangir)
x86-64 clang (dascandy contracts)
x86-64 clang (experimental -Wlifetime)
x86-64 clang (experimental P1061)
x86-64 clang (experimental P1144)
x86-64 clang (experimental P1221)
x86-64 clang (experimental P2996)
x86-64 clang (experimental P3068)
x86-64 clang (experimental P3309)
x86-64 clang (experimental P3367)
x86-64 clang (experimental P3372)
x86-64 clang (experimental metaprogramming - P2632)
x86-64 clang (old concepts branch)
x86-64 clang (p1974)
x86-64 clang (pattern matching - P2688)
x86-64 clang (reflection)
x86-64 clang (resugar)
x86-64 clang (string interpolation - P3412)
x86-64 clang (thephd.dev)
x86-64 clang (trunk)
x86-64 clang (variadic friends - P2893)
x86-64 clang (widberg)
x86-64 clang 10.0.0
x86-64 clang 10.0.0 (assertions)
x86-64 clang 10.0.1
x86-64 clang 11.0.0
x86-64 clang 11.0.0 (assertions)
x86-64 clang 11.0.1
x86-64 clang 12.0.0
x86-64 clang 12.0.0 (assertions)
x86-64 clang 12.0.1
x86-64 clang 13.0.0
x86-64 clang 13.0.0 (assertions)
x86-64 clang 13.0.1
x86-64 clang 14.0.0
x86-64 clang 14.0.0 (assertions)
x86-64 clang 15.0.0
x86-64 clang 15.0.0 (assertions)
x86-64 clang 16.0.0
x86-64 clang 16.0.0 (assertions)
x86-64 clang 17.0.1
x86-64 clang 17.0.1 (assertions)
x86-64 clang 18.1.0
x86-64 clang 18.1.0 (assertions)
x86-64 clang 19.1.0
x86-64 clang 19.1.0 (assertions)
x86-64 clang 2.6.0 (assertions)
x86-64 clang 2.7.0 (assertions)
x86-64 clang 2.8.0 (assertions)
x86-64 clang 2.9.0 (assertions)
x86-64 clang 3.0.0
x86-64 clang 3.0.0 (assertions)
x86-64 clang 3.1
x86-64 clang 3.1 (assertions)
x86-64 clang 3.2
x86-64 clang 3.2 (assertions)
x86-64 clang 3.3
x86-64 clang 3.3 (assertions)
x86-64 clang 3.4 (assertions)
x86-64 clang 3.4.1
x86-64 clang 3.5
x86-64 clang 3.5 (assertions)
x86-64 clang 3.5.1
x86-64 clang 3.5.2
x86-64 clang 3.6
x86-64 clang 3.6 (assertions)
x86-64 clang 3.7
x86-64 clang 3.7 (assertions)
x86-64 clang 3.7.1
x86-64 clang 3.8
x86-64 clang 3.8 (assertions)
x86-64 clang 3.8.1
x86-64 clang 3.9.0
x86-64 clang 3.9.0 (assertions)
x86-64 clang 3.9.1
x86-64 clang 4.0.0
x86-64 clang 4.0.0 (assertions)
x86-64 clang 4.0.1
x86-64 clang 5.0.0
x86-64 clang 5.0.0 (assertions)
x86-64 clang 5.0.1
x86-64 clang 5.0.2
x86-64 clang 6.0.0
x86-64 clang 6.0.0 (assertions)
x86-64 clang 6.0.1
x86-64 clang 7.0.0
x86-64 clang 7.0.0 (assertions)
x86-64 clang 7.0.1
x86-64 clang 7.1.0
x86-64 clang 8.0.0
x86-64 clang 8.0.0 (assertions)
x86-64 clang 8.0.1
x86-64 clang 9.0.0
x86-64 clang 9.0.0 (assertions)
x86-64 clang 9.0.1
x86-64 clang rocm-4.5.2
x86-64 clang rocm-5.0.2
x86-64 clang rocm-5.1.3
x86-64 clang rocm-5.2.3
x86-64 clang rocm-5.3.3
x86-64 clang rocm-5.7.0
x86-64 clang rocm-6.0.2
x86-64 clang rocm-6.1.2
x86-64 gcc (contract labels)
x86-64 gcc (contracts natural syntax)
x86-64 gcc (contracts)
x86-64 gcc (coroutines)
x86-64 gcc (modules)
x86-64 gcc (trunk)
x86-64 gcc 10.1
x86-64 gcc 10.2
x86-64 gcc 10.3
x86-64 gcc 10.4
x86-64 gcc 10.5
x86-64 gcc 11.1
x86-64 gcc 11.2
x86-64 gcc 11.3
x86-64 gcc 11.4
x86-64 gcc 12.1
x86-64 gcc 12.2
x86-64 gcc 12.3
x86-64 gcc 12.4
x86-64 gcc 13.1
x86-64 gcc 13.2
x86-64 gcc 13.3
x86-64 gcc 14.1
x86-64 gcc 14.2
x86-64 gcc 3.4.6
x86-64 gcc 4.0.4
x86-64 gcc 4.1.2
x86-64 gcc 4.4.7
x86-64 gcc 4.5.3
x86-64 gcc 4.6.4
x86-64 gcc 4.7.1
x86-64 gcc 4.7.2
x86-64 gcc 4.7.3
x86-64 gcc 4.7.4
x86-64 gcc 4.8.1
x86-64 gcc 4.8.2
x86-64 gcc 4.8.3
x86-64 gcc 4.8.4
x86-64 gcc 4.8.5
x86-64 gcc 4.9.0
x86-64 gcc 4.9.1
x86-64 gcc 4.9.2
x86-64 gcc 4.9.3
x86-64 gcc 4.9.4
x86-64 gcc 5.1
x86-64 gcc 5.2
x86-64 gcc 5.3
x86-64 gcc 5.4
x86-64 gcc 5.5
x86-64 gcc 6.1
x86-64 gcc 6.2
x86-64 gcc 6.3
x86-64 gcc 6.4
x86-64 gcc 6.5
x86-64 gcc 7.1
x86-64 gcc 7.2
x86-64 gcc 7.3
x86-64 gcc 7.4
x86-64 gcc 7.5
x86-64 gcc 8.1
x86-64 gcc 8.2
x86-64 gcc 8.3
x86-64 gcc 8.4
x86-64 gcc 8.5
x86-64 gcc 9.1
x86-64 gcc 9.2
x86-64 gcc 9.3
x86-64 gcc 9.4
x86-64 gcc 9.5
x86-64 icc 13.0.1
x86-64 icc 16.0.3
x86-64 icc 17.0.0
x86-64 icc 18.0.0
x86-64 icc 19.0.0
x86-64 icc 19.0.1
x86-64 icc 2021.1.2
x86-64 icc 2021.10.0
x86-64 icc 2021.2.0
x86-64 icc 2021.3.0
x86-64 icc 2021.4.0
x86-64 icc 2021.5.0
x86-64 icc 2021.6.0
x86-64 icc 2021.7.0
x86-64 icc 2021.7.1
x86-64 icc 2021.8.0
x86-64 icc 2021.9.0
x86-64 icx 2021.1.2
x86-64 icx 2021.2.0
x86-64 icx 2021.3.0
x86-64 icx 2021.4.0
x86-64 icx 2022.0.0
x86-64 icx 2022.1.0
x86-64 icx 2022.2.0
x86-64 icx 2022.2.1
x86-64 icx 2023.0.0
x86-64 icx 2023.1.0
x86-64 icx 2023.2.1
x86-64 icx 2024.0.0
x86-64 icx 2024.1.0
x86-64 icx 2024.2.0
x86-64 icx 2025.0.0
x86-64 icx 2025.0.0
zig c++ 0.10.0
zig c++ 0.11.0
zig c++ 0.12.0
zig c++ 0.12.1
zig c++ 0.13.0
zig c++ 0.6.0
zig c++ 0.7.0
zig c++ 0.7.1
zig c++ 0.8.0
zig c++ 0.9.0
zig c++ trunk
Options
Source code
/* Copyright (c) 2021 Bad Diode Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE. */ #ifndef UTILS_SHORTHAND_H #define UTILS_SHORTHAND_H #include <assert.h> #include <stdbool.h> #include <stddef.h> #include <stdint.h> // Fixed size data types. typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; typedef uint64_t u64; typedef int8_t s8; typedef int16_t s16; typedef int32_t s32; typedef int64_t s64; typedef volatile u8 vu8; typedef volatile u16 vu16; typedef volatile u32 vu32; typedef volatile u64 vu64; typedef volatile s8 vs8; typedef volatile s16 vs16; typedef volatile s32 vs32; typedef volatile s64 vs64; // Size variables. #define KB(N) ((u64)(N) * 1024) #define MB(N) ((u64)KB(N) * 1024) #define GB(N) ((u64)MB(N) * 1024) #define TB(N) ((u64)GB(N) * 1024) // General utility macros. #define MIN(A, B) ((A) <= (B) ? (A) : (B)) #define MAX(A, B) ((A) >= (B) ? (A) : (B)) #define CLAMP(X, MIN, MAX) ((X) <= (MIN) ? (MIN) : (X) > (MAX) ? (MAX): (X)) #define LEN(ARR) (sizeof(ARR) / sizeof((ARR)[0])) #endif // UTILS_SHORTHAND_H // General UXN variables. #define PAGE_PROGRAM 0x0100 #define RAM_PAGES 0x10 #define POLYPHONY 4 // Accessor macros. #define PEEK(p) ((p)[0]) #define PEEK2(p) (((u16)(p)[0] << 8) | ((u16)(p)[1])) #define POP(p) ((p) -= 1, PEEK(p)) #define POP2(p) ((p) -= 2, PEEK2(p)) #define POKE(p, val) do { (p)[0] = (val); } while(0); #define POKE2(p, val) do { (p)[1] = (val) & 0xFF; (p)[0] = (val) >> 8; } while(0); #define PUSH(p, val) do { POKE((p), (val)); (p) += 1; } while(0) #define PUSH2(p, val) do { POKE2((p), (val)); (p) += 2; } while(0); // ROM. extern u8 uxn_rom[]; extern u8 uxn_rom_size[]; // RAM. u8 uxn_ram[KB(64) + 1]; // Stacks. u8 wst[256]; u8 rst[256]; u8 *w; u8 *r; // Devices. typedef u16 (*DeiFunc)(u8 *dev, u8 port); typedef void (*DeoFunc)(u8 *dev, u8 port); u8 device_data[256]; DeoFunc deo_map[16]; DeiFunc dei_map[16]; #define DEV(dev) PEEK2(&device_data[dev]) #define DEI(idx) dei_map[idx >> 4](&device_data[idx & 0xF0], idx & 0xF) #define DEO(idx) deo_map[idx >> 4](&device_data[idx & 0xF0], idx & 0xF) void uxn_eval(u16 pc_pos) { if (!pc_pos || device_data[0xf]) { return; } u8 *pc = &uxn_ram[pc_pos]; while (true) { switch (*pc++) { case 0x00: /* BRK */ { return; } break; case 0x20: /* JCI */ { u8 cond = POP(w); s16 off = PEEK2(pc); pc += 2; if (cond) { pc += off; } } break; case 0x40: /* JMI */ { s16 off = PEEK2(pc); pc += off + 2; } break; case 0x60: /* JSI */ { u16 pc_off = pc - uxn_ram + 2; s16 off = PEEK2(pc); PUSH2(r, pc_off); pc += off + 2; } break; case 0x80: /* LIT */ { u8 val = PEEK(pc); pc += 1; PUSH(w, val); } break; case 0xa0: /* LIT2 */ { u16 val = PEEK2(pc); pc += 2; PUSH2(w, val); } break; case 0xc0: /* LITr */ { u8 val = PEEK(pc); pc += 1; PUSH(r, val); } break; case 0xe0: /* LIT2r */ { u16 val = PEEK2(pc); pc += 2; PUSH2(r, val); } break; case 0x01: /* INC */ { u8 val = PEEK(w - 1) + 1; POKE(w - 1, val); } break; case 0x21: /* INC2 */ { u16 val = PEEK2(w - 2) + 1; POKE2(w - 2, val); } break; case 0x02: /* POP */ { w--; } break; case 0x22: /* POP2 */ { w -= 2; } break; case 0x03: /* NIP */ { u8 a = POP(w); w--; PUSH(w, a); } break; case 0x23: /* NIP2 */ { u16 a = POP2(w); w -= 2; PUSH2(w, a); } break; case 0x04: /* SWP */ { u8 b = POP(w); u8 a = POP(w); PUSH(w, b); PUSH(w, a); } break; case 0x24: /* SWP2 */ { u16 b = POP2(w); u16 a = POP2(w); PUSH2(w, b); PUSH2(w, a); } break; case 0x05: /* ROT */ { u8 c = POP(w); u8 b = POP(w); u8 a = POP(w); PUSH(w, b); PUSH(w, c); PUSH(w, a); } break; case 0x25: /* ROT2 */ { u16 c = POP2(w); u16 b = POP2(w); u16 a = POP2(w); PUSH2(w, b); PUSH2(w, c); PUSH2(w, a); } break; case 0x06: /* DUP */ { u8 a = PEEK(w - 1); PUSH(w, a); } break; case 0x26: /* DUP2 */ { u16 a = PEEK2(w - 2); PUSH2(w, a); } break; case 0x07: /* OVR */ { u8 b = POP(w); u8 a = POP(w); PUSH(w, a); PUSH(w, b); PUSH(w, a); } break; case 0x27: /* OVR2 */ { u16 b = POP2(w); u16 a = POP2(w); PUSH2(w, a); PUSH2(w, b); PUSH2(w, a); } break; case 0x08: /* EQU */ { u8 b = POP(w); u8 a = POP(w); if (a == b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0x28: /* EQU2 */ { u16 b = POP2(w); u16 a = POP2(w); if (a == b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0x09: /* NEQ */ { u8 b = POP(w); u8 a = POP(w); if (a != b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0x29: /* NEQ2 */ { u16 b = POP2(w); u16 a = POP2(w); if (a != b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0x0a: /* GTH */ { u8 b = POP(w); u8 a = POP(w); if (a > b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0x2a: /* GTH2 */ { u16 b = POP2(w); u16 a = POP2(w); if (a > b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0x0b: /* LTH */ { u8 b = POP(w); u8 a = POP(w); if (a < b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0x2b: /* LTH2 */ { u16 b = POP2(w); u16 a = POP2(w); if (a < b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0x0c: /* JMP */ { s8 off = POP(w); pc += off; } break; case 0x2c: /* JMP2 */ { u16 off = POP2(w); pc = uxn_ram + off; } break; case 0x0d: /* JCN */ { s8 off = POP(w); u8 cond = POP(w); if (cond) { pc += off; } } break; case 0x2d: /* JCN2 */ { u16 off = POP2(w); u8 cond = POP(w); if (cond) { pc = uxn_ram + off; } } break; case 0x0e: /* JSR */ { u16 pc_off = pc - uxn_ram; s8 off = POP(w); pc += off; PUSH2(r, pc_off); } break; case 0x2e: /* JSR2 */ { u16 pc_off = pc - uxn_ram; u16 off = POP2(w); pc = uxn_ram + off; PUSH2(r, pc_off); } break; case 0x0f: /* STH */ { u8 a = POP(w); PUSH(r, a); } break; case 0x2f: /* STH2 */ { u16 a = POP2(w); PUSH2(r, a); } break; case 0x10: /* LDZ */ { u8 off = POP(w); u8 val = PEEK(uxn_ram + off); PUSH(w, val); } break; case 0x30: /* LDZ2 */ { u8 off = POP(w); u16 val = PEEK2(uxn_ram + off); PUSH2(w, val); } break; case 0x11: /* STZ */ { u8 off = POP(w); u8 val = POP(w); POKE(uxn_ram + off, val); } break; case 0x31: /* STZ2 */ { u8 off = POP(w); u16 val = POP2(w); POKE2(uxn_ram + off, val); } break; case 0x12: /* LDR */ { s8 off = POP(w); u8 val = PEEK(pc + off); PUSH(w, val); } break; case 0x32: /* LDR2 */ { s8 off = POP(w); u16 val = PEEK2(pc + off); PUSH2(w, val); } break; case 0x13: /* STR */ { s8 off = POP(w); u8 val = POP(w); POKE(pc + off, val); } break; case 0x33: /* STR2 */ { s8 off = POP(w); u16 val = POP2(w); POKE2(pc + off, val); } break; case 0x14: /* LDA */ { u16 off = POP2(w); u8 val = PEEK(uxn_ram + off); PUSH(w, val); } break; case 0x34: /* LDA2 */ { u16 off = POP2(w); u16 val = PEEK2(uxn_ram + off); PUSH2(w, val); } break; case 0x15: /* STA */ { u16 off = POP2(w); u8 val = POP(w); POKE(uxn_ram + off, val); } break; case 0x35: /* STA2 */ { u16 off = POP2(w); u16 val = POP2(w); POKE2(uxn_ram + off, val); } break; case 0x16: /* DEI */ { u8 dev = POP(w); u8 val = DEI(dev); PUSH(w, val); } break; case 0x36: /* DEI2 */ { u8 dev = POP(w); u16 val = DEI(dev); PUSH2(w, val); } break; case 0x17: /* DEO */ { u8 dev = POP(w); u8 val = POP(w); POKE(device_data + dev, val); DEO(dev); } break; case 0x37: /* DEO2 */ { u8 dev = POP(w); u16 val = POP2(w); POKE2(device_data + dev, val); DEO(dev); } break; case 0x18: /* ADD */ { u8 b = POP(w); u8 a = POP(w); PUSH(w, a + b); } break; case 0x38: /* ADD2 */ { u16 b = POP2(w); u16 a = POP2(w); PUSH2(w, a + b); } break; case 0x19: /* SUB */ { u8 b = POP(w); u8 a = POP(w); PUSH(w, a - b); } break; case 0x39: /* SUB2 */ { u16 b = POP2(w); u16 a = POP2(w); PUSH2(w, a - b); } break; case 0x1a: /* MUL */ { u8 b = POP(w); u8 a = POP(w); PUSH(w, a * b); } break; case 0x3a: /* MUL2 */ { u16 b = POP2(w); u16 a = POP2(w); PUSH2(w, a * b); } break; case 0x1b: /* DIV */ { u8 b = POP(w); u8 a = POP(w); PUSH(w, a / b); } break; case 0x3b: /* DIV2 */ { u16 b = POP2(w); u16 a = POP2(w); PUSH2(w, a / b); } break; case 0x1c: /* AND */ { u8 b = POP(w); u8 a = POP(w); PUSH(w, a & b); } break; case 0x3c: /* AND2 */ { u16 b = POP2(w); u16 a = POP2(w); PUSH2(w, a & b); } break; case 0x1d: /* ORA */ { u8 b = POP(w); u8 a = POP(w); PUSH(w, a | b); } break; case 0x3d: /* ORA2 */ { u16 b = POP2(w); u16 a = POP2(w); PUSH2(w, a | b); } break; case 0x1e: /* EOR */ { u8 b = POP(w); u8 a = POP(w); PUSH(w, a ^ b); } break; case 0x3e: /* EOR2 */ { u16 b = POP2(w); u16 a = POP2(w); PUSH2(w, a ^ b); } break; case 0x1f: /* SFT */ { u8 shift = POP(w); u8 val = POP(w); u8 shift_left = shift >> 4; u8 shift_right = shift & 0xF; val >>= shift_right; val <<= shift_left; PUSH(w, val); } break; case 0x3f: /* SFT2 */ { u8 shift = POP(w); u16 val = POP2(w); u8 shift_left = shift >> 4; u8 shift_right = shift & 0xF; val >>= shift_right; val <<= shift_left; PUSH2(w, val); } break; case 0x81: /* INCk */ { u8 a = PEEK(w - 1) + 1; PUSH(w, a); } break; case 0xa1: /* INC2k */ { u16 a = PEEK2(w - 2) + 1; PUSH2(w, a); } break; case 0x82: /* POPk */ { return; } break; case 0xa2: /* POP2k */ { return; } break; case 0x83: /* NIPk */ { u8 a = PEEK(w - 1); PUSH(w, a); } break; case 0xa3: /* NIP2k */ { u16 a = PEEK2(w - 2); PUSH2(w, a); } break; case 0x84: /* SWPk */ { u8 b = PEEK(w - 1); u8 a = PEEK(w - 2); PUSH(w, b); PUSH(w, a); } break; case 0xa4: /* SWP2k */ { u16 b = PEEK2(w - 2); u16 a = PEEK2(w - 4); PUSH2(w, b); PUSH2(w, a); } break; case 0x85: /* ROTk */ { u8 c = PEEK(w - 1); u8 b = PEEK(w - 2); u8 a = PEEK(w - 3); PUSH(w, b); PUSH(w, c); PUSH(w, a); } break; case 0xa5: /* ROT2k */ { u16 c = PEEK2(w - 2); u16 b = PEEK2(w - 4); u16 a = PEEK2(w - 6); PUSH2(w, b); PUSH2(w, c); PUSH2(w, a); } break; case 0x86: /* DUPk */ { u8 a = PEEK(w - 1); PUSH(w, a); PUSH(w, a); } break; case 0xa6: /* DUP2k */ { u16 a = PEEK2(w - 2); PUSH2(w, a); PUSH2(w, a); } break; case 0x87: /* OVRk */ { u8 b = PEEK(w - 1); u8 a = PEEK(w - 2); PUSH(w, a); PUSH(w, b); PUSH(w, a); } break; case 0xa7: /* OVR2k */ { u16 b = PEEK2(w - 2); u16 a = PEEK2(w - 4); PUSH2(w, a); PUSH2(w, b); PUSH2(w, a); } break; case 0x88: /* EQUk */ { u8 b = PEEK(w - 1); u8 a = PEEK(w - 2); if (a == b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0xa8: /* EQU2k */ { u16 b = PEEK2(w - 2); u16 a = PEEK2(w - 4); if (a == b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0x89: /* NEQk */ { u8 b = PEEK(w - 1); u8 a = PEEK(w - 2); if (a != b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0xa9: /* NEQ2k */ { u16 b = PEEK2(w - 2); u16 a = PEEK2(w - 4); if (a != b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0x8a: /* GTHk */ { u8 b = PEEK(w - 1); u8 a = PEEK(w - 2); if (a > b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0xaa: /* GTH2k */ { u16 b = PEEK2(w - 2); u16 a = PEEK2(w - 4); if (a > b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0x8b: /* LTHk */ { u8 b = PEEK(w - 1); u8 a = PEEK(w - 2); if (a < b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0xab: /* LTH2k */ { u16 b = PEEK2(w - 2); u16 a = PEEK2(w - 4); if (a < b) { PUSH(w, 1); } else { PUSH(w, 0); } } break; case 0x8c: /* JMPk */ { s8 off = PEEK(w - 1); pc += off; } break; case 0xac: /* JMP2k */ { u16 off = PEEK2(w - 2); pc = uxn_ram + off; } break; case 0x8d: /* JCNk */ { s8 off = PEEK(w - 1); u8 cond = PEEK(w - 2); if (cond) { pc += off; } } break; case 0xad: /* JCN2k */ { u16 off = PEEK2(w - 2); u8 cond = PEEK(w - 2); if (cond) { pc = uxn_ram + off; } } break; case 0x8e: /* JSRk */ { u16 pc_off = pc - uxn_ram; s8 off = PEEK(w - 1); pc += off; PUSH2(r, pc_off); } break; case 0xae: /* JSR2k */ { u16 pc_off = pc - uxn_ram; u16 off = PEEK2(w - 2); pc = uxn_ram + off; PUSH2(r, pc_off); } break; case 0x8f: /* STHk */ { u8 val = PEEK(w - 1); PUSH(r, val); } break; case 0xaf: /* STH2k */ { u16 val = PEEK2(w - 2); PUSH2(r, val); } break; case 0x90: /* LDZk */ { u8 off = PEEK(w - 1); u8 val = PEEK(uxn_ram + off); PUSH(w, val); } break; case 0xb0: /* LDZ2k */ { u8 off = PEEK(w - 1); u16 val = PEEK2(uxn_ram + off); PUSH2(w, val); } break; case 0x91: /* STZk */ { u8 off = PEEK(w - 1); u8 val = PEEK(w - 2); POKE(uxn_ram + off, val); } break; case 0xb1: /* STZ2k */ { u8 off = PEEK(w - 1); u16 val = PEEK2(w - 4); POKE2(uxn_ram + off, val); } break; case 0x92: /* LDRk */ { s8 off = PEEK(w - 1); u8 val = PEEK(pc + off); PUSH(w, val); } break; case 0xb2: /* LDR2k */ { s8 off = PEEK(w - 1); u16 val = PEEK2(pc + off); PUSH2(w, val); } break; case 0x93: /* STRk */ { s8 off = PEEK(w - 1); u8 val = PEEK(w - 2); POKE(pc + off, val); } break; case 0xb3: /* STR2k */ { s8 off = PEEK(w - 1); u16 val = PEEK2(w - 4); POKE2(pc + off, val); } break; case 0x94: /* LDAk */ { u16 off = PEEK2(w - 2); u8 val = PEEK(uxn_ram + off); PUSH(w, val); } break; case 0xb4: /* LDA2k */ { u16 off = PEEK2(w - 2); u16 val = PEEK2(uxn_ram + off); PUSH2(w, val); } break; case 0x95: /* STAk */ { u16 off = PEEK2(w - 2); u8 val = PEEK(w - 2); POKE(uxn_ram + off, val); } break; case 0xb5: /* STA2k */ { u16 off = PEEK2(w - 2); u16 val = PEEK2(w - 4); POKE2(uxn_ram + off, val); } break; case 0x96: /* DEIk */ { u8 dev = PEEK(w - 1); u8 val = DEI(dev); PUSH(w, val); } break; case 0xb6: /* DEI2k */ { u8 dev = PEEK(w - 1); u16 val = DEI(dev); PUSH2(w, val); } break; case 0x97: /* DEOk */ { u8 dev = PEEK(w - 1); u8 val = PEEK(w - 2); POKE(device_data + dev, val); DEO(dev); } break; case 0xb7: /* DEO2k */ { u8 dev = PEEK(w - 1); u16 val = PEEK2(w - 3); POKE2(device_data + dev, val); DEO(dev); } break; case 0x98: /* ADDk */ { u8 b = PEEK(w - 1); u8 a = PEEK(w - 2); PUSH(w, a + b); } break; case 0xb8: /* ADD2k */ { u16 b = PEEK2(w - 2); u16 a = PEEK2(w - 4); PUSH2(w, a + b); } break; case 0x99: /* SUBk */ { u8 b = PEEK(w - 1); u8 a = PEEK(w - 2); PUSH(w, a - b); } break; case 0xb9: /* SUB2k */ { u16 b = PEEK2(w - 2); u16 a = PEEK2(w - 4); PUSH2(w, a - b); } break; case 0x9a: /* MULk */ { u8 b = PEEK(w - 1); u8 a = PEEK(w - 2); PUSH(w, a * b); } break; case 0xba: /* MUL2k */ { u16 b = PEEK2(w - 2); u16 a = PEEK2(w - 4); PUSH2(w, a * b); } break; case 0x9b: /* DIVk */ { u8 b = PEEK(w - 1); u8 a = PEEK(w - 2); PUSH(w, a / b); } break; case 0xbb: /* DIV2k */ { u16 b = PEEK2(w - 2); u16 a = PEEK2(w - 4); PUSH2(w, a / b); } break; case 0x9c: /* ANDk */ { u8 b = PEEK(w - 1); u8 a = PEEK(w - 2); PUSH(w, a & b); } break; case 0xbc: /* AND2k */ { u16 b = PEEK2(w - 2); u16 a = PEEK2(w - 4); PUSH2(w, a & b); } break; case 0x9d: /* ORAk */ { u8 b = PEEK(w - 1); u8 a = PEEK(w - 2); PUSH(w, a | b); } break; case 0xbd: /* ORA2k */ { u16 b = PEEK2(w - 2); u16 a = PEEK2(w - 4); PUSH2(w, a | b); } break; case 0x9e: /* EORk */ { u8 b = PEEK(w - 1); u8 a = PEEK(w - 2); PUSH(w, a ^ b); } break; case 0xbe: /* EOR2k */ { u16 b = PEEK2(w - 2); u16 a = PEEK2(w - 4); PUSH2(w, a ^ b); } break; case 0x9f: /* SFTk */ { u8 shift = PEEK(w - 1); u8 val = PEEK(w - 2); u8 shift_left = shift >> 4; u8 shift_right = shift & 0xF; val >>= shift_right; val <<= shift_left; PUSH(w, val); } break; case 0xbf: /* SFT2k */ { u8 shift = PEEK(w - 1); u16 val = PEEK2(w - 4); u8 shift_left = shift >> 4; u8 shift_right = shift & 0xF; val >>= shift_right; val <<= shift_left; PUSH2(w, val); } break; case 0x41: /* INCr */ { u8 val = PEEK(r - 1) + 1; POKE(r - 1, val); } break; case 0x61: /* INC2r */ { u16 val = PEEK2(r - 2) + 1; POKE2(r - 2, val); } break; case 0x42: /* POPr */ { r--; } break; case 0x62: /* POP2r */ { r -= 2; } break; case 0x43: /* NIPr */ { u8 a = POP(r); r--; PUSH(r, a); } break; case 0x63: /* NIP2r */ { u16 a = POP2(r); r -= 2; PUSH2(r, a); } break; case 0x44: /* SWPr */ { u8 b = POP(r); u8 a = POP(r); PUSH(r, b); PUSH(r, a); } break; case 0x64: /* SWP2r */ { u16 b = POP2(r); u16 a = POP2(r); PUSH2(r, b); PUSH2(r, a); } break; case 0x45: /* ROTr */ { u8 c = POP(r); u8 b = POP(r); u8 a = POP(r); PUSH(r, b); PUSH(r, c); PUSH(r, a); } break; case 0x65: /* ROT2r */ { u16 c = POP2(r); u16 b = POP2(r); u16 a = POP2(r); PUSH2(r, b); PUSH2(r, c); PUSH2(r, a); } break; case 0x46: /* DUPr */ { u8 a = PEEK(r - 1); PUSH(r, a); } break; case 0x66: /* DUP2r */ { u16 a = PEEK2(r - 2); PUSH2(r, a); } break; case 0x47: /* OVRr */ { u8 b = POP(r); u8 a = POP(r); PUSH(r, a); PUSH(r, b); PUSH(r, a); } break; case 0x67: /* OVR2r */ { u16 b = POP2(r); u16 a = POP2(r); PUSH2(r, a); PUSH2(r, b); PUSH2(r, a); } break; case 0x48: /* EQUr */ { u8 b = POP(r); u8 a = POP(r); if (a == b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0x68: /* EQU2r */ { u16 b = POP2(r); u16 a = POP2(r); if (a == b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0x49: /* NEQr */ { u8 b = POP(r); u8 a = POP(r); if (a != b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0x69: /* NEQ2r */ { u16 b = POP2(r); u16 a = POP2(r); if (a != b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0x4a: /* GTHr */ { u8 b = POP(r); u8 a = POP(r); if (a > b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0x6a: /* GTH2r */ { u16 b = POP2(r); u16 a = POP2(r); if (a > b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0x4b: /* LTHr */ { u8 b = POP(r); u8 a = POP(r); if (a < b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0x6b: /* LTH2r */ { u16 b = POP2(r); u16 a = POP2(r); if (a < b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0x4c: /* JMPr */ { s8 off = POP(r); pc += off; } break; case 0x6c: /* JMP2r */ { u16 off = POP2(r); pc = uxn_ram + off; } break; case 0x4d: /* JCNr */ { s8 off = POP(r); u8 cond = POP(r); if (cond) { pc += off; } } break; case 0x6d: /* JCN2r */ { u16 off = POP2(r); u8 cond = POP(r); if (cond) { pc = uxn_ram + off; } } break; case 0x4e: /* JSRr */ { u16 pc_off = pc - uxn_ram; s8 off = POP(r); pc += off; PUSH2(r, pc_off); } break; case 0x6e: /* JSR2r */ { u16 pc_off = pc - uxn_ram; u16 off = POP2(r); pc = uxn_ram + off; PUSH2(r, pc_off); } break; case 0x4f: /* STHr */ { u8 a = POP(r); PUSH(w, a); } break; case 0x6f: /* STH2r */ { u16 a = POP2(r); PUSH2(w, a); } break; case 0x50: /* LDZr */ { u8 off = POP(r); u8 val = PEEK(uxn_ram + off); PUSH(r, val); } break; case 0x70: /* LDZ2r */ { u8 off = POP(r); u16 val = PEEK2(uxn_ram + off); PUSH2(r, val); } break; case 0x51: /* STZr */ { u8 off = POP(r); u8 val = POP(r); POKE(uxn_ram + off, val); } break; case 0x71: /* STZ2r */ { u8 off = POP(r); u16 val = POP2(r); POKE2(uxn_ram + off, val); } break; case 0x52: /* LDRr */ { s8 off = POP(r); u8 val = PEEK(pc + off); PUSH(r, val); } break; case 0x72: /* LDR2r */ { s8 off = POP(r); u16 val = PEEK2(pc + off); PUSH2(r, val); } break; case 0x53: /* STRr */ { s8 off = POP(r); u8 val = POP(r); POKE(pc + off, val); } break; case 0x73: /* STR2r */ { s8 off = POP(r); u16 val = POP2(r); POKE2(pc + off, val); } break; case 0x54: /* LDAr */ { u16 off = POP2(r); u8 val = PEEK(uxn_ram + off); PUSH(r, val); } break; case 0x74: /* LDA2r */ { u16 off = POP2(r); u16 val = PEEK2(uxn_ram + off); PUSH2(r, val); } break; case 0x55: /* STAr */ { u16 off = POP2(r); u8 val = POP(r); POKE(uxn_ram + off, val); } break; case 0x75: /* STA2r */ { u16 off = POP2(r); u16 val = POP2(r); POKE2(uxn_ram + off, val); } break; case 0x56: /* DEIr */ { u8 dev = POP(r); u8 val = DEI(dev); PUSH(r, val); } break; case 0x76: /* DEI2r */ { u8 dev = POP(r); u16 val = DEI(dev); PUSH2(r, val); } break; case 0x57: /* DEOr */ { u8 dev = POP(r); u8 val = POP(r); POKE(device_data + dev, val); DEO(dev); } break; case 0x77: /* DEO2r */ { u8 dev = POP2(r); u16 val = POP2(r); POKE2(device_data + dev, val); DEO(dev); } break; case 0x58: /* ADDr */ { u8 b = POP(r); u8 a = POP(r); PUSH(r, a + b); } break; case 0x78: /* ADD2r */ { u16 b = POP2(r); u16 a = POP2(r); PUSH2(r, a + b); } break; case 0x59: /* SUBr */ { u8 b = POP(r); u8 a = POP(r); PUSH(r, a - b); } break; case 0x79: /* SUB2r */ { u16 b = POP2(r); u16 a = POP2(r); PUSH2(r, a - b); } break; case 0x5a: /* MULr */ { u8 b = POP(r); u8 a = POP(r); PUSH(r, a * b); } break; case 0x7a: /* MUL2r */ { u16 b = POP2(r); u16 a = POP2(r); PUSH2(r, a * b); } break; case 0x5b: /* DIVr */ { u8 b = POP(r); u8 a = POP(r); PUSH(r, a / b); } break; case 0x7b: /* DIV2r */ { u16 b = POP2(r); u16 a = POP2(r); PUSH2(r, a / b); } break; case 0x5c: /* ANDr */ { u8 b = POP(r); u8 a = POP(r); PUSH(r, a & b); } break; case 0x7c: /* AND2r */ { u16 b = POP2(r); u16 a = POP2(r); PUSH2(r, a & b); } break; case 0x5d: /* ORAr */ { u8 b = POP(r); u8 a = POP(r); PUSH(r, a | b); } break; case 0x7d: /* ORA2r */ { u16 b = POP2(r); u16 a = POP2(r); PUSH2(r, a | b); } break; case 0x5e: /* EORr */ { u8 b = POP(r); u8 a = POP(r); PUSH(r, a ^ b); } break; case 0x7e: /* EOR2r */ { u16 b = POP2(r); u16 a = POP2(r); PUSH2(r, a ^ b); } break; case 0x5f: /* SFTr */ { u8 shift = POP(r); u8 val = POP(r); u8 shift_left = shift >> 4; u8 shift_right = shift & 0xF; val >>= shift_right; val <<= shift_left; PUSH(r, val); } break; case 0x7f: /* SFT2r */ { u8 shift = POP(r); u16 val = POP2(r); u8 shift_left = shift >> 4; u8 shift_right = shift & 0xF; val >>= shift_right; val <<= shift_left; PUSH2(r, val); } break; case 0xc1: /* INCkr */ { u8 a = PEEK(r - 1) + 1; PUSH(r, a); } break; case 0xe1: /* INC2kr */ { u16 a = PEEK2(r - 2) + 1; PUSH2(r, a); } break; case 0xc2: /* POPkr */ { return; } break; case 0xe2: /* POP2kr */ { return; } break; case 0xc3: /* NIPkr */ { u8 a = PEEK(r - 1); PUSH(r, a); } break; case 0xe3: /* NIP2kr */ { u16 a = PEEK2(r - 2); PUSH2(r, a); } break; case 0xc4: /* SWPkr */ { u8 b = PEEK(r - 1); u8 a = PEEK(r - 2); PUSH(r, b); PUSH(r, a); } break; case 0xe4: /* SWP2kr */ { u16 b = PEEK2(r - 2); u16 a = PEEK2(r - 4); PUSH2(r, b); PUSH2(r, a); } break; case 0xc5: /* ROTkr */ { u8 c = PEEK(r - 1); u8 b = PEEK(r - 2); u8 a = PEEK(r - 3); PUSH(r, b); PUSH(r, c); PUSH(r, a); } break; case 0xe5: /* ROT2kr */ { u16 c = PEEK2(r - 2); u16 b = PEEK2(r - 4); u16 a = PEEK2(r - 6); PUSH2(r, b); PUSH2(r, c); PUSH2(r, a); } break; case 0xc6: /* DUPkr */ { u8 a = PEEK(r - 1); PUSH(r, a); PUSH(r, a); } break; case 0xe6: /* DUP2kr */ { u16 a = PEEK2(r - 2); PUSH2(r, a); PUSH2(r, a); } break; case 0xc7: /* OVRkr */ { u8 b = PEEK(r - 1); u8 a = PEEK(r - 2); PUSH(r, a); PUSH(r, b); PUSH(r, a); } break; case 0xe7: /* OVR2kr */ { u16 b = PEEK2(r - 2); u16 a = PEEK2(r - 4); PUSH2(r, a); PUSH2(r, b); PUSH2(r, a); } break; case 0xc8: /* EQUkr */ { u8 b = PEEK(r - 1); u8 a = PEEK(r - 2); if (a == b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0xe8: /* EQU2kr */ { u16 b = PEEK2(r - 2); u16 a = PEEK2(r - 4); if (a == b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0xc9: /* NEQkr */ { u8 b = PEEK(r - 1); u8 a = PEEK(r - 2); if (a != b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0xe9: /* NEQ2kr */ { u16 b = PEEK2(r - 2); u16 a = PEEK2(r - 4); if (a != b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0xca: /* GTHkr */ { u8 b = PEEK(r - 1); u8 a = PEEK(r - 2); if (a > b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0xea: /* GTH2kr */ { u16 b = PEEK2(r - 2); u16 a = PEEK2(r - 4); if (a > b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0xcb: /* LTHkr */ { u8 b = PEEK(r - 1); u8 a = PEEK(r - 2); if (a < b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0xeb: /* LTH2kr */ { u16 b = PEEK2(r - 2); u16 a = PEEK2(r - 4); if (a < b) { PUSH(r, 1); } else { PUSH(r, 0); } } break; case 0xcc: /* JMPkr */ { s8 off = PEEK(r - 1); pc += off; } break; case 0xec: /* JMP2kr */ { u16 off = PEEK2(r - 2); pc = uxn_ram + off; } break; case 0xcd: /* JCNkr */ { s8 off = PEEK(r - 1); u8 cond = PEEK(r - 2); if (cond) { pc += off; } } break; case 0xed: /* JCN2kr */ { u16 off = PEEK2(r - 2); u8 cond = PEEK(r - 2); if (cond) { pc = uxn_ram + off; } } break; case 0xce: /* JSRkr */ { u16 pc_off = pc - uxn_ram; s8 off = PEEK(r - 1); pc += off; PUSH2(r, pc_off); } break; case 0xee: /* JSR2kr */ { u16 pc_off = pc - uxn_ram; u16 off = PEEK2(r - 2); pc = uxn_ram + off; PUSH2(r, pc_off); } break; case 0xcf: /* STHkr */ { u8 val = PEEK(r - 1); PUSH(w, val); } break; case 0xef: /* STH2kr */ { u16 val = PEEK2(r - 2); PUSH2(w, val); } break; case 0xd0: /* LDZkr */ { u8 off = PEEK(r - 1); u8 val = PEEK(uxn_ram + off); PUSH(r, val); } break; case 0xf0: /* LDZ2kr */ { u8 off = PEEK(r - 1); u16 val = PEEK2(uxn_ram + off); PUSH2(r, val); } break; case 0xd1: /* STZkr */ { u8 off = PEEK(r - 1); u8 val = PEEK(r - 2); POKE(uxn_ram + off, val); } break; case 0xf1: /* STZ2kr */ { u8 off = PEEK(r - 1); u16 val = PEEK2(r - 4); POKE2(uxn_ram + off, val); } break; case 0xd2: /* LDRkr */ { s8 off = PEEK(r - 1); u8 val = PEEK(pc + off); PUSH(r, val); } break; case 0xf2: /* LDR2kr */ { s8 off = PEEK(r - 1); u16 val = PEEK2(pc + off); PUSH2(r, val); } break; case 0xd3: /* STRkr */ { s8 off = PEEK(r - 1); u8 val = PEEK(r - 2); POKE(pc + off, val); } break; case 0xf3: /* STR2kr */ { s8 off = PEEK(r - 1); u16 val = PEEK2(r - 4); POKE2(pc + off, val); } break; case 0xd4: /* LDAkr */ { u16 off = PEEK2(r - 2); u8 val = PEEK(uxn_ram + off); PUSH(r, val); } break; case 0xf4: /* LDA2kr */ { u16 off = PEEK2(r - 2); u16 val = PEEK2(uxn_ram + off); PUSH2(r, val); } break; case 0xd5: /* STAkr */ { u16 off = PEEK2(r - 2); u8 val = PEEK(r - 2); POKE(uxn_ram + off, val); } break; case 0xf5: /* STA2kr */ { u16 off = PEEK2(r - 2); u16 val = PEEK2(r - 4); POKE2(uxn_ram + off, val); } break; case 0xd6: /* DEIkr */ { u8 dev = PEEK(r - 1); u8 val = DEI(dev); PUSH(r, val); } break; case 0xf6: /* DEI2kr */ { u8 dev = PEEK(r - 1); u16 val = DEI(dev); PUSH2(r, val); } break; case 0xd7: /* DEOkr */ { u8 dev = PEEK(r - 1); u8 val = PEEK(r - 2); POKE(device_data + dev, val); DEO(dev); } break; case 0xf7: /* DEO2kr */ { u8 dev = PEEK(r - 1); u16 val = PEEK2(r - 3); POKE2(device_data + dev, val); DEO(dev); } break; case 0xd8: /* ADDkr */ { u8 b = PEEK(r - 1); u8 a = PEEK(r - 2); PUSH(r, a + b); } break; case 0xf8: /* ADD2kr */ { u16 b = PEEK2(r - 2); u16 a = PEEK2(r - 4); PUSH2(r, a + b); } break; case 0xd9: /* SUBkr */ { u8 b = PEEK(r - 1); u8 a = PEEK(r - 2); PUSH(r, a - b); } break; case 0xf9: /* SUB2kr */ { u16 b = PEEK2(r - 2); u16 a = PEEK2(r - 4); PUSH2(r, a - b); } break; case 0xda: /* MULkr */ { u8 b = PEEK(r - 1); u8 a = PEEK(r - 2); PUSH(r, a * b); } break; case 0xfa: /* MUL2kr */ { u16 b = PEEK2(r - 2); u16 a = PEEK2(r - 4); PUSH2(r, a * b); } break; case 0xdb: /* DIVkr */ { u8 b = PEEK(r - 1); u8 a = PEEK(r - 2); PUSH(r, a / b); } break; case 0xfb: /* DIV2kr */ { u16 b = PEEK2(r - 2); u16 a = PEEK2(r - 4); PUSH2(r, a / b); } break; case 0xdc: /* ANDkr */ { u8 b = PEEK(r - 1); u8 a = PEEK(r - 2); PUSH(r, a & b); } break; case 0xfc: /* AND2kr */ { u16 b = PEEK2(r - 2); u16 a = PEEK2(r - 4); PUSH2(r, a & b); } break; case 0xdd: /* ORAkr */ { u8 b = PEEK(r - 1); u8 a = PEEK(r - 2); PUSH(r, a | b); } break; case 0xfd: /* ORA2kr */ { u16 b = PEEK2(r - 2); u16 a = PEEK2(r - 4); PUSH2(r, a | b); } break; case 0xde: /* EORkr */ { u8 b = PEEK(r - 1); u8 a = PEEK(r - 2); PUSH(r, a ^ b); } break; case 0xfe: /* EOR2kr */ { u16 b = PEEK2(r - 2); u16 a = PEEK2(r - 4); PUSH2(r, a ^ b); } break; case 0xdf: /* SFTkr */ { u8 shift = PEEK(r - 1); u8 val = PEEK(r - 2); u8 shift_left = shift >> 4; u8 shift_right = shift & 0xF; val >>= shift_right; val <<= shift_left; PUSH(r, val); } break; case 0xff: /* SFT2kr */ { u8 shift = PEEK(r - 1); u16 val = PEEK2(r - 4); u8 shift_left = shift >> 4; u8 shift_right = shift & 0xF; val >>= shift_right; val <<= shift_left; PUSH2(r, val); } break; } } }
Become a Patron
Sponsor on GitHub
Donate via PayPal
Source on GitHub
Mailing list
Installed libraries
Wiki
Report an issue
How it works
Contact the author
CE on Mastodon
CE on Bluesky
About the author
Statistics
Changelog
Version tree