{ "scope": "source.curlywasm", "completions": [ // Keywords { "trigger": "if", "contents": "if ${1:condition} {\n\t${2:// Your start code here}\n}", "details": "if (condition) { block }", "kind": "keyword" }, { "trigger": "else", "contents": "else {\n\t${1:// Your start code here}\n}", "details": "else { block }", "kind": "keyword" }, { "trigger": "loop", "contents": "loop ${1:label} {\n\t${2:// Your start code here}\n}", "details": "loop label { block }", "kind": "keyword" }, { "trigger": "fn", "contents": "fn ${1:name}(${2:params}) {\n\t${3:// Your start code here}\n}", "details": "fn name(params) [-> return_type] { block }", "kind": "keyword" }, { "trigger": "let", "contents": "let ${1:variable} = ${2:value};", "details": "let variable[: type] = value;", "kind": "keyword" }, { "trigger": "const", "contents": "const ${1:name} = ${2:value};", "details": "const name[: type] = value;", "kind": "keyword" }, { "trigger": "branch_if", "contents": "branch_if ${1:condition}: ${2:label};", "details": "branch_if (condition): label;", "kind": "keyword" }, { "trigger": "global", "contents": "global mut ${1:name} = ${2:value};", "details": "global mut name[: type] = value;", "kind": "keyword" }, { "trigger": "import", "contents": "import \"${1:module.name}\" ${2:|memory(min_pages)|global var_name: type|fn fun_name(param_types) [-> return_type]};", "details": "import \"module.name\" memory(min_pages); import \"module.name\" global var_name: type; import \"module.name\" fn fun_name(param_types) [-> return_type];", "kind": "keyword" }, { "trigger": "include", "contents": "include \"${1:path}\"", "details": "include \"path\"", "kind": "keyword" }, { "trigger": "api", "contents": "include \"../include/microw8-api.cwa\"", "details": "include \"path\"", "kind": "keyword" }, { "trigger": "common", "contents": "include \"../include/common.cwa\"", "details": "include \"path\"", "kind": "keyword" }, { "trigger": "export", "contents": "export fn ${1:name}(${2:params}) ${3:-> ${4:return_type}} { ${5:block} }", "details": "export fn name(params) [-> return_type] { block }", "kind": "keyword" }, { "trigger": "block", "contents": "block ${1:label} {\n\t${2://content}\n}", "details": "block label { block }", "kind": "keyword" }, { "trigger": "branch", "contents": "branch ${1:label};", "details": "branch label;", "kind": "keyword" }, { "trigger": "data", "contents": "data ${1:address} {\n\t${2:type}(\n\t\t${3:values}\n\t)\n}", "details": "data address { content }", "kind": "keyword" }, { "trigger": "mut", "contents": "mut", "details": "Mutable variable modifier", "kind": "storage.modifier" }, { "trigger": "lazy", "contents": "lazy", "details": "Lazy variable modifier", "kind": "storage.modifier" }, { "trigger": "inline", "contents": "inline", "details": "Inline variable modifier", "kind": "storage.modifier" }, // Operators { "trigger": "as", "contents": "as", "details": "Type cast", "kind": "keyword.operator.type" }, { "trigger": "?", "contents": "?", "details": "Load byte", "kind": "keyword.operator.memory" }, { "trigger": "!", "contents": "!", "details": "Load word", "kind": "keyword.operator.memory" }, { "trigger": "$", "contents": "$", "details": "Load float", "kind": "keyword.operator.memory" }, { "trigger": "<|", "contents": "<|", "details": "Take first (sequencing operator)", "kind": "keyword.operator.misc" }, // Memory access intrinsic functions (i32 and f32 only) { "trigger": "i32.load", "contents": "i32.load(${1:base}, ${2:offset}${3:, ${4:align}})", "details": "i32.load(base: i32, offset: i32 = 0, align: i32 = 2) -> i32: Load 32-bit word", "kind": "support.function" }, { "trigger": "i32.load8_u", "contents": "i32.load8_u(${1:base}, ${2:offset}${3:, ${4:align}})", "details": "i32.load8_u(base: i32, offset: i32 = 0, align: i32 = 0) -> i32: Load 8-bit unsigned", "kind": "support.function" }, { "trigger": "i32.load8_s", "contents": "i32.load8_s(${1:base}, ${2:offset}${3:, ${4:align}})", "details": "i32.load8_s(base: i32, offset: i32 = 0, align: i32 = 0) -> i32: Load 8-bit signed", "kind": "support.function" }, { "trigger": "i32.load16_u", "contents": "i32.load16_u(${1:base}, ${2:offset}${3:, ${4:align}})", "details": "i32.load16_u(base: i32, offset: i32 = 0, align: i32 = 1) -> i32: Load 16-bit unsigned", "kind": "support.function" }, { "trigger": "i32.load16_s", "contents": "i32.load16_s(${1:base}, ${2:offset}${3:, ${4:align}})", "details": "i32.load16_s(base: i32, offset: i32 = 0, align: i32 = 1) -> i32: Load 16-bit signed", "kind": "support.function" }, { "trigger": "i32.store", "contents": "i32.store(${1:value}, ${2:base}, ${3:offset}${4:, ${5:align}});", "details": "i32.store(value: i32, base: i32, offset: i32 = 0, align: i32 = 2): Store 32-bit word", "kind": "support.function" }, { "trigger": "i32.store8", "contents": "i32.store8(${1:value}, ${2:base}, ${3:offset}${4:, ${5:align}});", "details": "i32.store8(value: i32, base: i32, offset: i32 = 0, align: i32 = 0): Store 8-bit", "kind": "support.function" }, { "trigger": "i32.store16", "contents": "i32.store16(${1:value}, ${2:base}, ${3:offset}${4:, ${5:align}});", "details": "i32.store16(value: i32, base: i32, offset: i32 = 0, align: i32 = 1): Store 16-bit", "kind": "support.function" }, { "trigger": "f32.load", "contents": "f32.load(${1:base}, ${2:offset}${3:, ${4:align}})", "details": "f32.load(base: i32, offset: i32 = 0, align: i32 = 2) -> f32: Load 32-bit float", "kind": "support.function" }, { "trigger": "f32.store", "contents": "f32.store(${1:value}, ${2:base}, ${3:offset}${4:, ${5:align}});", "details": "f32.store(value: f32, base: i32, offset: i32 = 0, align: i32 = 2): Store 32-bit float", "kind": "support.function" }, // API functions { "trigger": "sin", "contents": "sin(${1:x})", "details": "sin(x: f32) -> f32: Returns the sine of x (radians)", "kind": "support.function" }, { "trigger": "cos", "contents": "cos(${1:x})", "details": "cos(x: f32) -> f32: Returns the cosine of x (radians)", "kind": "support.function" }, { "trigger": "tan", "contents": "tan(${1:x})", "details": "tan(x: f32) -> f32: Returns the tangent of x (radians)", "kind": "support.function" }, { "trigger": "asin", "contents": "asin(${1:x})", "details": "asin(x: f32) -> f32: Returns the arcsine of x (radians)", "kind": "support.function" }, { "trigger": "acos", "contents": "acos(${1:x})", "details": "acos(x: f32) -> f32: Returns the arccosine of x (radians)", "kind": "support.function" }, { "trigger": "atan", "contents": "atan(${1:x})", "details": "atan(x: f32) -> f32: Returns the arctangent of x (radians)", "kind": "support.function" }, { "trigger": "atan2", "contents": "atan2(${1:y}, ${2:x})", "details": "atan2(y: f32, x: f32) -> f32: Returns the angle in radians of the point (x, y)", "kind": "support.function" }, { "trigger": "pow", "contents": "pow(${1:x}, ${2:y})", "details": "pow(x: f32, y: f32) -> f32: Returns x raised to the power of y", "kind": "support.function" }, { "trigger": "log", "contents": "log(${1:x})", "details": "log(x: f32) -> f32: Returns the natural logarithm of x", "kind": "support.function" }, { "trigger": "fmod", "contents": "fmod(${1:x}, ${2:y})", "details": "fmod(x: f32, y: f32) -> f32: Returns the remainder of x/y", "kind": "support.function" }, { "trigger": "random", "contents": "random()", "details": "random() -> i32: Returns a random 32-bit integer", "kind": "support.function" }, { "trigger": "randomf", "contents": "randomf()", "details": "randomf() -> f32: Returns a random float [0, 1)", "kind": "support.function" }, { "trigger": "randomSeed", "contents": "randomSeed(${1:seed});", "details": "randomSeed(seed: i32): Seeds the random number generator", "kind": "support.function" }, { "trigger": "cls", "contents": "cls(${1:color});", "details": "cls(color: i32): Clears the screen with the given color, resets cursor to 0,0, disables graphics mode", "kind": "support.function" }, { "trigger": "setPixel", "contents": "setPixel(${1:x}, ${2:y}, ${3:color});", "details": "setPixel(x: i32, y: i32, color: i32): Sets the pixel at (x, y) to color", "kind": "support.function" }, { "trigger": "getPixel", "contents": "getPixel(${1:x}, ${2:y})", "details": "getPixel(x: i32, y: i32) -> i32: Gets the color of the pixel at (x, y) (returns 0 if out of bounds)", "kind": "support.function" }, { "trigger": "hline", "contents": "hline(${1:left}, ${2:right}, ${3:y}, ${4:color});", "details": "hline(left: i32, right: i32, y: i32, color: i32): Fills the horizontal line [left, right), y", "kind": "support.function" }, { "trigger": "rectangle", "contents": "rectangle(${1:x}, ${2:y}, ${3:width}, ${4:height}, ${5:color});", "details": "rectangle(x: f32, y: f32, w: f32, h: f32, color: i32): Fills the rectangle x,y - x+w,y+h", "kind": "support.function" }, { "trigger": "circle", "contents": "circle(${1:cx}, ${2:cy}, ${3:radius}, ${4:color});", "details": "circle(cx: f32, cy: f32, radius: f32, color: i32): Fills the circle at cx, cy with radius", "kind": "support.function" }, { "trigger": "line", "contents": "line(${1:x1}, ${2:y1}, ${3:x2}, ${4:y2}, ${5:color});", "details": "line(x1: f32, y1: f32, x2: f32, y2: f32, color: i32): Draws a line from x1,y1 to x2,y2", "kind": "support.function" }, { "trigger": "time", "contents": "time()", "details": "time() -> f32: Returns the current time in seconds", "kind": "support.function" }, { "trigger": "isButtonPressed", "contents": "isButtonPressed(${1:button})", "details": "isButtonPressed(button: i32) -> bool: Checks if a button is pressed this frame (returns i32)", "kind": "support.function" }, { "trigger": "isButtonTriggered", "contents": "isButtonTriggered(${1:button})", "details": "isButtonTriggered(button: i32) -> bool: Checks if a button is newly pressed this frame (returns i32)", "kind": "support.function" }, { "trigger": "printChar", "contents": "printChar(${1:char});", "details": "printChar(char: i32): Prints the character in the lower 8 bits", "kind": "support.function" }, { "trigger": "printString", "contents": "printString(${1:ptr});", "details": "printString(ptr: i32): Prints the zero-terminated string at memory address ptr", "kind": "support.function" }, { "trigger": "printInt", "contents": "printInt(${1:value});", "details": "printInt(value: i32): Prints an integer as a signed decimal number", "kind": "support.function" }, { "trigger": "setTextColor", "contents": "setTextColor(${1:color});", "details": "setTextColor(color: i32): Sets the text color", "kind": "support.function" }, { "trigger": "setBackgroundColor", "contents": "setBackgroundColor(${1:color});", "details": "setBackgroundColor(color: i32): Sets the background color", "kind": "support.function" }, { "trigger": "setCursorPosition", "contents": "setCursorPosition(${1:x}, ${2:y});", "details": "setCursorPosition(x: i32, y: i32): Sets the cursor position (character or pixel coords depending on mode)", "kind": "support.function" }, { "trigger": "rectangleOutline", "contents": "rectangleOutline(${1:x}, ${2:y}, ${3:width}, ${4:height}, ${5:color});", "details": "rectangleOutline(x: f32, y: f32, w: f32, h: f32, color: i32): Draws a rectangle outline", "kind": "support.function" }, { "trigger": "circleOutline", "contents": "circleOutline(${1:cx}, ${2:cy}, ${3:radius}, ${4:color});", "details": "circleOutline(cx: f32, cy: f32, radius: f32, color: i32): Draws a circle outline", "kind": "support.function" }, { "trigger": "exp", "contents": "exp(${1:x})", "details": "exp(x: f32) -> f32: Returns e raised to the power of x", "kind": "support.function" }, { "trigger": "playNote", "contents": "playNote(${1:channel}, ${2:note}${3:, ${4:duration}${5:, ${6:volume}}});", "details": "playNote(channel: i32, note: i32): Triggers a note on the given channel (note 0 stops, 128-255 triggers attack+release)", "kind": "support.function" }, { "trigger": "sndGes", "contents": "sndGes(${1:sampleIndex})", "details": "sndGes(sampleIndex: i32) -> f32: Sound generator function (uses 32 bytes at 0x50 by default)", "kind": "support.function" }, { "trigger": "blitSprite", "contents": "blitSprite(${1:spriteData}, ${2:size}, ${3:x}, ${4:y}, ${5:control});", "details": "blitSprite(spriteData: i32, size: i32, x: i32, y: i32, control: i32): Copies sprite data to screen", "kind": "support.function" }, { "trigger": "grabSprite", "contents": "grabSprite(${1:spriteData}, ${2:size}, ${3:x}, ${4:y}, ${5:control});", "details": "grabSprite(spriteData: i32, size: i32, x: i32, y: i32, control: i32): Copies screen data to sprite", "kind": "support.function" }, // Built-in functions (or commonly used intrinsics) { "trigger": "start", "contents": "export fn start() {\n\t${1:// Your start code here}\n}", "details": "export fn start(): Called once after module is loaded", "kind": "support.function" }, { "trigger": "upd", "contents": "export fn upd() {\n\t${1:// Your update code here}\n}", "details": "export fn upd(): Called once per frame", "kind": "support.function" }, { "trigger": "memory.fill", "contents": "memory.fill(${1:dest}, ${2:value}, ${3:size});", "details": "memory.fill(dest: i32, value: i32, size: i32): Fills a memory area", "kind": "support.function" }, { "trigger": "memory.copy", "contents": "memory.copy(${1:dest}, ${2:src}, ${3:size});", "details": "memory.copy(dest: i32, src: i32, size: i32): Copies a memory block", "kind": "support.function" }, { "trigger": "sqrt", "contents": "sqrt(${1:x})", "details": "sqrt(x: f32) -> f32: Returns the square root of x", "kind": "support.function" }, { "trigger": "min", "contents": "min(${1:x}, ${2:y})", "details": "min(x: f32, y: f32) -> f32: Returns the minimum of x and y", "kind": "support.function" }, { "trigger": "max", "contents": "max(${1:x}, ${2:y})", "details": "max(x: f32, y: f32) -> f32: Returns the maximum of x and y", "kind": "support.function" }, { "trigger": "ceil", "contents": "ceil(${1:x})", "details": "ceil(x: f32) -> f32: Returns the smallest integer >= x", "kind": "support.function" }, { "trigger": "floor", "contents": "floor(${1:x})", "details": "floor(x: f32) -> f32: Returns the largest integer <= x", "kind": "support.function" }, { "trigger": "trunc", "contents": "trunc(${1:x})", "details": "trunc(x: f32) -> f32: Returns the nearest integer to x toward zero", "kind": "support.function" }, { "trigger": "nearest", "contents": "nearest(${1:x})", "details": "nearest(x: f32) -> f32: Returns the nearest integer to x (round to nearest, ties to even)", "kind": "support.function" }, { "trigger": "abs", "contents": "abs(${1:x})", "details": "abs(x: f32) -> f32: Returns the absolute value of x", "kind": "support.function" }, { "trigger": "copysign", "contents": "copysign(${1:x}, ${2:y})", "details": "copysign(x: f32, y: f32) -> f32: Returns x with the sign of y", "kind": "support.function" }, { "trigger": "select", "contents": "select(${1:a}, ${2:b}, ${3:c})", "details": "select(a: f32, b: f32, c: f32) -> f32: Selects b if a is non-zero, otherwise selects c (equivalent to a != 0 ? b : c)", "kind": "support.function" }, { "trigger": "i32.clz", "contents": "i32.clz(${1:value})", "details": "i32.clz(value: i32) -> i32: Count Leading Zeros", "kind": "support.function" }, { "trigger": "i32.ctz", "contents": "i32.ctz(${1:value})", "details": "i32.ctz(value: i32) -> i32: Count Trailing Zeros", "kind": "support.function" }, { "trigger": "i32.popcnt", "contents": "i32.popcnt(${1:value})", "details": "i32.popcnt(value: i32) -> i32: Population Count (number of set bits)", "kind": "support.function" }, { "trigger": "i32.bswap", "contents": "i32.bswap(${1:value})", "details": "i32.bswap(value: i32) -> i32: Byte Swap", "kind": "support.function" }, { "trigger": "i32.trunc_sat_f32_u", "contents": "i32.trunc_sat_f32_u(${1:value})", "details": "i32.trunc_sat_f32_u(value: f32) -> i32: Truncate f32 to i32 unsigned, saturating", "kind": "support.function" }, { "trigger": "i32.trunc_sat_f32_s", "contents": "i32.trunc_sat_f32_s(${1:value})", "details": "i32.trunc_sat_f32_s(value: f32) -> i32: Truncate f32 to i32 signed, saturating", "kind": "support.function" }, // Added Constants { "trigger": "TIME_MS", "contents": "TIME_MS", "details": "0x40 Time since module start in ms", "kind": "constant" }, { "trigger": "GAMEPAD", "contents": "GAMEPAD", "details": "0x44 Gamepad state", "kind": "constant" }, { "trigger": "FRAMEBUFFER", "contents": "FRAMEBUFFER", "details": "0x78 Frame buffer address", "kind": "constant" }, { "trigger": "PALETTE", "contents": "PALETTE", "details": "0x13000 Palette address", "kind": "constant" }, { "trigger": "FONT", "contents": "FONT", "details": "0x13400 Font address", "kind": "constant" }, { "trigger": "USER_MEM", "contents": "USER_MEM", "details": "0x14000 Start of general user memory", "kind": "constant" }, { "trigger": "BUTTON_UP", "contents": "BUTTON_UP", "details": "0x00 Gamepad button Up", "kind": "constant" }, { "trigger": "BUTTON_DOWN", "contents": "BUTTON_DOWN", "details": "0x01 Gamepad button Down", "kind": "constant" }, { "trigger": "BUTTON_LEFT", "contents": "BUTTON_LEFT", "details": "0x02 Gamepad button Left", "kind": "constant" }, { "trigger": "BUTTON_RIGHT", "contents": "BUTTON_RIGHT", "details": "0x03 Gamepad button Right", "kind": "constant" }, { "trigger": "BUTTON_A", "contents": "BUTTON_A", "details": "0x04 Gamepad button A (Z on keyboard)", "kind": "constant" }, { "trigger": "BUTTON_B", "contents": "BUTTON_B", "details": "0x05 Gamepad button B (X on keyboard)", "kind": "constant" }, { "trigger": "BUTTON_X", "contents": "BUTTON_X", "details": "0x06 Gamepad button X (A on keyboard)", "kind": "constant" }, { "trigger": "BUTTON_Y", "contents": "BUTTON_Y", "details": "0x07 Gamepad button Y (S on keyboard)", "kind": "constant" }, { "trigger": "PI", "contents": "PI", "details": "Mathematical constant π", "kind": "constant" }, { "trigger": "RAD", "contents": "RAD", "details": "One radian value", "kind": "constant" }, { "trigger": "SCR_X", "contents": "SCR_X", "details": "Screen width in pixels", "kind": "constant" }, { "trigger": "SCR_Y", "contents": "SCR_Y", "details": "Screen height in pixels", "kind": "constant" }, { "trigger": "SCR_W", "contents": "SCR_W", "details": "Screen width in chars (40)", "kind": "constant" }, { "trigger": "SCR_H", "contents": "SCR_H", "details": "Screen height in chars (30)", "kind": "constant" }, { "trigger": "CENTER_X", "contents": "CENTER_X", "details": "X-coordinate of the screen center (160)", "kind": "constant" }, { "trigger": "CENTER_Y", "contents": "CENTER_Y", "details": "Y-coordinate of the screen center (120)", "kind": "constant" }, { "trigger": "SCR_SIZE", "contents": "SCR_SIZE", "details": "Total screen size in pixels (76800)", "kind": "constant" }, { "trigger": "MEM_END", "contents": "MEM_END", "details": "End of available memory", "kind": "constant" }, { "trigger": "CUSTOM_FONT", "contents": "CUSTOM_FONT", "details": "Address for a custom font", "kind": "constant" }, { "trigger": "COLOR_BLACK", "contents": "COLOR_BLACK", "details": "0x00 Black", "kind": "constant" }, { "trigger": "COLOR_DARK_BLUE", "contents": "COLOR_DARK_BLUE", "details": "0x17 Dark Blue", "kind": "constant" }, { "trigger": "COLOR_DARK_PURPLE", "contents": "COLOR_DARK_PURPLE", "details": "0x27 Dark Purple", "kind": "constant" }, { "trigger": "COLOR_CYAN", "contents": "COLOR_CYAN", "details": "0x37 Cyan", "kind": "constant" }, { "trigger": "COLOR_BRIGHT_RED", "contents": "COLOR_BRIGHT_RED", "details": "0x47 Bright Red", "kind": "constant" }, { "trigger": "COLOR_MAGENTA", "contents": "COLOR_MAGENTA", "details": "0x57 Magenta", "kind": "constant" }, { "trigger": "COLOR_ORANGE", "contents": "COLOR_ORANGE", "details": "0x58 Orange", "kind": "constant" }, { "trigger": "COLOR_BRIGHT_YELLOW", "contents": "COLOR_BRIGHT_YELLOW", "details": "0x67 Bright Yellow", "kind": "constant" }, { "trigger": "COLOR_MEDIUM_GREY", "contents": "COLOR_MEDIUM_GREY", "details": "0x78 Medium Grey", "kind": "constant" }, { "trigger": "COLOR_LIGHT_GREY", "contents": "COLOR_LIGHT_GREY", "details": "0x7C Light Grey", "kind": "constant" }, { "trigger": "COLOR_WHITE", "contents": "COLOR_WHITE", "details": "0xF8 White", "kind": "constant" }, { "trigger": "COLOR_BRIGHT_GREEN", "contents": "COLOR_BRIGHT_GREEN", "details": "0x87 Bright Green", "kind": "constant" }, { "trigger": "COLOR_BROWN", "contents": "COLOR_BROWN", "details": "0xD4 Brown", "kind": "constant" }, { "trigger": "COLOR_DARK_GREY", "contents": "COLOR_DARK_GREY", "details": "0xE1 Dark Grey", "kind": "constant" } ] }