Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /******************************************************************************/
- /******************************************************************************/
- //"sokoban_and_kit32_2025-01-31\kit32\snake\kit-32.asm":
- #once
- ;IMPORTANT:
- ;* is how you start a long comment! *;
- ;flg = 0bN--Z--EL
- ;note: use le() instead where possible
- #fn lend16(imm) => imm[7:0] @ imm[15:8]
- #fn lend32(imm) => imm[7:0] @ imm[15:8] @ imm[23:16] @ imm[31:24]
- ;get relative address from an absolute one
- ;(relative to the next byte after the branch)
- ;(also, to_relative() is used by default by
- ;the branch operations, so to_absolute() is what you want
- ;if you actually want to use relative addressing on a branch)
- #fn to_relative(absolute_address) => ((absolute_address)-$-4)
- ;get absolute address from a relative one
- ;(relative to the next byte after the branch)
- #fn to_absolute(relative_address) => ($+4+(relative_address))
- #fn bitmask(length) => ((1<<(length))-1)
- SYSCALL_TAN = 0 ;r0.f32 = tanf(r0.f32)
- SYSCALL_COSSIN = 1 ;r0.f32 = cosf(r0.f32), r1.f32 = sinf(r1.f32)
- SYSCALL_COS = 2 ;r0.f32 = cosf(r0.f32)
- SYSCALL_SIN = 3 ;r1.f32 = sinf(r1.f32)
- SYSCALL_MEMSET = 4 ;memory::set ((void*)r0.u32, r1.u8 , r2.u32)
- SYSCALL_MEMCPY = 5 ;memory::copy((void*)r0.u32, (void*)r1.u32, r2.u32)
- SYSCALL_SETDRAWCOLOR = 6 ;rndr->setDrawColor(r0.u32)
- SYSCALL_DRAWPOINT_S32 = 7 ;rndr->drawPoint(r0.s32, r1.s32)
- SYSCALL_DRAWPOINT_F32 = 8 ;rndr->drawPoint(r0.f32, r1.f32)
- SYSCALL_DRAWLINE_S32 = 9 ;rndr->drawLine(r0.s32, r1.s32, r2.s32, r3.s32)
- SYSCALL_DRAWLINE_F32 = 10 ;rndr->drawLine(r0.f32, r1.f32, r2.f32, r3.f32)
- SYSCALL_DRAWRECT_S32 = 11 ;rndr->drawRects(&{r0.s32, r1.s32, r2.s32, r3.s32}, 1)
- SYSCALL_DRAWRECT_F32 = 12 ;rndr->drawRects(&{r0.f32, r1.f32, r2.f32, r3.f32}, 1)
- SYSCALL_FILLRECT_S32 = 13 ;rndr->fillRects(&{r0.s32, r1.s32, r2.s32, r3.s32}, 1)
- SYSCALL_FILLRECT_F32 = 14 ;rndr->fillRects(&{r0.f32, r1.f32, r2.f32, r3.f32}, 1)
- SYSCALL_DRAWPOINTS_S32 = 15 ;rndr->drawPoints((shape::point *)r0.u32, r1.u32)
- SYSCALL_DRAWPOINTS_F32 = 16 ;rndr->drawPoints((shape::fpoint*)r0.u32, r1.u32)
- SYSCALL_DRAWLINES_S32 = 17 ;rndr->drawLines((shape::point *)r0.u32, r1.u32)
- SYSCALL_DRAWLINES_F32 = 18 ;rndr->drawLines((shape::fpoint*)r0.u32, r1.u32)
- SYSCALL_DRAWRECTS_S32 = 19 ;rndr->drawRects((shape::rect *)r0.u32, r1.u32)
- SYSCALL_DRAWRECTS_F32 = 20 ;rndr->drawRects((shape::frect*)r0.u32, r1.u32)
- SYSCALL_FILLRECTS_S32 = 21 ;rndr->fillRects((shape::rect *)r0.u32, r1.u32)
- SYSCALL_FILLRECTS_F32 = 22 ;rndr->fillRects((shape::frect*)r0.u32, r1.u32)
- SYSCALL_CLEAR = 23 ;rndr->clear()
- SYSCALL_PRESENT = 24 ;rndr->present(), then wait until next frame
- SYSCALL_RAND_U8 = 25 ;r0.u8 = (u8 )(frandf_b()*KIT_U8_MAX )
- SYSCALL_RAND_U16 = 26 ;r0.u16 = (u16)(frandf_b()*KIT_U16_MAX)
- SYSCALL_RAND_U32 = 27 ;r0.u32 = (u32)(frandf()*KIT_U32_MAX)
- SYSCALL_RAND_F32 = 28 ;r0.f32 = frandf()
- ;r0.u32 = key32 if a key event was in the queue, or 0 if queue is empty
- SYSCALL_GETKEY = 29
- ;text->draw(r0.s32, r1.s32, r2.u32, r3.u32&KIT_S32_MAX)
- SYSCALL_DRAWTEXT = 30
- ;set x and/or y to this to center drawn text on that axis
- CENTERED_TEXT = -2147483647 ;aka 0x80000001
- ;float constants as u32 literals, since
- ;customasm doesn't support ieee-754 float literals
- ;(F32_X_Y = X.Yf -> F32_0_5 = 0.5f)
- F32_0_05 = 0x3D4CCCCD
- F32_255_0 = 0x437F0000
- F32_143_0 = 0x430F0000
- F32_0_5 = 0x3F000000
- F32_1_0 = 0x3F800000
- F32_2_0 = 0x40000000
- F32_4_0 = 0x40800000
- F32_PI2 = 0x3FC90FDB ;pi/2
- F32_PI = 0x40490FDB ;pi
- F32_2PI = 0x40C90FDB ;2*pi
- ;* -------------------------------------------------------------------------- *;
- ;* -------------------------------------------------------------------------- *;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- KE_SHIFT_PRESSED = 31
- KE_MASK_PRESSED = bitmask(1)
- KE_SHIFT_REPEAT = 30
- KE_MASK_REPEAT = bitmask(1)
- KE_SHIFT_KEYMOD = 19
- KE_MASK_KEYMOD = bitmask(11)
- KE_SHIFT_PKEY = 10
- KE_MASK_PKEY = bitmask(9)
- KE_SHIFT_VKEY = 0 ;redundant, since vkey uses the key event's lowest bits anyway
- KE_MASK_VKEY = bitmask(10)
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- KEYMOD_LSHIFT = 0x001
- KEYMOD_RSHIFT = 0x002
- KEYMOD_LCTRL = 0x004
- KEYMOD_RCTRL = 0x008
- KEYMOD_LALT = 0x010
- KEYMOD_RALT = 0x020
- KEYMOD_LGUI = 0x040
- KEYMOD_RGUI = 0x080
- KEYMOD_LWIN = KEYMOD_RGUI
- KEYMOD_RWIN = KEYMOD_RGUI
- KEYMOD_NUM = 0x100
- KEYMOD_CAPS = 0x200
- KEYMOD_MODE = 0x400
- KEYMOD_CTRL = ( KEYMOD_LCTRL | KEYMOD_RCTRL )
- KEYMOD_SHIFT = ( KEYMOD_LSHIFT | KEYMOD_RSHIFT )
- KEYMOD_ALT = ( KEYMOD_LALT | KEYMOD_RALT )
- KEYMOD_GUI = ( KEYMOD_LGUI | KEYMOD_RGUI )
- KEYMOD_WIN = ( KEYMOD_LWIN | KEYMOD_RWIN )
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- PKEY_UNKNOWN = 0
- ;Usage page 0x07
- ;These values are from usage page 0x07 (USB keyboard page).
- PKEY_A = 4
- PKEY_B = 5
- PKEY_C = 6
- PKEY_D = 7
- PKEY_E = 8
- PKEY_F = 9
- PKEY_G = 10
- PKEY_H = 11
- PKEY_I = 12
- PKEY_J = 13
- PKEY_K = 14
- PKEY_L = 15
- PKEY_M = 16
- PKEY_N = 17
- PKEY_O = 18
- PKEY_P = 19
- PKEY_Q = 20
- PKEY_R = 21
- PKEY_S = 22
- PKEY_T = 23
- PKEY_U = 24
- PKEY_V = 25
- PKEY_W = 26
- PKEY_X = 27
- PKEY_Y = 28
- PKEY_Z = 29
- PKEY_1 = 30
- PKEY_2 = 31
- PKEY_3 = 32
- PKEY_4 = 33
- PKEY_5 = 34
- PKEY_6 = 35
- PKEY_7 = 36
- PKEY_8 = 37
- PKEY_9 = 38
- PKEY_0 = 39
- PKEY_RETURN = 40
- PKEY_ESCAPE = 41
- PKEY_BACKSPACE = 42
- PKEY_TAB = 43
- PKEY_SPACE = 44
- PKEY_MINUS = 45
- PKEY_EQUALS = 46
- PKEY_LEFTBRACKET = 47
- PKEY_RIGHTBRACKET = 48
- PKEY_BACKSLASH = 49 ;* Located at the lower left of the return
- * key on ISO keyboards and at the right end
- * of the QWERTY row on ANSI keyboards.
- * Produces REVERSE SOLIDUS (backslash) and
- * VERTICAL LINE in a US layout, REVERSE
- * SOLIDUS and VERTICAL LINE in a UK Mac
- * layout, NUMBER SIGN and TILDE in a UK
- * Windows layout, DOLLAR SIGN and POUND SIGN
- * in a Swiss German layout, NUMBER SIGN and
- * APOSTROPHE in a German layout, GRAVE
- * ACCENT and POUND SIGN in a French Mac
- * layout, and ASTERISK and MICRO SIGN in a
- * French Windows layout.
- *;
- PKEY_NONUSHASH = 50 ;* ISO USB keyboards actually use this code
- * instead of 49 for the same key, but all
- * OSes I've seen treat the two codes
- * identically. So, as an implementor, unless
- * your keyboard generates both of those
- * codes and your OS treats them differently,
- * you should generate PKEY_BACKSLASH
- * instead of this code. As a user, you
- * should not rely on this code because SDL
- * will never generate it with most (all?)
- * keyboards.
- *;
- PKEY_SEMICOLON = 51
- PKEY_APOSTROPHE = 52
- PKEY_GRAVE = 53 ;* Located in the top left corner (on both ANSI
- * and ISO keyboards). Produces GRAVE ACCENT and
- * TILDE in a US Windows layout and in US and UK
- * Mac layouts on ANSI keyboards, GRAVE ACCENT
- * and NOT SIGN in a UK Windows layout, SECTION
- * SIGN and PLUS-MINUS SIGN in US and UK Mac
- * layouts on ISO keyboards, SECTION SIGN and
- * DEGREE SIGN in a Swiss German layout (Mac:
- * only on ISO keyboards), CIRCUMFLEX ACCENT and
- * DEGREE SIGN in a German layout (Mac: only on
- * ISO keyboards), SUPERSCRIPT TWO and TILDE in a
- * French Windows layout, COMMERCIAL AT and
- * NUMBER SIGN in a French Mac layout on ISO
- * keyboards, and LESS-THAN SIGN and GREATER-THAN
- * SIGN in a Swiss German, German, or French Mac
- * layout on ANSI keyboards.
- *;
- PKEY_COMMA = 54
- PKEY_PERIOD = 55
- PKEY_SLASH = 56
- PKEY_CAPSLOCK = 57
- PKEY_F1 = 58
- PKEY_F2 = 59
- PKEY_F3 = 60
- PKEY_F4 = 61
- PKEY_F5 = 62
- PKEY_F6 = 63
- PKEY_F7 = 64
- PKEY_F8 = 65
- PKEY_F9 = 66
- PKEY_F10 = 67
- PKEY_F11 = 68
- PKEY_F12 = 69
- PKEY_PRINTSCREEN = 70
- PKEY_SCROLLLOCK = 71
- PKEY_PAUSE = 72
- PKEY_INSERT = 73 ;* insert on PC, help on some Mac keyboards (but
- does send code 73, not 117) *;
- PKEY_HOME = 74
- PKEY_PAGEUP = 75
- PKEY_DELETE = 76
- PKEY_END = 77
- PKEY_PAGEDOWN = 78
- PKEY_RIGHT = 79
- PKEY_LEFT = 80
- PKEY_DOWN = 81
- PKEY_UP = 82
- PKEY_NUMLOCKCLEAR = 83 ;num lock on PC, clear on Mac keyboards
- PKEY_KP_DIVIDE = 84
- PKEY_KP_MULTIPLY = 85
- PKEY_KP_MINUS = 86
- PKEY_KP_PLUS = 87
- PKEY_KP_ENTER = 88
- PKEY_KP_1 = 89
- PKEY_KP_2 = 90
- PKEY_KP_3 = 91
- PKEY_KP_4 = 92
- PKEY_KP_5 = 93
- PKEY_KP_6 = 94
- PKEY_KP_7 = 95
- PKEY_KP_8 = 96
- PKEY_KP_9 = 97
- PKEY_KP_0 = 98
- PKEY_KP_PERIOD = 99
- PKEY_NONUSBACKSLASH = 100 ;* This is the additional key that ISO
- * keyboards have over ANSI ones,
- * located between left shift and Y.
- * Produces GRAVE ACCENT and TILDE in a
- * US or UK Mac layout, REVERSE SOLIDUS
- * (backslash) and VERTICAL LINE in a
- * US or UK Windows layout, and
- * LESS-THAN SIGN and GREATER-THAN SIGN
- * in a Swiss German, German, or French
- * layout. *;
- PKEY_APPLICATION = 101 ;windows contextual menu, compose
- PKEY_POWER = 102 ;* The USB document says this is a status flag,
- * not a physical key - but some Mac keyboards
- * do have a power key. *;
- PKEY_KP_EQUALS = 103
- PKEY_F13 = 104
- PKEY_F14 = 105
- PKEY_F15 = 106
- PKEY_F16 = 107
- PKEY_F17 = 108
- PKEY_F18 = 109
- PKEY_F19 = 110
- PKEY_F20 = 111
- PKEY_F21 = 112
- PKEY_F22 = 113
- PKEY_F23 = 114
- PKEY_F24 = 115
- PKEY_EXECUTE = 116
- PKEY_HELP = 117 ;AL Integrated Help Center
- PKEY_MENU = 118 ;Menu (show menu)
- PKEY_SELECT = 119
- PKEY_STOP = 120 ;AC Stop
- PKEY_AGAIN = 121 ;AC Redo/Repeat
- PKEY_UNDO = 122 ;AC Undo
- PKEY_CUT = 123 ;AC Cut
- PKEY_COPY = 124 ;AC Copy
- PKEY_PASTE = 125 ;AC Paste
- PKEY_FIND = 126 ;AC Find
- PKEY_MUTE = 127
- PKEY_VOLUMEUP = 128
- PKEY_VOLUMEDOWN = 129
- ;not sure whether there's a reason to enable these
- ;* PKEY_LOCKINGCAPSLOCK = 130, *;
- ;* PKEY_LOCKINGNUMLOCK = 131, *;
- ;* PKEY_LOCKINGSCROLLLOCK = 132, *;
- PKEY_KP_COMMA = 133
- PKEY_KP_EQUALSAS400 = 134
- PKEY_INTERNATIONAL1 = 135 ;* used on Asian keyboards, see
- footnotes in USB doc *;
- PKEY_INTERNATIONAL2 = 136
- PKEY_INTERNATIONAL3 = 137 ;Yen
- PKEY_INTERNATIONAL4 = 138
- PKEY_INTERNATIONAL5 = 139
- PKEY_INTERNATIONAL6 = 140
- PKEY_INTERNATIONAL7 = 141
- PKEY_INTERNATIONAL8 = 142
- PKEY_INTERNATIONAL9 = 143
- PKEY_LANG1 = 144 ;Hangul/English toggle
- PKEY_LANG2 = 145 ;Hanja conversion
- PKEY_LANG3 = 146 ;Katakana
- PKEY_LANG4 = 147 ;Hiragana
- PKEY_LANG5 = 148 ;Zenkaku/Hankaku
- PKEY_LANG6 = 149 ;reserved
- PKEY_LANG7 = 150 ;reserved
- PKEY_LANG8 = 151 ;reserved
- PKEY_LANG9 = 152 ;reserved
- PKEY_ALTERASE = 153 ;Erase-Eaze
- PKEY_SYSREQ = 154
- PKEY_CANCEL = 155 ;AC Cancel
- PKEY_CLEAR = 156
- PKEY_PRIOR = 157
- PKEY_RETURN2 = 158
- PKEY_SEPARATOR = 159
- PKEY_OUT = 160
- PKEY_OPER = 161
- PKEY_CLEARAGAIN = 162
- PKEY_CRSEL = 163
- PKEY_EXSEL = 164
- PKEY_KP_00 = 176
- PKEY_KP_000 = 177
- PKEY_THOUSANDSSEPARATOR = 178
- PKEY_DECIMALSEPARATOR = 179
- PKEY_CURRENCYUNIT = 180
- PKEY_CURRENCYSUBUNIT = 181
- PKEY_KP_LEFTPAREN = 182
- PKEY_KP_RIGHTPAREN = 183
- PKEY_KP_LEFTBRACE = 184
- PKEY_KP_RIGHTBRACE = 185
- PKEY_KP_TAB = 186
- PKEY_KP_BACKSPACE = 187
- PKEY_KP_A = 188
- PKEY_KP_B = 189
- PKEY_KP_C = 190
- PKEY_KP_D = 191
- PKEY_KP_E = 192
- PKEY_KP_F = 193
- PKEY_KP_XOR = 194
- PKEY_KP_POWER = 195
- PKEY_KP_PERCENT = 196
- PKEY_KP_LESS = 197
- PKEY_KP_GREATER = 198
- PKEY_KP_AMPERSAND = 199
- PKEY_KP_DBLAMPERSAND = 200
- PKEY_KP_VERTICALBAR = 201
- PKEY_KP_DBLVERTICALBAR = 202
- PKEY_KP_COLON = 203
- PKEY_KP_HASH = 204
- PKEY_KP_SPACE = 205
- PKEY_KP_AT = 206
- PKEY_KP_EXCLAM = 207
- PKEY_KP_MEMSTORE = 208
- PKEY_KP_MEMRECALL = 209
- PKEY_KP_MEMCLEAR = 210
- PKEY_KP_MEMADD = 211
- PKEY_KP_MEMSUBTRACT = 212
- PKEY_KP_MEMMULTIPLY = 213
- PKEY_KP_MEMDIVIDE = 214
- PKEY_KP_PLUSMINUS = 215
- PKEY_KP_CLEAR = 216
- PKEY_KP_CLEARENTRY = 217
- PKEY_KP_BINARY = 218
- PKEY_KP_OCTAL = 219
- PKEY_KP_DECIMAL = 220
- PKEY_KP_HEXADECIMAL = 221
- PKEY_LCTRL = 224
- PKEY_LSHIFT = 225
- PKEY_LALT = 226 ;alt, option
- PKEY_LGUI = 227 ;windows, command (apple), meta
- PKEY_RCTRL = 228
- PKEY_RSHIFT = 229
- PKEY_RALT = 230 ;alt gr, option
- PKEY_RGUI = 231 ;windows, command (apple), meta
- PKEY_MODE = 257 ;* I'm not sure if this is really not covered
- * by any of the above, but since there's a
- * special KEYMOD_MODE for it I'm adding it here
- *;
- ;*
- * Usage page 0x0C
- *
- * These values are mapped from usage page 0x0C (USB consumer page).
- * See https://usb.org/sites/default/files/hut1_2.pdf
- *
- * There are way more keys in the spec than we can represent in the
- * current scancode range, so pick the ones that commonly come up in
- * real world usage.
- *;
- PKEY_AUDIONEXT = 258
- PKEY_AUDIOPREV = 259
- PKEY_AUDIOSTOP = 260
- PKEY_AUDIOPLAY = 261
- PKEY_AUDIOMUTE = 262
- PKEY_MEDIASELECT = 263
- PKEY_WWW = 264 ;AL Internet Browser
- PKEY_MAIL = 265
- PKEY_CALCULATOR = 266 ;AL Calculator
- PKEY_COMPUTER = 267
- PKEY_AC_SEARCH = 268 ;AC Search
- PKEY_AC_HOME = 269 ;AC Home
- PKEY_AC_BACK = 270 ;AC Back
- PKEY_AC_FORWARD = 271 ;AC Forward
- PKEY_AC_STOP = 272 ;AC Stop
- PKEY_AC_REFRESH = 273 ;AC Refresh
- PKEY_AC_BOOKMARKS = 274 ;AC Bookmarks
- ;*
- * Walther keys
- *
- * These are values that Christian Walther added (for mac keyboard?).
- *;
- PKEY_BRIGHTNESSDOWN = 275
- PKEY_BRIGHTNESSUP = 276
- PKEY_DISPLAYSWITCH = 277 ;* display mirroring/dual display
- switch, video mode switch *;
- PKEY_KBDILLUMTOGGLE = 278
- PKEY_KBDILLUMDOWN = 279
- PKEY_KBDILLUMUP = 280
- PKEY_EJECT = 281
- PKEY_SLEEP = 282 ;SC System Sleep
- PKEY_APP1 = 283
- PKEY_APP2 = 284
- ;*
- * Usage page 0x0C (additional media keys)
- *
- * These values are mapped from usage page 0x0C (USB consumer page).
- *;
- PKEY_AUDIOREWIND = 285
- PKEY_AUDIOFASTFORWARD = 286
- ;*
- * Mobile keys
- *
- * These are values that are often used on mobile phones.
- *;
- PKEY_SOFTLEFT = 287 ;* Usually situated below the display on phones and
- used as a multi-function feature key for selecting
- a software defined function shown on the bottom left
- of the display. *;
- PKEY_SOFTRIGHT = 288 ;* Usually situated below the display on phones and
- used as a multi-function feature key for selecting
- a software defined function shown on the bottom right
- of the display. *;
- PKEY_CALL = 289 ;Used for accepting phone calls.
- PKEY_ENDCALL = 290 ;Used for rejecting phone calls.
- ;(Add any other keys here.)
- KIT_NUM_PKEYS = 512 ;* not a key, just marks the number of scancodes
- for array bounds *;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- _KIT_PKEY_MASK = (1<<9) ;10th bit
- #fn KIT_PKEY_TO_VKEY(X) => ((X)|_KIT_PKEY_MASK)[9:0]
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- VKEY_UNKNOWN = 0
- VKEY_RETURN = 0x0D ;'\r'
- VKEY_ESCAPE = 0x1B
- VKEY_BACKSPACE = 0x08 ;'\b'
- VKEY_TAB = "\t"
- VKEY_SPACE = " "
- VKEY_EXCLAIM = "!"
- VKEY_QUOTEDBL = 0x22 ;'\"'
- VKEY_HASH = "#"
- VKEY_PERCENT = "%"
- VKEY_DOLLAR = "$"
- VKEY_AMPERSAND = "&"
- VKEY_QUOTE = "\'"
- VKEY_LEFTPAREN = "("
- VKEY_RIGHTPAREN = ")"
- VKEY_ASTERISK = "*"
- VKEY_PLUS = "+"
- VKEY_COMMA = ","
- VKEY_MINUS = "-"
- VKEY_PERIOD = "."
- VKEY_SLASH = "/"
- VKEY_0 = "0"
- VKEY_1 = "1"
- VKEY_2 = "2"
- VKEY_3 = "3"
- VKEY_4 = "4"
- VKEY_5 = "5"
- VKEY_6 = "6"
- VKEY_7 = "7"
- VKEY_8 = "8"
- VKEY_9 = "9"
- VKEY_COLON = ":"
- VKEY_SEMICOLON = ";"
- VKEY_LESS = "<"
- VKEY_EQUALS = "="
- VKEY_GREATER = ">"
- VKEY_QUESTION = "?"
- VKEY_AT = "@"
- ;(Skip uppercase letters)
- VKEY_LEFTBRACKET = "["
- VKEY_BACKSLASH = "\\"
- VKEY_RIGHTBRACKET = "]"
- VKEY_CARET = "^"
- VKEY_UNDERSCORE = "_"
- VKEY_BACKQUOTE = "`"
- VKEY_a = "a"
- VKEY_b = "b"
- VKEY_c = "c"
- VKEY_d = "d"
- VKEY_e = "e"
- VKEY_f = "f"
- VKEY_g = "g"
- VKEY_h = "h"
- VKEY_i = "i"
- VKEY_j = "j"
- VKEY_k = "k"
- VKEY_l = "l"
- VKEY_m = "m"
- VKEY_n = "n"
- VKEY_o = "o"
- VKEY_p = "p"
- VKEY_q = "q"
- VKEY_r = "r"
- VKEY_s = "s"
- VKEY_t = "t"
- VKEY_u = "u"
- VKEY_v = "v"
- VKEY_w = "w"
- VKEY_x = "x"
- VKEY_y = "y"
- VKEY_z = "z"
- VKEY_CAPSLOCK = KIT_PKEY_TO_VKEY(PKEY_CAPSLOCK)
- VKEY_F1 = KIT_PKEY_TO_VKEY(PKEY_F1)
- VKEY_F2 = KIT_PKEY_TO_VKEY(PKEY_F2)
- VKEY_F3 = KIT_PKEY_TO_VKEY(PKEY_F3)
- VKEY_F4 = KIT_PKEY_TO_VKEY(PKEY_F4)
- VKEY_F5 = KIT_PKEY_TO_VKEY(PKEY_F5)
- VKEY_F6 = KIT_PKEY_TO_VKEY(PKEY_F6)
- VKEY_F7 = KIT_PKEY_TO_VKEY(PKEY_F7)
- VKEY_F8 = KIT_PKEY_TO_VKEY(PKEY_F8)
- VKEY_F9 = KIT_PKEY_TO_VKEY(PKEY_F9)
- VKEY_F10 = KIT_PKEY_TO_VKEY(PKEY_F10)
- VKEY_F11 = KIT_PKEY_TO_VKEY(PKEY_F11)
- VKEY_F12 = KIT_PKEY_TO_VKEY(PKEY_F12)
- VKEY_PRINTSCREEN = KIT_PKEY_TO_VKEY(PKEY_PRINTSCREEN)
- VKEY_SCROLLLOCK = KIT_PKEY_TO_VKEY(PKEY_SCROLLLOCK)
- VKEY_PAUSE = KIT_PKEY_TO_VKEY(PKEY_PAUSE)
- VKEY_INSERT = KIT_PKEY_TO_VKEY(PKEY_INSERT)
- VKEY_HOME = KIT_PKEY_TO_VKEY(PKEY_HOME)
- VKEY_PAGEUP = KIT_PKEY_TO_VKEY(PKEY_PAGEUP)
- VKEY_DELETE = "\x7F"
- VKEY_END = KIT_PKEY_TO_VKEY(PKEY_END)
- VKEY_PAGEDOWN = KIT_PKEY_TO_VKEY(PKEY_PAGEDOWN)
- VKEY_RIGHT = KIT_PKEY_TO_VKEY(PKEY_RIGHT)
- VKEY_LEFT = KIT_PKEY_TO_VKEY(PKEY_LEFT)
- VKEY_DOWN = KIT_PKEY_TO_VKEY(PKEY_DOWN)
- VKEY_UP = KIT_PKEY_TO_VKEY(PKEY_UP)
- VKEY_NUMLOCKCLEAR = KIT_PKEY_TO_VKEY(PKEY_NUMLOCKCLEAR)
- VKEY_KP_DIVIDE = KIT_PKEY_TO_VKEY(PKEY_KP_DIVIDE)
- VKEY_KP_MULTIPLY = KIT_PKEY_TO_VKEY(PKEY_KP_MULTIPLY)
- VKEY_KP_MINUS = KIT_PKEY_TO_VKEY(PKEY_KP_MINUS)
- VKEY_KP_PLUS = KIT_PKEY_TO_VKEY(PKEY_KP_PLUS)
- VKEY_KP_ENTER = KIT_PKEY_TO_VKEY(PKEY_KP_ENTER)
- VKEY_KP_1 = KIT_PKEY_TO_VKEY(PKEY_KP_1)
- VKEY_KP_2 = KIT_PKEY_TO_VKEY(PKEY_KP_2)
- VKEY_KP_3 = KIT_PKEY_TO_VKEY(PKEY_KP_3)
- VKEY_KP_4 = KIT_PKEY_TO_VKEY(PKEY_KP_4)
- VKEY_KP_5 = KIT_PKEY_TO_VKEY(PKEY_KP_5)
- VKEY_KP_6 = KIT_PKEY_TO_VKEY(PKEY_KP_6)
- VKEY_KP_7 = KIT_PKEY_TO_VKEY(PKEY_KP_7)
- VKEY_KP_8 = KIT_PKEY_TO_VKEY(PKEY_KP_8)
- VKEY_KP_9 = KIT_PKEY_TO_VKEY(PKEY_KP_9)
- VKEY_KP_0 = KIT_PKEY_TO_VKEY(PKEY_KP_0)
- VKEY_KP_PERIOD = KIT_PKEY_TO_VKEY(PKEY_KP_PERIOD)
- VKEY_APPLICATION = KIT_PKEY_TO_VKEY(PKEY_APPLICATION)
- VKEY_POWER = KIT_PKEY_TO_VKEY(PKEY_POWER)
- VKEY_KP_EQUALS = KIT_PKEY_TO_VKEY(PKEY_KP_EQUALS)
- VKEY_F13 = KIT_PKEY_TO_VKEY(PKEY_F13)
- VKEY_F14 = KIT_PKEY_TO_VKEY(PKEY_F14)
- VKEY_F15 = KIT_PKEY_TO_VKEY(PKEY_F15)
- VKEY_F16 = KIT_PKEY_TO_VKEY(PKEY_F16)
- VKEY_F17 = KIT_PKEY_TO_VKEY(PKEY_F17)
- VKEY_F18 = KIT_PKEY_TO_VKEY(PKEY_F18)
- VKEY_F19 = KIT_PKEY_TO_VKEY(PKEY_F19)
- VKEY_F20 = KIT_PKEY_TO_VKEY(PKEY_F20)
- VKEY_F21 = KIT_PKEY_TO_VKEY(PKEY_F21)
- VKEY_F22 = KIT_PKEY_TO_VKEY(PKEY_F22)
- VKEY_F23 = KIT_PKEY_TO_VKEY(PKEY_F23)
- VKEY_F24 = KIT_PKEY_TO_VKEY(PKEY_F24)
- VKEY_EXECUTE = KIT_PKEY_TO_VKEY(PKEY_EXECUTE)
- VKEY_HELP = KIT_PKEY_TO_VKEY(PKEY_HELP)
- VKEY_MENU = KIT_PKEY_TO_VKEY(PKEY_MENU)
- VKEY_SELECT = KIT_PKEY_TO_VKEY(PKEY_SELECT)
- VKEY_STOP = KIT_PKEY_TO_VKEY(PKEY_STOP)
- VKEY_AGAIN = KIT_PKEY_TO_VKEY(PKEY_AGAIN)
- VKEY_UNDO = KIT_PKEY_TO_VKEY(PKEY_UNDO)
- VKEY_CUT = KIT_PKEY_TO_VKEY(PKEY_CUT)
- VKEY_COPY = KIT_PKEY_TO_VKEY(PKEY_COPY)
- VKEY_PASTE = KIT_PKEY_TO_VKEY(PKEY_PASTE)
- VKEY_FIND = KIT_PKEY_TO_VKEY(PKEY_FIND)
- VKEY_MUTE = KIT_PKEY_TO_VKEY(PKEY_MUTE)
- VKEY_VOLUMEUP = KIT_PKEY_TO_VKEY(PKEY_VOLUMEUP)
- VKEY_VOLUMEDOWN = KIT_PKEY_TO_VKEY(PKEY_VOLUMEDOWN)
- VKEY_KP_COMMA = KIT_PKEY_TO_VKEY(PKEY_KP_COMMA)
- VKEY_KP_EQUALSAS400 = KIT_PKEY_TO_VKEY(PKEY_KP_EQUALSAS400)
- VKEY_ALTERASE = KIT_PKEY_TO_VKEY(PKEY_ALTERASE)
- VKEY_SYSREQ = KIT_PKEY_TO_VKEY(PKEY_SYSREQ)
- VKEY_CANCEL = KIT_PKEY_TO_VKEY(PKEY_CANCEL)
- VKEY_CLEAR = KIT_PKEY_TO_VKEY(PKEY_CLEAR)
- VKEY_PRIOR = KIT_PKEY_TO_VKEY(PKEY_PRIOR)
- VKEY_RETURN2 = KIT_PKEY_TO_VKEY(PKEY_RETURN2)
- VKEY_SEPARATOR = KIT_PKEY_TO_VKEY(PKEY_SEPARATOR)
- VKEY_OUT = KIT_PKEY_TO_VKEY(PKEY_OUT)
- VKEY_OPER = KIT_PKEY_TO_VKEY(PKEY_OPER)
- VKEY_CLEARAGAIN = KIT_PKEY_TO_VKEY(PKEY_CLEARAGAIN)
- VKEY_CRSEL = KIT_PKEY_TO_VKEY(PKEY_CRSEL)
- VKEY_EXSEL = KIT_PKEY_TO_VKEY(PKEY_EXSEL)
- VKEY_KP_00 = KIT_PKEY_TO_VKEY(PKEY_KP_00)
- VKEY_KP_000 = KIT_PKEY_TO_VKEY(PKEY_KP_000)
- VKEY_THOUSANDSSEPARATOR = KIT_PKEY_TO_VKEY(PKEY_THOUSANDSSEPARATOR)
- VKEY_DECIMALSEPARATOR = KIT_PKEY_TO_VKEY(PKEY_DECIMALSEPARATOR)
- VKEY_CURRENCYUNIT = KIT_PKEY_TO_VKEY(PKEY_CURRENCYUNIT)
- VKEY_CURRENCYSUBUNIT = KIT_PKEY_TO_VKEY(PKEY_CURRENCYSUBUNIT)
- VKEY_KP_LEFTPAREN = KIT_PKEY_TO_VKEY(PKEY_KP_LEFTPAREN)
- VKEY_KP_RIGHTPAREN = KIT_PKEY_TO_VKEY(PKEY_KP_RIGHTPAREN)
- VKEY_KP_LEFTBRACE = KIT_PKEY_TO_VKEY(PKEY_KP_LEFTBRACE)
- VKEY_KP_RIGHTBRACE = KIT_PKEY_TO_VKEY(PKEY_KP_RIGHTBRACE)
- VKEY_KP_TAB = KIT_PKEY_TO_VKEY(PKEY_KP_TAB)
- VKEY_KP_BACKSPACE = KIT_PKEY_TO_VKEY(PKEY_KP_BACKSPACE)
- VKEY_KP_A = KIT_PKEY_TO_VKEY(PKEY_KP_A)
- VKEY_KP_B = KIT_PKEY_TO_VKEY(PKEY_KP_B)
- VKEY_KP_C = KIT_PKEY_TO_VKEY(PKEY_KP_C)
- VKEY_KP_D = KIT_PKEY_TO_VKEY(PKEY_KP_D)
- VKEY_KP_E = KIT_PKEY_TO_VKEY(PKEY_KP_E)
- VKEY_KP_F = KIT_PKEY_TO_VKEY(PKEY_KP_F)
- VKEY_KP_XOR = KIT_PKEY_TO_VKEY(PKEY_KP_XOR)
- VKEY_KP_POWER = KIT_PKEY_TO_VKEY(PKEY_KP_POWER)
- VKEY_KP_PERCENT = KIT_PKEY_TO_VKEY(PKEY_KP_PERCENT)
- VKEY_KP_LESS = KIT_PKEY_TO_VKEY(PKEY_KP_LESS)
- VKEY_KP_GREATER = KIT_PKEY_TO_VKEY(PKEY_KP_GREATER)
- VKEY_KP_AMPERSAND = KIT_PKEY_TO_VKEY(PKEY_KP_AMPERSAND)
- VKEY_KP_DBLAMPERSAND = KIT_PKEY_TO_VKEY(PKEY_KP_DBLAMPERSAND)
- VKEY_KP_VERTICALBAR = KIT_PKEY_TO_VKEY(PKEY_KP_VERTICALBAR)
- VKEY_KP_DBLVERTICALBAR = KIT_PKEY_TO_VKEY(PKEY_KP_DBLVERTICALBAR)
- VKEY_KP_COLON = KIT_PKEY_TO_VKEY(PKEY_KP_COLON)
- VKEY_KP_HASH = KIT_PKEY_TO_VKEY(PKEY_KP_HASH)
- VKEY_KP_SPACE = KIT_PKEY_TO_VKEY(PKEY_KP_SPACE)
- VKEY_KP_AT = KIT_PKEY_TO_VKEY(PKEY_KP_AT)
- VKEY_KP_EXCLAM = KIT_PKEY_TO_VKEY(PKEY_KP_EXCLAM)
- VKEY_KP_MEMSTORE = KIT_PKEY_TO_VKEY(PKEY_KP_MEMSTORE)
- VKEY_KP_MEMRECALL = KIT_PKEY_TO_VKEY(PKEY_KP_MEMRECALL)
- VKEY_KP_MEMCLEAR = KIT_PKEY_TO_VKEY(PKEY_KP_MEMCLEAR)
- VKEY_KP_MEMADD = KIT_PKEY_TO_VKEY(PKEY_KP_MEMADD)
- VKEY_KP_MEMSUBTRACT = KIT_PKEY_TO_VKEY(PKEY_KP_MEMSUBTRACT)
- VKEY_KP_MEMMULTIPLY = KIT_PKEY_TO_VKEY(PKEY_KP_MEMMULTIPLY)
- VKEY_KP_MEMDIVIDE = KIT_PKEY_TO_VKEY(PKEY_KP_MEMDIVIDE)
- VKEY_KP_PLUSMINUS = KIT_PKEY_TO_VKEY(PKEY_KP_PLUSMINUS)
- VKEY_KP_CLEAR = KIT_PKEY_TO_VKEY(PKEY_KP_CLEAR)
- VKEY_KP_CLEARENTRY = KIT_PKEY_TO_VKEY(PKEY_KP_CLEARENTRY)
- VKEY_KP_BINARY = KIT_PKEY_TO_VKEY(PKEY_KP_BINARY)
- VKEY_KP_OCTAL = KIT_PKEY_TO_VKEY(PKEY_KP_OCTAL)
- VKEY_KP_DECIMAL = KIT_PKEY_TO_VKEY(PKEY_KP_DECIMAL)
- VKEY_KP_HEXADECIMAL = KIT_PKEY_TO_VKEY(PKEY_KP_HEXADECIMAL)
- VKEY_LCTRL = KIT_PKEY_TO_VKEY(PKEY_LCTRL)
- VKEY_LSHIFT = KIT_PKEY_TO_VKEY(PKEY_LSHIFT)
- VKEY_LALT = KIT_PKEY_TO_VKEY(PKEY_LALT)
- VKEY_LGUI = KIT_PKEY_TO_VKEY(PKEY_LGUI)
- VKEY_RCTRL = KIT_PKEY_TO_VKEY(PKEY_RCTRL)
- VKEY_RSHIFT = KIT_PKEY_TO_VKEY(PKEY_RSHIFT)
- VKEY_RALT = KIT_PKEY_TO_VKEY(PKEY_RALT)
- VKEY_RGUI = KIT_PKEY_TO_VKEY(PKEY_RGUI)
- VKEY_MODE = KIT_PKEY_TO_VKEY(PKEY_MODE)
- VKEY_AUDIONEXT = KIT_PKEY_TO_VKEY(PKEY_AUDIONEXT)
- VKEY_AUDIOPREV = KIT_PKEY_TO_VKEY(PKEY_AUDIOPREV)
- VKEY_AUDIOSTOP = KIT_PKEY_TO_VKEY(PKEY_AUDIOSTOP)
- VKEY_AUDIOPLAY = KIT_PKEY_TO_VKEY(PKEY_AUDIOPLAY)
- VKEY_AUDIOMUTE = KIT_PKEY_TO_VKEY(PKEY_AUDIOMUTE)
- VKEY_MEDIASELECT = KIT_PKEY_TO_VKEY(PKEY_MEDIASELECT)
- VKEY_WWW = KIT_PKEY_TO_VKEY(PKEY_WWW)
- VKEY_MAIL = KIT_PKEY_TO_VKEY(PKEY_MAIL)
- VKEY_CALCULATOR = KIT_PKEY_TO_VKEY(PKEY_CALCULATOR)
- VKEY_COMPUTER = KIT_PKEY_TO_VKEY(PKEY_COMPUTER)
- VKEY_AC_SEARCH = KIT_PKEY_TO_VKEY(PKEY_AC_SEARCH)
- VKEY_AC_HOME = KIT_PKEY_TO_VKEY(PKEY_AC_HOME)
- VKEY_AC_BACK = KIT_PKEY_TO_VKEY(PKEY_AC_BACK)
- VKEY_AC_FORWARD = KIT_PKEY_TO_VKEY(PKEY_AC_FORWARD)
- VKEY_AC_STOP = KIT_PKEY_TO_VKEY(PKEY_AC_STOP)
- VKEY_AC_REFRESH = KIT_PKEY_TO_VKEY(PKEY_AC_REFRESH)
- VKEY_AC_BOOKMARKS = KIT_PKEY_TO_VKEY(PKEY_AC_BOOKMARKS)
- VKEY_BRIGHTNESSDOWN = KIT_PKEY_TO_VKEY(PKEY_BRIGHTNESSDOWN)
- VKEY_BRIGHTNESSUP = KIT_PKEY_TO_VKEY(PKEY_BRIGHTNESSUP)
- VKEY_DISPLAYSWITCH = KIT_PKEY_TO_VKEY(PKEY_DISPLAYSWITCH)
- VKEY_KBDILLUMTOGGLE = KIT_PKEY_TO_VKEY(PKEY_KBDILLUMTOGGLE)
- VKEY_KBDILLUMDOWN = KIT_PKEY_TO_VKEY(PKEY_KBDILLUMDOWN)
- VKEY_KBDILLUMUP = KIT_PKEY_TO_VKEY(PKEY_KBDILLUMUP)
- VKEY_EJECT = KIT_PKEY_TO_VKEY(PKEY_EJECT)
- VKEY_SLEEP = KIT_PKEY_TO_VKEY(PKEY_SLEEP)
- VKEY_APP1 = KIT_PKEY_TO_VKEY(PKEY_APP1)
- VKEY_APP2 = KIT_PKEY_TO_VKEY(PKEY_APP2)
- VKEY_AUDIOREWIND = KIT_PKEY_TO_VKEY(PKEY_AUDIOREWIND)
- VKEY_AUDIOFASTFORWARD = KIT_PKEY_TO_VKEY(PKEY_AUDIOFASTFORWARD)
- VKEY_SOFTLEFT = KIT_PKEY_TO_VKEY(PKEY_SOFTLEFT)
- VKEY_SOFTRIGHT = KIT_PKEY_TO_VKEY(PKEY_SOFTRIGHT)
- VKEY_CALL = KIT_PKEY_TO_VKEY(PKEY_CALL)
- VKEY_ENDCALL = KIT_PKEY_TO_VKEY(PKEY_ENDCALL)
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; integer bounds
- U8_MAX = 0xFF
- U16_MAX = 0xFFFF
- U24_MAX = 0xFFFFFF
- U32_MAX = 0xFFFFFFFF
- ;
- S8_MIN = 0x80
- S8_MAX = 0x7F
- S16_MIN = 0x8000
- S16_MAX = 0x7FFF
- S24_MIN = 0x800000
- S24_MAX = 0x7FFFFF
- S32_MIN = 0x80000000
- S32_MAX = 0x7FFFFFFF
- ; most significant bits/Bytes
- MSb_8 = 0x80
- MSb_16 = 0x8000
- MSb_24 = 0x800000
- MSb_32 = 0x80000000
- ;
- MSB_8 = 0xFF
- MSB_16 = 0xFF00
- MSB_24 = 0xFF0000
- MSB_32 = 0xFF000000
- ;* -------------------------------------------------------------------------- *;
- ;* -------------------------------------------------------------------------- *;
- ;(flg and *flg are only available for dst)
- #subruledef reg_src
- {
- ;by value
- r0 => 0b0000`4
- r1 => 0b0001`4
- r2 => 0b0010`4
- r3 => 0b0011`4
- r4 => 0b0100`4
- r5 => 0b0101`4
- sp => 0b0110`4
- ;by reference
- *r0 => 0b1000`4
- *r1 => 0b1001`4
- *r2 => 0b1010`4
- *r3 => 0b1011`4
- *r4 => 0b1100`4
- *r5 => 0b1101`4
- *sp => 0b1110`4
- }
- #subruledef reg_dst
- {
- ;by value
- r0 => 0b0000`4
- r1 => 0b0001`4
- r2 => 0b0010`4
- r3 => 0b0011`4
- r4 => 0b0100`4
- r5 => 0b0101`4
- sp => 0b0110`4
- flg => 0b0111`4
- ;by reference
- *r0 => 0b1000`4
- *r1 => 0b1001`4
- *r2 => 0b1010`4
- *r3 => 0b1011`4
- *r4 => 0b1100`4
- *r5 => 0b1101`4
- *sp => 0b1110`4
- *flg => 0b1111`4
- }
- #fn _imm8(v8) => v8[7:0] @ 0`8
- #fn _imm16(v16) => lend16(v16)
- #fn _imm32(v32) => 0`16 @ lend32(v32)
- #fn _dU8(op, dst, src) => 0b000`3 @ op`5 @ dst`4 @ src`4
- #ruledef datatype_u8 { ;data = 0b000
- brk.u8 => _dU8(0,0,0) @ _imm16(0) ;(tbd)
- mov.u8 {d: reg_dst}, {s: reg_src} => _dU8(1,d,s) @ _imm16(0) ;d = s
- cmp.u8 {d: reg_dst}, {s: reg_src} => _dU8(2,d,s) @ _imm16(0) ;compare d and s
- mov.u8 {d: reg_dst}, #{v: u8} => _dU8(1,d, 7) @ _imm8(v)
- cmp.u8 {d: reg_dst}, #{v: u8} => _dU8(2,d, 7) @ _imm8(v)
- mov.u8 {d: reg_dst}, *#{p: u32} => _dU8(1,d,15) @ _imm32(p)
- cmp.u8 {d: reg_dst}, *#{p: u32} => _dU8(2,d,15) @ _imm32(p)
- jmp.u8 {s: reg_src} => _dU8(3,0,s) @ _imm16(0) ;unconditional jump to s
- jsr.u8 {s: reg_src} => _dU8(4,0,s) @ _imm16(0) ;jump to subroutine in s
- jmp.u8 #{v: u8} => _dU8(3,0, 7) @ _imm8(v)
- jsr.u8 #{v: u8} => _dU8(4,0, 7) @ _imm8(v)
- jmp.u8 *#{p: u32} => _dU8(3,0,15) @ _imm32(p)
- jsr.u8 *#{p: u32} => _dU8(4,0,15) @ _imm32(p)
- sld.u8 {d: reg_dst}, {s: reg_src} => _dU8(5,d, s) @ _imm16(0) ;load to d from stack offset (s16 s offset, relative to sp)
- sst.u8 {d: reg_dst}, {s: reg_src} => _dU8(6,d, s) @ _imm16(0) ;store d to stack offset (s16 s, relative to sp)
- sld.u8 {d: reg_dst}, #{v: s16} => _dU8(5,d, 7) @ _imm16(v)
- sst.u8 {d: reg_dst}, #{v: s16} => _dU8(6,d, 7) @ _imm16(v)
- sld.u8 {d: reg_dst}, *#{p: u32} => _dU8(5,d,15) @ _imm32(p)
- sst.u8 {d: reg_dst}, *#{p: u32} => _dU8(6,d,15) @ _imm32(p)
- sph.u8 {s: reg_src} => _dU8(7,0,s) @ _imm16(0) ;push s to stack
- sph.u8 #{v: u8 } => _dU8(7,0, 7) @ _imm8(v)
- sph.u8 *#{p: u32} => _dU8(7,0,15) @ _imm32(p)
- spl.u8 {d: reg_dst} => _dU8(8,d,0) @ _imm16(0) ;pull from stack into d
- inc.u8 {d: reg_dst} => _dU8( 9,d,0) @ _imm16(0) ;++d
- dec.u8 {d: reg_dst} => _dU8(10,d,0) @ _imm16(0) ;--d
- add.u8 {d: reg_dst}, {s: reg_src} => _dU8(11,d,s) @ _imm16(0) ;d += s
- sub.u8 {d: reg_dst}, {s: reg_src} => _dU8(12,d,s) @ _imm16(0) ;d -= s
- mul.u8 {d: reg_dst}, {s: reg_src} => _dU8(13,d,s) @ _imm16(0) ;d *= s
- div.u8 {d: reg_dst}, {s: reg_src} => _dU8(14,d,s) @ _imm16(0) ;d /= s
- mod.u8 {d: reg_dst}, {s: reg_src} => _dU8(15,d,s) @ _imm16(0) ;d %= s
- neg.u8 {d: reg_dst}, {s: reg_src} => _dU8(16,d,s) @ _imm16(0) ;d = -s
- add.u8 {d: reg_dst}, #{v: u8} => _dU8(11,d, 7) @ _imm8(v)
- sub.u8 {d: reg_dst}, #{v: u8} => _dU8(12,d, 7) @ _imm8(v)
- mul.u8 {d: reg_dst}, #{v: u8} => _dU8(13,d, 7) @ _imm8(v)
- div.u8 {d: reg_dst}, #{v: u8} => _dU8(14,d, 7) @ _imm8(v)
- mod.u8 {d: reg_dst}, #{v: u8} => _dU8(15,d, 7) @ _imm8(v)
- neg.u8 {d: reg_dst}, #{v: u8} => _dU8(16,d, 7) @ _imm8(v)
- add.u8 {d: reg_dst}, *#{p: u32} => _dU8(11,d,15) @ _imm32(p)
- sub.u8 {d: reg_dst}, *#{p: u32} => _dU8(12,d,15) @ _imm32(p)
- mul.u8 {d: reg_dst}, *#{p: u32} => _dU8(13,d,15) @ _imm32(p)
- div.u8 {d: reg_dst}, *#{p: u32} => _dU8(14,d,15) @ _imm32(p)
- mod.u8 {d: reg_dst}, *#{p: u32} => _dU8(15,d,15) @ _imm32(p)
- neg.u8 {d: reg_dst}, *#{p: u32} => _dU8(16,d,15) @ _imm32(p)
- not.u8 {d: reg_dst}, {s: reg_src} => _dU8(17,d,s) @ _imm16(0) ;~
- nnd.u8 {d: reg_dst}, {s: reg_src} => _dU8(18,d,s) @ _imm16(0) ;& ~
- and.u8 {d: reg_dst}, {s: reg_src} => _dU8(19,d,s) @ _imm16(0) ;&
- nor.u8 {d: reg_dst}, {s: reg_src} => _dU8(20,d,s) @ _imm16(0) ;| ~
- ior.u8 {d: reg_dst}, {s: reg_src} => _dU8(21,d,s) @ _imm16(0) ;|
- xor.u8 {d: reg_dst}, {s: reg_src} => _dU8(22,d,s) @ _imm16(0) ;^
- shl.u8 {d: reg_dst}, {s: reg_src} => _dU8(23,d,s) @ _imm16(0) ;<<
- shr.u8 {d: reg_dst}, {s: reg_src} => _dU8(24,d,s) @ _imm16(0) ;>>
- rol.u8 {d: reg_dst}, {s: reg_src} => _dU8(25,d,s) @ _imm16(0) ;rotate left
- ror.u8 {d: reg_dst}, {s: reg_src} => _dU8(26,d,s) @ _imm16(0) ;rotate right
- ext.u8 {d: reg_dst}, {s: reg_src} => _dU8(27,d,s) @ _imm16(0) ;sign extension
- not.u8 {d: reg_dst}, #{v: u8 } => _dU8(17,d, 7) @ _imm8(v)
- nnd.u8 {d: reg_dst}, #{v: u8 } => _dU8(18,d, 7) @ _imm8(v)
- and.u8 {d: reg_dst}, #{v: u8 } => _dU8(19,d, 7) @ _imm8(v)
- nor.u8 {d: reg_dst}, #{v: u8 } => _dU8(20,d, 7) @ _imm8(v)
- ior.u8 {d: reg_dst}, #{v: u8 } => _dU8(21,d, 7) @ _imm8(v)
- xor.u8 {d: reg_dst}, #{v: u8 } => _dU8(22,d, 7) @ _imm8(v)
- shl.u8 {d: reg_dst}, #{v: u8 } => _dU8(23,d, 7) @ _imm8(v)
- shr.u8 {d: reg_dst}, #{v: u8 } => _dU8(24,d, 7) @ _imm8(v)
- rol.u8 {d: reg_dst}, #{v: u8 } => _dU8(25,d, 7) @ _imm8(v)
- ror.u8 {d: reg_dst}, #{v: u8 } => _dU8(26,d, 7) @ _imm8(v)
- ext.u8 {d: reg_dst}, #{v: u8 } => _dU8(27,d, 7) @ _imm8(v)
- not.u8 {d: reg_dst}, *#{p: u32} => _dU8(17,d,15) @ _imm32(p)
- nnd.u8 {d: reg_dst}, *#{p: u32} => _dU8(18,d,15) @ _imm32(p)
- and.u8 {d: reg_dst}, *#{p: u32} => _dU8(19,d,15) @ _imm32(p)
- nor.u8 {d: reg_dst}, *#{p: u32} => _dU8(20,d,15) @ _imm32(p)
- ior.u8 {d: reg_dst}, *#{p: u32} => _dU8(21,d,15) @ _imm32(p)
- xor.u8 {d: reg_dst}, *#{p: u32} => _dU8(22,d,15) @ _imm32(p)
- shl.u8 {d: reg_dst}, *#{p: u32} => _dU8(23,d,15) @ _imm32(p)
- shr.u8 {d: reg_dst}, *#{p: u32} => _dU8(24,d,15) @ _imm32(p)
- rol.u8 {d: reg_dst}, *#{p: u32} => _dU8(25,d,15) @ _imm32(p)
- ror.u8 {d: reg_dst}, *#{p: u32} => _dU8(26,d,15) @ _imm32(p)
- ext.u8 {d: reg_dst}, *#{p: u32} => _dU8(27,d,15) @ _imm32(p)
- jfn.u8 {s: reg_src} => _dU8(28,0,s) @ _imm16(0)
- jfn.u8 #{v: u8} => _dU8(28,0, 7) @ _imm8(v)
- jfn.u8 *#{p: u32} => _dU8(28,0,15) @ _imm32(p)
- }
- #fn _dS8(op, dst, src) => 0b100`3 @ op`5 @ dst`4 @ src`4
- #ruledef datatype_s8 { ;data = 0b100
- brk.s8 => _dS8(0,0,0) @ _imm16(0) ;(tbd)
- mov.s8 {d: reg_dst}, {s: reg_src} => _dS8(1,d,s) @ _imm16(0) ;d = s
- cmp.s8 {d: reg_dst}, {s: reg_src} => _dS8(2,d,s) @ _imm16(0) ;compare d and s
- mov.s8 {d: reg_dst}, #{v: s8} => _dS8(1,d, 7) @ _imm8(v)
- cmp.s8 {d: reg_dst}, #{v: s8} => _dS8(2,d, 7) @ _imm8(v)
- mov.s8 {d: reg_dst}, *#{p: u32} => _dS8(1,d,15) @ _imm32(p)
- cmp.s8 {d: reg_dst}, *#{p: u32} => _dS8(2,d,15) @ _imm32(p)
- jmp.s8 {s: reg_src} => _dS8(3,0,s) @ _imm16(0) ;unconditional jump to s
- jsr.s8 {s: reg_src} => _dS8(4,0,s) @ _imm16(0) ;jump to subroutine in s
- jmp.s8 #{v: s8} => _dS8(3,0, 7) @ _imm8(v)
- jsr.s8 #{v: s8} => _dS8(4,0, 7) @ _imm8(v)
- jmp.s8 *#{p: u32} => _dS8(3,0,15) @ _imm32(p)
- jsr.s8 *#{p: u32} => _dS8(4,0,15) @ _imm32(p)
- sld.s8 {d: reg_dst}, {s: reg_src} => _dS8(5,d, s) @ _imm16(0) ;load to d from stack offset (s16 s offset, relative to sp)
- sst.s8 {d: reg_dst}, {s: reg_src} => _dS8(6,d, s) @ _imm16(0) ;store d to stack offset (s16 s, relative to sp)
- sld.s8 {d: reg_dst}, #{v: s16} => _dS8(5,d, 7) @ _imm16(v)
- sst.s8 {d: reg_dst}, #{v: s16} => _dS8(6,d, 7) @ _imm16(v)
- sld.s8 {d: reg_dst}, *#{p: u32} => _dS8(5,d,15) @ _imm32(p)
- sst.s8 {d: reg_dst}, *#{p: u32} => _dS8(6,d,15) @ _imm32(p)
- sph.s8 {s: reg_src} => _dS8(7,0,s) @ _imm16(0) ;push s to stack
- sph.s8 #{v: s8 } => _dS8(7,0, 7) @ _imm8(v)
- sph.s8 *#{p: u32} => _dS8(7,0,15) @ _imm32(p)
- spl.s8 {d: reg_dst} => _dS8(8,d,0) @ _imm16(0) ;pull from stack into d
- inc.s8 {d: reg_dst} => _dS8( 9,d,0) @ _imm16(0) ;++d
- dec.s8 {d: reg_dst} => _dS8(10,d,0) @ _imm16(0) ;--d
- add.s8 {d: reg_dst}, {s: reg_src} => _dS8(11,d,s) @ _imm16(0) ;d += s
- sub.s8 {d: reg_dst}, {s: reg_src} => _dS8(12,d,s) @ _imm16(0) ;d -= s
- mul.s8 {d: reg_dst}, {s: reg_src} => _dS8(13,d,s) @ _imm16(0) ;d *= s
- div.s8 {d: reg_dst}, {s: reg_src} => _dS8(14,d,s) @ _imm16(0) ;d /= s
- mod.s8 {d: reg_dst}, {s: reg_src} => _dS8(15,d,s) @ _imm16(0) ;d %= s
- neg.s8 {d: reg_dst}, {s: reg_src} => _dS8(16,d,s) @ _imm16(0) ;d = -s
- add.s8 {d: reg_dst}, #{v: s8} => _dS8(11,d, 7) @ _imm8(v)
- sub.s8 {d: reg_dst}, #{v: s8} => _dS8(12,d, 7) @ _imm8(v)
- mul.s8 {d: reg_dst}, #{v: s8} => _dS8(13,d, 7) @ _imm8(v)
- div.s8 {d: reg_dst}, #{v: s8} => _dS8(14,d, 7) @ _imm8(v)
- mod.s8 {d: reg_dst}, #{v: s8} => _dS8(15,d, 7) @ _imm8(v)
- neg.s8 {d: reg_dst}, #{v: s8} => _dS8(16,d, 7) @ _imm8(v)
- add.s8 {d: reg_dst}, *#{p: u32} => _dS8(11,d,15) @ _imm32(p)
- sub.s8 {d: reg_dst}, *#{p: u32} => _dS8(12,d,15) @ _imm32(p)
- mul.s8 {d: reg_dst}, *#{p: u32} => _dS8(13,d,15) @ _imm32(p)
- div.s8 {d: reg_dst}, *#{p: u32} => _dS8(14,d,15) @ _imm32(p)
- mod.s8 {d: reg_dst}, *#{p: u32} => _dS8(15,d,15) @ _imm32(p)
- neg.s8 {d: reg_dst}, *#{p: u32} => _dS8(16,d,15) @ _imm32(p)
- not.s8 {d: reg_dst}, {s: reg_src} => _dS8(17,d,s) @ _imm16(0) ;~
- nnd.s8 {d: reg_dst}, {s: reg_src} => _dS8(18,d,s) @ _imm16(0) ;& ~
- and.s8 {d: reg_dst}, {s: reg_src} => _dS8(19,d,s) @ _imm16(0) ;&
- nor.s8 {d: reg_dst}, {s: reg_src} => _dS8(20,d,s) @ _imm16(0) ;| ~
- ior.s8 {d: reg_dst}, {s: reg_src} => _dS8(21,d,s) @ _imm16(0) ;|
- xor.s8 {d: reg_dst}, {s: reg_src} => _dS8(22,d,s) @ _imm16(0) ;^
- shl.s8 {d: reg_dst}, {s: reg_src} => _dS8(23,d,s) @ _imm16(0) ;<<
- shr.s8 {d: reg_dst}, {s: reg_src} => _dS8(24,d,s) @ _imm16(0) ;>>
- rol.s8 {d: reg_dst}, {s: reg_src} => _dS8(25,d,s) @ _imm16(0) ;rotate left
- ror.s8 {d: reg_dst}, {s: reg_src} => _dS8(26,d,s) @ _imm16(0) ;rotate right
- ext.s8 {d: reg_dst}, {s: reg_src} => _dS8(27,d,s) @ _imm16(0) ;sign extension
- not.s8 {d: reg_dst}, #{v: s8} => _dS8(17,d, 7) @ _imm8(v)
- nnd.s8 {d: reg_dst}, #{v: s8} => _dS8(18,d, 7) @ _imm8(v)
- and.s8 {d: reg_dst}, #{v: s8} => _dS8(19,d, 7) @ _imm8(v)
- nor.s8 {d: reg_dst}, #{v: s8} => _dS8(20,d, 7) @ _imm8(v)
- ior.s8 {d: reg_dst}, #{v: s8} => _dS8(21,d, 7) @ _imm8(v)
- xor.s8 {d: reg_dst}, #{v: s8} => _dS8(22,d, 7) @ _imm8(v)
- shl.s8 {d: reg_dst}, #{v: s8} => _dS8(23,d, 7) @ _imm8(v)
- shr.s8 {d: reg_dst}, #{v: s8} => _dS8(24,d, 7) @ _imm8(v)
- rol.s8 {d: reg_dst}, #{v: s8} => _dS8(25,d, 7) @ _imm8(v)
- ror.s8 {d: reg_dst}, #{v: s8} => _dS8(26,d, 7) @ _imm8(v)
- ext.s8 {d: reg_dst}, #{v: s8} => _dS8(27,d, 7) @ _imm8(v)
- not.s8 {d: reg_dst}, *#{p: u32} => _dS8(17,d,15) @ _imm32(p)
- nnd.s8 {d: reg_dst}, *#{p: u32} => _dS8(18,d,15) @ _imm32(p)
- and.s8 {d: reg_dst}, *#{p: u32} => _dS8(19,d,15) @ _imm32(p)
- nor.s8 {d: reg_dst}, *#{p: u32} => _dS8(20,d,15) @ _imm32(p)
- ior.s8 {d: reg_dst}, *#{p: u32} => _dS8(21,d,15) @ _imm32(p)
- xor.s8 {d: reg_dst}, *#{p: u32} => _dS8(22,d,15) @ _imm32(p)
- shl.s8 {d: reg_dst}, *#{p: u32} => _dS8(23,d,15) @ _imm32(p)
- shr.s8 {d: reg_dst}, *#{p: u32} => _dS8(24,d,15) @ _imm32(p)
- rol.s8 {d: reg_dst}, *#{p: u32} => _dS8(25,d,15) @ _imm32(p)
- ror.s8 {d: reg_dst}, *#{p: u32} => _dS8(26,d,15) @ _imm32(p)
- ext.s8 {d: reg_dst}, *#{p: u32} => _dS8(27,d,15) @ _imm32(p)
- jfn.s8 {s: reg_src} => _dS8(28,0,s) @ _imm16(0)
- jfn.s8 #{v: s8} => _dS8(28,0, 7) @ _imm8(v)
- jfn.s8 *#{p: u32} => _dS8(28,0,15) @ _imm32(p)
- }
- #fn _dU16(op, dst, src) => 0b001`3 @ op`5 @ dst`4 @ src`4
- #ruledef datatype_u16 { ;data = 0b001
- brk.u16 => _dU16(0,0,0) @ _imm16(0) ;(tbd)
- mov.u16 {d: reg_dst}, {s: reg_src} => _dU16(1,d,s) @ _imm16(0) ;d = s
- cmp.u16 {d: reg_dst}, {s: reg_src} => _dU16(2,d,s) @ _imm16(0) ;compare d and s
- mov.u16 {d: reg_dst}, #{v: u16} => _dU16(1,d, 7) @ _imm16(v)
- cmp.u16 {d: reg_dst}, #{v: u16} => _dU16(2,d, 7) @ _imm16(v)
- mov.u16 {d: reg_dst}, *#{p: u32} => _dU16(1,d,15) @ _imm32(p)
- cmp.u16 {d: reg_dst}, *#{p: u32} => _dU16(2,d,15) @ _imm32(p)
- jmp.u16 {s: reg_src} => _dU16(3,0,s) @ _imm16(0) ;unconditional jump to s
- jsr.u16 {s: reg_src} => _dU16(4,0,s) @ _imm16(0) ;jump to subroutine in s
- jmp.u16 #{v: u16} => _dU16(3,0, 7) @ _imm16(v)
- jsr.u16 #{v: u16} => _dU16(4,0, 7) @ _imm16(v)
- jmp.u16 *#{p: u32} => _dU16(3,0,15) @ _imm32(p)
- jsr.u16 *#{p: u32} => _dU16(4,0,15) @ _imm32(p)
- sld.u16 {d: reg_dst}, {s: reg_src} => _dU16(5,d, s) @ _imm16(0) ;load to d from stack offset (s16 s offset, relative to sp)
- sst.u16 {d: reg_dst}, {s: reg_src} => _dU16(6,d, s) @ _imm16(0) ;store d to stack offset (s16 s, relative to sp)
- sld.u16 {d: reg_dst}, #{v: s16} => _dU16(5,d, 7) @ _imm16(v)
- sst.u16 {d: reg_dst}, #{v: s16} => _dU16(6,d, 7) @ _imm16(v)
- sld.u16 {d: reg_dst}, *#{p: u32} => _dU16(5,d,15) @ _imm32(p)
- sst.u16 {d: reg_dst}, *#{p: u32} => _dU16(6,d,15) @ _imm32(p)
- sph.u16 {s: reg_src} => _dU16(7,0,s) @ _imm16(0) ;push s to stack
- sph.u16 #{v: u16} => _dU16(7,0, 7) @ _imm16(v)
- sph.u16 *#{p: u32} => _dU16(7,0,15) @ _imm32(p)
- spl.u16 {d: reg_dst} => _dU16(8,d,0) @ _imm16(0) ;pull from stack into d
- inc.u16 {d: reg_dst} => _dU16( 9,d,0) @ _imm16(0) ;++d
- dec.u16 {d: reg_dst} => _dU16(10,d,0) @ _imm16(0) ;--d
- add.u16 {d: reg_dst}, {s: reg_src} => _dU16(11,d,s) @ _imm16(0) ;d += s
- sub.u16 {d: reg_dst}, {s: reg_src} => _dU16(12,d,s) @ _imm16(0) ;d -= s
- mul.u16 {d: reg_dst}, {s: reg_src} => _dU16(13,d,s) @ _imm16(0) ;d *= s
- div.u16 {d: reg_dst}, {s: reg_src} => _dU16(14,d,s) @ _imm16(0) ;d /= s
- mod.u16 {d: reg_dst}, {s: reg_src} => _dU16(15,d,s) @ _imm16(0) ;d %= s
- neg.u16 {d: reg_dst}, {s: reg_src} => _dU16(16,d,s) @ _imm16(0) ;d = -s
- add.u16 {d: reg_dst}, #{v: u16} => _dU16(11,d, 7) @ _imm16(v)
- sub.u16 {d: reg_dst}, #{v: u16} => _dU16(12,d, 7) @ _imm16(v)
- mul.u16 {d: reg_dst}, #{v: u16} => _dU16(13,d, 7) @ _imm16(v)
- div.u16 {d: reg_dst}, #{v: u16} => _dU16(14,d, 7) @ _imm16(v)
- mod.u16 {d: reg_dst}, #{v: u16} => _dU16(15,d, 7) @ _imm16(v)
- neg.u16 {d: reg_dst}, #{v: u16} => _dU16(16,d, 7) @ _imm16(v)
- add.u16 {d: reg_dst}, *#{p: u32} => _dU16(11,d,15) @ _imm32(p)
- sub.u16 {d: reg_dst}, *#{p: u32} => _dU16(12,d,15) @ _imm32(p)
- mul.u16 {d: reg_dst}, *#{p: u32} => _dU16(13,d,15) @ _imm32(p)
- div.u16 {d: reg_dst}, *#{p: u32} => _dU16(14,d,15) @ _imm32(p)
- mod.u16 {d: reg_dst}, *#{p: u32} => _dU16(15,d,15) @ _imm32(p)
- neg.u16 {d: reg_dst}, *#{p: u32} => _dU16(16,d,15) @ _imm32(p)
- not.u16 {d: reg_dst}, {s: reg_src} => _dU16(17,d,s) @ _imm16(0) ;~
- nnd.u16 {d: reg_dst}, {s: reg_src} => _dU16(18,d,s) @ _imm16(0) ;& ~
- and.u16 {d: reg_dst}, {s: reg_src} => _dU16(19,d,s) @ _imm16(0) ;&
- nor.u16 {d: reg_dst}, {s: reg_src} => _dU16(20,d,s) @ _imm16(0) ;| ~
- ior.u16 {d: reg_dst}, {s: reg_src} => _dU16(21,d,s) @ _imm16(0) ;|
- xor.u16 {d: reg_dst}, {s: reg_src} => _dU16(22,d,s) @ _imm16(0) ;^
- shl.u16 {d: reg_dst}, {s: reg_src} => _dU16(23,d,s) @ _imm16(0) ;<<
- shr.u16 {d: reg_dst}, {s: reg_src} => _dU16(24,d,s) @ _imm16(0) ;>>
- rol.u16 {d: reg_dst}, {s: reg_src} => _dU16(25,d,s) @ _imm16(0) ;rotate left
- ror.u16 {d: reg_dst}, {s: reg_src} => _dU16(26,d,s) @ _imm16(0) ;rotate right
- ext.u16 {d: reg_dst}, {s: reg_src} => _dU16(27,d,s) @ _imm16(0) ;sign extension
- not.u16 {d: reg_dst}, #{v: u16} => _dU16(17,d, 7) @ _imm16(v)
- nnd.u16 {d: reg_dst}, #{v: u16} => _dU16(18,d, 7) @ _imm16(v)
- and.u16 {d: reg_dst}, #{v: u16} => _dU16(19,d, 7) @ _imm16(v)
- nor.u16 {d: reg_dst}, #{v: u16} => _dU16(20,d, 7) @ _imm16(v)
- ior.u16 {d: reg_dst}, #{v: u16} => _dU16(21,d, 7) @ _imm16(v)
- xor.u16 {d: reg_dst}, #{v: u16} => _dU16(22,d, 7) @ _imm16(v)
- shl.u16 {d: reg_dst}, #{v: u16} => _dU16(23,d, 7) @ _imm16(v)
- shr.u16 {d: reg_dst}, #{v: u16} => _dU16(24,d, 7) @ _imm16(v)
- rol.u16 {d: reg_dst}, #{v: u16} => _dU16(25,d, 7) @ _imm16(v)
- ror.u16 {d: reg_dst}, #{v: u16} => _dU16(26,d, 7) @ _imm16(v)
- ext.u16 {d: reg_dst}, #{v: u16} => _dU16(27,d, 7) @ _imm16(v)
- not.u16 {d: reg_dst}, *#{p: u32} => _dU16(17,d,15) @ _imm32(p)
- nnd.u16 {d: reg_dst}, *#{p: u32} => _dU16(18,d,15) @ _imm32(p)
- and.u16 {d: reg_dst}, *#{p: u32} => _dU16(19,d,15) @ _imm32(p)
- nor.u16 {d: reg_dst}, *#{p: u32} => _dU16(20,d,15) @ _imm32(p)
- ior.u16 {d: reg_dst}, *#{p: u32} => _dU16(21,d,15) @ _imm32(p)
- xor.u16 {d: reg_dst}, *#{p: u32} => _dU16(22,d,15) @ _imm32(p)
- shl.u16 {d: reg_dst}, *#{p: u32} => _dU16(23,d,15) @ _imm32(p)
- shr.u16 {d: reg_dst}, *#{p: u32} => _dU16(24,d,15) @ _imm32(p)
- rol.u16 {d: reg_dst}, *#{p: u32} => _dU16(25,d,15) @ _imm32(p)
- ror.u16 {d: reg_dst}, *#{p: u32} => _dU16(26,d,15) @ _imm32(p)
- ext.u16 {d: reg_dst}, *#{p: u32} => _dU16(27,d,15) @ _imm32(p)
- jfn.u16 {s: reg_src} => _dU16(28,0,s) @ _imm16(0)
- jfn.u16 #{v: u16} => _dU16(28,0, 7) @ _imm16(v)
- jfn.u16 *#{p: u32} => _dU16(28,0,15) @ _imm32(p)
- }
- #fn _dS16(op, dst, src) => 0b101`3 @ op`5 @ dst`4 @ src`4
- #ruledef datatype_s16 { ;data = 0b101
- brk.s16 => _dS16(0,0,0) @ _imm16(0) ;(tbd)
- mov.s16 {d: reg_dst}, {s: reg_src} => _dS16(1,d,s) @ _imm16(0) ;d = s
- cmp.s16 {d: reg_dst}, {s: reg_src} => _dS16(2,d,s) @ _imm16(0) ;compare d and s
- mov.s16 {d: reg_dst}, #{v: s16} => _dS16(1,d, 7) @ _imm16(v)
- cmp.s16 {d: reg_dst}, #{v: s16} => _dS16(2,d, 7) @ _imm16(v)
- mov.s16 {d: reg_dst}, *#{p: u32} => _dS16(1,d,15) @ _imm32(p)
- cmp.s16 {d: reg_dst}, *#{p: u32} => _dS16(2,d,15) @ _imm32(p)
- jmp.s16 {s: reg_src} => _dS16(3,0,s) @ _imm16(0) ;unconditional jump to s
- jsr.s16 {s: reg_src} => _dS16(4,0,s) @ _imm16(0) ;jump to subroutine in s
- jmp.s16 #{v: s16} => _dS16(3,0, 7) @ _imm16(v)
- jsr.s16 #{v: s16} => _dS16(4,0, 7) @ _imm16(v)
- jmp.s16 *#{p: u32} => _dS16(3,0,15) @ _imm32(p)
- jsr.s16 *#{p: u32} => _dS16(4,0,15) @ _imm32(p)
- sld.s16 {d: reg_dst}, {s: reg_src} => _dS16(5,d, s) @ _imm16(0) ;load to d from stack offset (s16 s offset, relative to sp)
- sst.s16 {d: reg_dst}, {s: reg_src} => _dS16(6,d, s) @ _imm16(0) ;store d to stack offset (s16 s, relative to sp)
- sld.s16 {d: reg_dst}, #{v: s16} => _dS16(5,d, 7) @ _imm16(v)
- sst.s16 {d: reg_dst}, #{v: s16} => _dS16(6,d, 7) @ _imm16(v)
- sld.s16 {d: reg_dst}, *#{p: u32} => _dS16(5,d,15) @ _imm32(p)
- sst.s16 {d: reg_dst}, *#{p: u32} => _dS16(6,d,15) @ _imm32(p)
- sph.s16 {s: reg_src} => _dS16(7,0,s) @ _imm16(0) ;push s to stack
- sph.s16 #{v: s16} => _dS16(7,0, 7) @ _imm16(v)
- sph.s16 *#{p: u32} => _dS16(7,0,15) @ _imm32(p)
- spl.s16 {d: reg_dst} => _dS16(8,d,0) @ _imm16(0) ;pull from stack into d
- inc.s16 {d: reg_dst} => _dS16( 9,d,0) @ _imm16(0) ;++d
- dec.s16 {d: reg_dst} => _dS16(10,d,0) @ _imm16(0) ;--d
- add.s16 {d: reg_dst}, {s: reg_src} => _dS16(11,d,s) @ _imm16(0) ;d += s
- sub.s16 {d: reg_dst}, {s: reg_src} => _dS16(12,d,s) @ _imm16(0) ;d -= s
- mul.s16 {d: reg_dst}, {s: reg_src} => _dS16(13,d,s) @ _imm16(0) ;d *= s
- div.s16 {d: reg_dst}, {s: reg_src} => _dS16(14,d,s) @ _imm16(0) ;d /= s
- mod.s16 {d: reg_dst}, {s: reg_src} => _dS16(15,d,s) @ _imm16(0) ;d %= s
- neg.s16 {d: reg_dst}, {s: reg_src} => _dS16(16,d,s) @ _imm16(0) ;d = -s
- add.s16 {d: reg_dst}, #{v: s16} => _dS16(11,d, 7) @ _imm16(v)
- sub.s16 {d: reg_dst}, #{v: s16} => _dS16(12,d, 7) @ _imm16(v)
- mul.s16 {d: reg_dst}, #{v: s16} => _dS16(13,d, 7) @ _imm16(v)
- div.s16 {d: reg_dst}, #{v: s16} => _dS16(14,d, 7) @ _imm16(v)
- mod.s16 {d: reg_dst}, #{v: s16} => _dS16(15,d, 7) @ _imm16(v)
- neg.s16 {d: reg_dst}, #{v: s16} => _dS16(16,d, 7) @ _imm16(v)
- add.s16 {d: reg_dst}, *#{p: u32} => _dS16(11,d,15) @ _imm32(p)
- sub.s16 {d: reg_dst}, *#{p: u32} => _dS16(12,d,15) @ _imm32(p)
- mul.s16 {d: reg_dst}, *#{p: u32} => _dS16(13,d,15) @ _imm32(p)
- div.s16 {d: reg_dst}, *#{p: u32} => _dS16(14,d,15) @ _imm32(p)
- mod.s16 {d: reg_dst}, *#{p: u32} => _dS16(15,d,15) @ _imm32(p)
- neg.s16 {d: reg_dst}, *#{p: u32} => _dS16(16,d,15) @ _imm32(p)
- not.s16 {d: reg_dst}, {s: reg_src} => _dS16(17,d,s) @ _imm16(0) ;~
- nnd.s16 {d: reg_dst}, {s: reg_src} => _dS16(18,d,s) @ _imm16(0) ;& ~
- and.s16 {d: reg_dst}, {s: reg_src} => _dS16(19,d,s) @ _imm16(0) ;&
- nor.s16 {d: reg_dst}, {s: reg_src} => _dS16(20,d,s) @ _imm16(0) ;| ~
- ior.s16 {d: reg_dst}, {s: reg_src} => _dS16(21,d,s) @ _imm16(0) ;|
- xor.s16 {d: reg_dst}, {s: reg_src} => _dS16(22,d,s) @ _imm16(0) ;^
- shl.s16 {d: reg_dst}, {s: reg_src} => _dS16(23,d,s) @ _imm16(0) ;<<
- shr.s16 {d: reg_dst}, {s: reg_src} => _dS16(24,d,s) @ _imm16(0) ;>>
- rol.s16 {d: reg_dst}, {s: reg_src} => _dS16(25,d,s) @ _imm16(0) ;rotate left
- ror.s16 {d: reg_dst}, {s: reg_src} => _dS16(26,d,s) @ _imm16(0) ;rotate right
- ext.s16 {d: reg_dst}, {s: reg_src} => _dS16(27,d,s) @ _imm16(0) ;sign extension
- not.s16 {d: reg_dst}, #{v: s16} => _dS16(17,d, 7) @ _imm16(v)
- nnd.s16 {d: reg_dst}, #{v: s16} => _dS16(18,d, 7) @ _imm16(v)
- and.s16 {d: reg_dst}, #{v: s16} => _dS16(19,d, 7) @ _imm16(v)
- nor.s16 {d: reg_dst}, #{v: s16} => _dS16(20,d, 7) @ _imm16(v)
- ior.s16 {d: reg_dst}, #{v: s16} => _dS16(21,d, 7) @ _imm16(v)
- xor.s16 {d: reg_dst}, #{v: s16} => _dS16(22,d, 7) @ _imm16(v)
- shl.s16 {d: reg_dst}, #{v: s16} => _dS16(23,d, 7) @ _imm16(v)
- shr.s16 {d: reg_dst}, #{v: s16} => _dS16(24,d, 7) @ _imm16(v)
- rol.s16 {d: reg_dst}, #{v: s16} => _dS16(25,d, 7) @ _imm16(v)
- ror.s16 {d: reg_dst}, #{v: s16} => _dS16(26,d, 7) @ _imm16(v)
- ext.s16 {d: reg_dst}, #{v: s16} => _dS16(27,d, 7) @ _imm16(v)
- not.s16 {d: reg_dst}, *#{p: u32} => _dS16(17,d,15) @ _imm32(p)
- nnd.s16 {d: reg_dst}, *#{p: u32} => _dS16(18,d,15) @ _imm32(p)
- and.s16 {d: reg_dst}, *#{p: u32} => _dS16(19,d,15) @ _imm32(p)
- nor.s16 {d: reg_dst}, *#{p: u32} => _dS16(20,d,15) @ _imm32(p)
- ior.s16 {d: reg_dst}, *#{p: u32} => _dS16(21,d,15) @ _imm32(p)
- xor.s16 {d: reg_dst}, *#{p: u32} => _dS16(22,d,15) @ _imm32(p)
- shl.s16 {d: reg_dst}, *#{p: u32} => _dS16(23,d,15) @ _imm32(p)
- shr.s16 {d: reg_dst}, *#{p: u32} => _dS16(24,d,15) @ _imm32(p)
- rol.s16 {d: reg_dst}, *#{p: u32} => _dS16(25,d,15) @ _imm32(p)
- ror.s16 {d: reg_dst}, *#{p: u32} => _dS16(26,d,15) @ _imm32(p)
- ext.s16 {d: reg_dst}, *#{p: u32} => _dS16(27,d,15) @ _imm32(p)
- jfn.s16 {s: reg_src} => _dS16(28,0,s) @ _imm16(0)
- jfn.s16 #{v: s16} => _dS16(28,0, 7) @ _imm16(v)
- jfn.s16 *#{p: u32} => _dS16(29,0,15) @ _imm32(p)
- }
- #fn _dU32(op, dst, src) => 0b010`3 @ op`5 @ dst`4 @ src`4
- #ruledef datatype_u32 { ;data = 0b010
- brk.u32 => _dU32(0,0,0) @ _imm16(0) ;(tbd)
- ;brk defaults to u32
- brk => _dU32(0,0,0) @ _imm16(0)
- mov.u32 {d: reg_dst}, {s: reg_src} => _dU32(1,d,s) @ _imm16(0) ;d = s
- cmp.u32 {d: reg_dst}, {s: reg_src} => _dU32(2,d,s) @ _imm16(0) ;compare d and s
- mov.u32 {d: reg_dst}, #{v: u32} => _dU32(1,d, 7) @ _imm32(v)
- cmp.u32 {d: reg_dst}, #{v: u32} => _dU32(2,d, 7) @ _imm32(v)
- mov.u32 {d: reg_dst}, *#{p: u32} => _dU32(1,d,15) @ _imm32(p)
- cmp.u32 {d: reg_dst}, *#{p: u32} => _dU32(2,d,15) @ _imm32(p)
- jmp.u32 {s: reg_src} => _dU32(3,0,s) @ _imm16(0) ;unconditional jump to s
- jsr.u32 {s: reg_src} => _dU32(4,0,s) @ _imm16(0) ;jump to subroutine in s
- jmp.u32 #{v: u32} => _dU32(3,0, 7) @ _imm32(v)
- jsr.u32 #{v: u32} => _dU32(4,0, 7) @ _imm32(v)
- jmp.u32 *#{p: u32} => _dU32(3,0,15) @ _imm32(p)
- jsr.u32 *#{p: u32} => _dU32(4,0,15) @ _imm32(p)
- ;jmp and jsr are naturally u32
- jmp {s: reg_src} => _dU32(3,0,s) @ _imm16(0)
- jsr {s: reg_src} => _dU32(4,0,s) @ _imm16(0)
- jmp #{v: u32} => _dU32(3,0, 7) @ _imm32(v)
- jsr #{v: u32} => _dU32(4,0, 7) @ _imm32(v)
- jmp *#{p: u32} => _dU32(3,0,15) @ _imm32(p)
- jsr *#{p: u32} => _dU32(4,0,15) @ _imm32(p)
- sld.u32 {d: reg_dst}, {s: reg_src} => _dU32(5,d, s) @ _imm16(0) ;load to d from stack offset (s16 s offset, relative to sp)
- sst.u32 {d: reg_dst}, {s: reg_src} => _dU32(6,d, s) @ _imm16(0) ;store d to stack offset (s16 s, relative to sp)
- sld.u32 {d: reg_dst}, #{v: s16} => _dU32(5,d, 7) @ _imm16(v)
- sst.u32 {d: reg_dst}, #{v: s16} => _dU32(6,d, 7) @ _imm16(v)
- sld.u32 {d: reg_dst}, *#{p: u32} => _dU32(5,d,15) @ _imm32(p)
- sst.u32 {d: reg_dst}, *#{p: u32} => _dU32(6,d,15) @ _imm32(p)
- sph.u32 {s: reg_src} => _dU32(7,0,s) @ _imm16(0) ;push s to stack
- sph.u32 #{v: u32} => _dU32(7,0, 7) @ _imm32(v)
- sph.u32 *#{p: u32} => _dU32(7,0,15) @ _imm32(p)
- spl.u32 {d: reg_dst} => _dU32(8,d,0) @ _imm16(0) ;pull from stack into d
- inc.u32 {d: reg_dst} => _dU32( 9,d,0) @ _imm16(0) ;++d
- dec.u32 {d: reg_dst} => _dU32(10,d,0) @ _imm16(0) ;--d
- add.u32 {d: reg_dst}, {s: reg_src} => _dU32(11,d,s) @ _imm16(0) ;d += s
- sub.u32 {d: reg_dst}, {s: reg_src} => _dU32(12,d,s) @ _imm16(0) ;d -= s
- mul.u32 {d: reg_dst}, {s: reg_src} => _dU32(13,d,s) @ _imm16(0) ;d *= s
- div.u32 {d: reg_dst}, {s: reg_src} => _dU32(14,d,s) @ _imm16(0) ;d /= s
- mod.u32 {d: reg_dst}, {s: reg_src} => _dU32(15,d,s) @ _imm16(0) ;d %= s
- neg.u32 {d: reg_dst}, {s: reg_src} => _dU32(16,d,s) @ _imm16(0) ;d = -s
- add.u32 {d: reg_dst}, #{v: u32} => _dU32(11,d, 7) @ _imm32(v)
- sub.u32 {d: reg_dst}, #{v: u32} => _dU32(12,d, 7) @ _imm32(v)
- mul.u32 {d: reg_dst}, #{v: u32} => _dU32(13,d, 7) @ _imm32(v)
- div.u32 {d: reg_dst}, #{v: u32} => _dU32(14,d, 7) @ _imm32(v)
- mod.u32 {d: reg_dst}, #{v: u32} => _dU32(15,d, 7) @ _imm32(v)
- neg.u32 {d: reg_dst}, #{v: u32} => _dU32(16,d, 7) @ _imm32(v)
- add.u32 {d: reg_dst}, *#{p: u32} => _dU32(11,d,15) @ _imm32(p)
- sub.u32 {d: reg_dst}, *#{p: u32} => _dU32(12,d,15) @ _imm32(p)
- mul.u32 {d: reg_dst}, *#{p: u32} => _dU32(13,d,15) @ _imm32(p)
- div.u32 {d: reg_dst}, *#{p: u32} => _dU32(14,d,15) @ _imm32(p)
- mod.u32 {d: reg_dst}, *#{p: u32} => _dU32(15,d,15) @ _imm32(p)
- neg.u32 {d: reg_dst}, *#{p: u32} => _dU32(16,d,15) @ _imm32(p)
- not.u32 {d: reg_dst}, {s: reg_src} => _dU32(17,d,s) @ _imm16(0) ;~
- nnd.u32 {d: reg_dst}, {s: reg_src} => _dU32(18,d,s) @ _imm16(0) ;& ~
- and.u32 {d: reg_dst}, {s: reg_src} => _dU32(19,d,s) @ _imm16(0) ;&
- nor.u32 {d: reg_dst}, {s: reg_src} => _dU32(20,d,s) @ _imm16(0) ;| ~
- ior.u32 {d: reg_dst}, {s: reg_src} => _dU32(21,d,s) @ _imm16(0) ;|
- xor.u32 {d: reg_dst}, {s: reg_src} => _dU32(22,d,s) @ _imm16(0) ;^
- shl.u32 {d: reg_dst}, {s: reg_src} => _dU32(23,d,s) @ _imm16(0) ;<<
- shr.u32 {d: reg_dst}, {s: reg_src} => _dU32(24,d,s) @ _imm16(0) ;>>
- rol.u32 {d: reg_dst}, {s: reg_src} => _dU32(25,d,s) @ _imm16(0) ;rotate left
- ror.u32 {d: reg_dst}, {s: reg_src} => _dU32(26,d,s) @ _imm16(0) ;rotate right
- ext.u32 {d: reg_dst}, {s: reg_src} => _dU32(27,d,s) @ _imm16(0) ;sign extension
- not.u32 {d: reg_dst}, #{v: u32} => _dU32(17,d, 7) @ _imm32(v)
- nnd.u32 {d: reg_dst}, #{v: u32} => _dU32(18,d, 7) @ _imm32(v)
- and.u32 {d: reg_dst}, #{v: u32} => _dU32(19,d, 7) @ _imm32(v)
- nor.u32 {d: reg_dst}, #{v: u32} => _dU32(20,d, 7) @ _imm32(v)
- ior.u32 {d: reg_dst}, #{v: u32} => _dU32(21,d, 7) @ _imm32(v)
- xor.u32 {d: reg_dst}, #{v: u32} => _dU32(22,d, 7) @ _imm32(v)
- shl.u32 {d: reg_dst}, #{v: u32} => _dU32(23,d, 7) @ _imm32(v)
- shr.u32 {d: reg_dst}, #{v: u32} => _dU32(24,d, 7) @ _imm32(v)
- rol.u32 {d: reg_dst}, #{v: u32} => _dU32(25,d, 7) @ _imm32(v)
- ror.u32 {d: reg_dst}, #{v: u32} => _dU32(26,d, 7) @ _imm32(v)
- ext.u32 {d: reg_dst}, #{v: u32} => _dU32(27,d, 7) @ _imm32(v)
- not.u32 {d: reg_dst}, *#{p: u32} => _dU32(17,d,15) @ _imm32(p)
- nnd.u32 {d: reg_dst}, *#{p: u32} => _dU32(18,d,15) @ _imm32(p)
- and.u32 {d: reg_dst}, *#{p: u32} => _dU32(19,d,15) @ _imm32(p)
- nor.u32 {d: reg_dst}, *#{p: u32} => _dU32(20,d,15) @ _imm32(p)
- ior.u32 {d: reg_dst}, *#{p: u32} => _dU32(21,d,15) @ _imm32(p)
- xor.u32 {d: reg_dst}, *#{p: u32} => _dU32(22,d,15) @ _imm32(p)
- shl.u32 {d: reg_dst}, *#{p: u32} => _dU32(23,d,15) @ _imm32(p)
- shr.u32 {d: reg_dst}, *#{p: u32} => _dU32(24,d,15) @ _imm32(p)
- rol.u32 {d: reg_dst}, *#{p: u32} => _dU32(25,d,15) @ _imm32(p)
- ror.u32 {d: reg_dst}, *#{p: u32} => _dU32(26,d,15) @ _imm32(p)
- ext.u32 {d: reg_dst}, *#{p: u32} => _dU32(27,d,15) @ _imm32(p)
- jfn.u32 {s: reg_src} => _dU32(28,0,s) @ _imm16(0)
- jfn.u32 #{v: u32} => _dU32(28,0, 7) @ _imm32(v)
- jfn.u32 *#{p: u32} => _dU32(28,0,15) @ _imm32(p)
- ;jfn are naturally u32
- jfn {s: reg_src} => _dU32(28,0,s) @ _imm16(0)
- jfn #{v: u32} => _dU32(28,0, 7) @ _imm32(v)
- jfn *#{p: u32} => _dU32(28,0,15) @ _imm32(p)
- }
- #fn _dS32(op, dst, src) => 0b110`3 @ op`5 @ dst`4 @ src`4
- #ruledef datatype_s32 { ;data = 0b110
- brk.s32 => _dS32(0,0,0) @ _imm16(0) ;(tbd)
- mov.s32 {d: reg_dst}, {s: reg_src} => _dS32(1,d,s) @ _imm16(0) ;d = s
- cmp.s32 {d: reg_dst}, {s: reg_src} => _dS32(2,d,s) @ _imm16(0) ;compare d and s
- mov.s32 {d: reg_dst}, #{v: s32} => _dS32(1,d, 7) @ _imm32(v)
- cmp.s32 {d: reg_dst}, #{v: s32} => _dS32(2,d, 7) @ _imm32(v)
- mov.s32 {d: reg_dst}, *#{p: u32} => _dS32(1,d,15) @ _imm32(p)
- cmp.s32 {d: reg_dst}, *#{p: u32} => _dS32(2,d,15) @ _imm32(p)
- jmp.s32 {s: reg_src} => _dS32(3,0,s) @ _imm16(0) ;unconditional jump to s
- jsr.s32 {s: reg_src} => _dS32(4,0,s) @ _imm16(0) ;jump to subroutine in s
- jmp.s32 #{v: s32} => _dS32(3,0, 7) @ _imm32(v)
- jsr.s32 #{v: s32} => _dS32(4,0, 7) @ _imm32(v)
- jmp.s32 *#{p: u32} => _dS32(3,0,15) @ _imm32(p)
- jsr.s32 *#{p: u32} => _dS32(4,0,15) @ _imm32(p)
- sld.s32 {d: reg_dst}, {s: reg_src} => _dS32(5,d, s) @ _imm16(0) ;load to d from stack offset (s16 s offset, relative to sp)
- sst.s32 {d: reg_dst}, {s: reg_src} => _dS32(6,d, s) @ _imm16(0) ;store d to stack offset (s16 s, relative to sp)
- sld.s32 {d: reg_dst}, #{v: s16} => _dS32(5,d, 7) @ _imm16(v)
- sst.s32 {d: reg_dst}, #{v: s16} => _dS32(6,d, 7) @ _imm16(v)
- sld.s32 {d: reg_dst}, *#{p: u32} => _dS32(5,d,15) @ _imm32(p)
- sst.s32 {d: reg_dst}, *#{p: u32} => _dS32(6,d,15) @ _imm32(p)
- sph.s32 {s: reg_src} => _dS32(7,0,s) @ _imm16(0) ;push s to stack
- sph.s32 #{v: s32} => _dS32(7,0, 7) @ _imm32(v)
- sph.s32 *#{p: u32} => _dS32(7,0,15) @ _imm32(p)
- spl.s32 {d: reg_dst} => _dS32(8,d,0) @ _imm16(0) ;pull from stack into d
- inc.s32 {d: reg_dst} => _dS32( 9,d,0) @ _imm16(0) ;++d
- dec.s32 {d: reg_dst} => _dS32(10,d,0) @ _imm16(0) ;--d
- add.s32 {d: reg_dst}, {s: reg_src} => _dS32(11,d,s) @ _imm16(0) ;d += s
- sub.s32 {d: reg_dst}, {s: reg_src} => _dS32(12,d,s) @ _imm16(0) ;d -= s
- mul.s32 {d: reg_dst}, {s: reg_src} => _dS32(13,d,s) @ _imm16(0) ;d *= s
- div.s32 {d: reg_dst}, {s: reg_src} => _dS32(14,d,s) @ _imm16(0) ;d /= s
- mod.s32 {d: reg_dst}, {s: reg_src} => _dS32(15,d,s) @ _imm16(0) ;d %= s
- neg.s32 {d: reg_dst}, {s: reg_src} => _dS32(16,d,s) @ _imm16(0) ;d = -s
- add.s32 {d: reg_dst}, #{v: s32} => _dS32(11,d, 7) @ _imm32(v)
- sub.s32 {d: reg_dst}, #{v: s32} => _dS32(12,d, 7) @ _imm32(v)
- mul.s32 {d: reg_dst}, #{v: s32} => _dS32(13,d, 7) @ _imm32(v)
- div.s32 {d: reg_dst}, #{v: s32} => _dS32(14,d, 7) @ _imm32(v)
- mod.s32 {d: reg_dst}, #{v: s32} => _dS32(15,d, 7) @ _imm32(v)
- neg.s32 {d: reg_dst}, #{v: s32} => _dS32(16,d, 7) @ _imm32(v)
- add.s32 {d: reg_dst}, *#{p: u32} => _dS32(11,d,15) @ _imm32(p)
- sub.s32 {d: reg_dst}, *#{p: u32} => _dS32(12,d,15) @ _imm32(p)
- mul.s32 {d: reg_dst}, *#{p: u32} => _dS32(13,d,15) @ _imm32(p)
- div.s32 {d: reg_dst}, *#{p: u32} => _dS32(14,d,15) @ _imm32(p)
- mod.s32 {d: reg_dst}, *#{p: u32} => _dS32(15,d,15) @ _imm32(p)
- neg.s32 {d: reg_dst}, *#{p: u32} => _dS32(16,d,15) @ _imm32(p)
- not.s32 {d: reg_dst}, {s: reg_src} => _dS32(17,d,s) @ _imm16(0) ;~
- nnd.s32 {d: reg_dst}, {s: reg_src} => _dS32(18,d,s) @ _imm16(0) ;& ~
- and.s32 {d: reg_dst}, {s: reg_src} => _dS32(19,d,s) @ _imm16(0) ;&
- nor.s32 {d: reg_dst}, {s: reg_src} => _dS32(20,d,s) @ _imm16(0) ;| ~
- ior.s32 {d: reg_dst}, {s: reg_src} => _dS32(21,d,s) @ _imm16(0) ;|
- xor.s32 {d: reg_dst}, {s: reg_src} => _dS32(22,d,s) @ _imm16(0) ;^
- shl.s32 {d: reg_dst}, {s: reg_src} => _dS32(23,d,s) @ _imm16(0) ;<<
- shr.s32 {d: reg_dst}, {s: reg_src} => _dS32(24,d,s) @ _imm16(0) ;>>
- rol.s32 {d: reg_dst}, {s: reg_src} => _dS32(25,d,s) @ _imm16(0) ;rotate left
- ror.s32 {d: reg_dst}, {s: reg_src} => _dS32(26,d,s) @ _imm16(0) ;rotate right
- ext.s32 {d: reg_dst}, {s: reg_src} => _dS32(27,d,s) @ _imm16(0) ;sign extension
- not.s32 {d: reg_dst}, #{v: s32} => _dS32(17,d, 7) @ _imm32(v)
- nnd.s32 {d: reg_dst}, #{v: s32} => _dS32(18,d, 7) @ _imm32(v)
- and.s32 {d: reg_dst}, #{v: s32} => _dS32(19,d, 7) @ _imm32(v)
- nor.s32 {d: reg_dst}, #{v: s32} => _dS32(20,d, 7) @ _imm32(v)
- ior.s32 {d: reg_dst}, #{v: s32} => _dS32(21,d, 7) @ _imm32(v)
- xor.s32 {d: reg_dst}, #{v: s32} => _dS32(22,d, 7) @ _imm32(v)
- shl.s32 {d: reg_dst}, #{v: s32} => _dS32(23,d, 7) @ _imm32(v)
- shr.s32 {d: reg_dst}, #{v: s32} => _dS32(24,d, 7) @ _imm32(v)
- rol.s32 {d: reg_dst}, #{v: s32} => _dS32(25,d, 7) @ _imm32(v)
- ror.s32 {d: reg_dst}, #{v: s32} => _dS32(26,d, 7) @ _imm32(v)
- ext.s32 {d: reg_dst}, #{v: s32} => _dS32(27,d, 7) @ _imm32(v)
- not.s32 {d: reg_dst}, *#{p: u32} => _dS32(17,d,15) @ _imm32(p)
- nnd.s32 {d: reg_dst}, *#{p: u32} => _dS32(18,d,15) @ _imm32(p)
- and.s32 {d: reg_dst}, *#{p: u32} => _dS32(19,d,15) @ _imm32(p)
- nor.s32 {d: reg_dst}, *#{p: u32} => _dS32(20,d,15) @ _imm32(p)
- ior.s32 {d: reg_dst}, *#{p: u32} => _dS32(21,d,15) @ _imm32(p)
- xor.s32 {d: reg_dst}, *#{p: u32} => _dS32(22,d,15) @ _imm32(p)
- shl.s32 {d: reg_dst}, *#{p: u32} => _dS32(23,d,15) @ _imm32(p)
- shr.s32 {d: reg_dst}, *#{p: u32} => _dS32(24,d,15) @ _imm32(p)
- rol.s32 {d: reg_dst}, *#{p: u32} => _dS32(25,d,15) @ _imm32(p)
- ror.s32 {d: reg_dst}, *#{p: u32} => _dS32(26,d,15) @ _imm32(p)
- ext.s32 {d: reg_dst}, *#{p: u32} => _dS32(27,d,15) @ _imm32(p)
- jfn.s32 {s: reg_src} => _dS32(28,0,s) @ _imm16(0)
- jfn.s32 #{v: s32} => _dS32(28,0, 7) @ _imm32(v)
- jfn.s32 *#{p: u32} => _dS32(28,0,15) @ _imm32(p)
- }
- #fn _dImp(op, dst, src) => 0b011`3 @ op`5 @ dst`4 @ src`4
- #ruledef datatype_imp { ;data = 0b011
- nop => _dImp(0,0,0) @ _imm16(0) ;no operation
- srt {d: reg_dst}, {s: reg_src} => _dImp(1,d, s) @ _imm16(0) ;D = sqrtf(S)
- srt {d: reg_dst}, #{f: i32} => _dImp(1,d, 7) @ _imm32(f)
- srt {d: reg_dst}, *#{p: u32} => _dImp(1,d,15) @ _imm32(p)
- cpu {s: reg_src} => _dImp(2,0,s) @ _imm16(0) ;cpuid
- sys {s: reg_src} => _dImp(3,0,s) @ _imm16(0) ;syscall
- cpu #{v: u16} => _dImp(2,0, 7) @ _imm16(v)
- sys #{v: u16} => _dImp(3,0, 7) @ _imm16(v)
- cpu *#{p: u32} => _dImp(2,0,15) @ _imm32(p)
- sys *#{p: u32} => _dImp(3,0,15) @ _imm32(p)
- bnc {s: reg_src} => _dImp( 4,0,s) @ _imm16(0) ;branch to s if !negative
- bns {s: reg_src} => _dImp( 5,0,s) @ _imm16(0) ;branch to s if negative
- bzc {s: reg_src} => _dImp( 6,0,s) @ _imm16(0) ;branch to s if !zero
- bzs {s: reg_src} => _dImp( 7,0,s) @ _imm16(0) ;branch to s if zero
- blt {s: reg_src} => _dImp( 8,0,s) @ _imm16(0) ;branch to s d_prev< s_prev
- bgt {s: reg_src} => _dImp( 9,0,s) @ _imm16(0) ;branch to s d_prev> s_prev
- ble {s: reg_src} => _dImp(10,0,s) @ _imm16(0) ;branch to s d_prev<=s_prev
- bge {s: reg_src} => _dImp(11,0,s) @ _imm16(0) ;branch to s d_prev>=s_prev
- bne {s: reg_src} => _dImp(12,0,s) @ _imm16(0) ;branch to s d_prev!=s_prev
- beq {s: reg_src} => _dImp(13,0,s) @ _imm16(0) ;branch to s d_prev==s_prev
- bnc #{v: s16} => _dImp( 4,0, 7) @ _imm16(to_relative(v))
- bns #{v: s16} => _dImp( 5,0, 7) @ _imm16(to_relative(v))
- bzc #{v: s16} => _dImp( 6,0, 7) @ _imm16(to_relative(v))
- bzs #{v: s16} => _dImp( 7,0, 7) @ _imm16(to_relative(v))
- blt #{v: s16} => _dImp( 8,0, 7) @ _imm16(to_relative(v))
- bgt #{v: s16} => _dImp( 9,0, 7) @ _imm16(to_relative(v))
- ble #{v: s16} => _dImp(10,0, 7) @ _imm16(to_relative(v))
- bge #{v: s16} => _dImp(11,0, 7) @ _imm16(to_relative(v))
- bne #{v: s16} => _dImp(12,0, 7) @ _imm16(to_relative(v))
- beq #{v: s16} => _dImp(13,0, 7) @ _imm16(to_relative(v))
- bnc *#{p: u32} => _dImp( 4,0,15) @ _imm32(p)
- bns *#{p: u32} => _dImp( 5,0,15) @ _imm32(p)
- bzc *#{p: u32} => _dImp( 6,0,15) @ _imm32(p)
- bzs *#{p: u32} => _dImp( 7,0,15) @ _imm32(p)
- blt *#{p: u32} => _dImp( 8,0,15) @ _imm32(p)
- bgt *#{p: u32} => _dImp( 9,0,15) @ _imm32(p)
- ble *#{p: u32} => _dImp(10,0,15) @ _imm32(p)
- bge *#{p: u32} => _dImp(11,0,15) @ _imm32(p)
- bne *#{p: u32} => _dImp(12,0,15) @ _imm32(p)
- beq *#{p: u32} => _dImp(13,0,15) @ _imm32(p)
- jnc {s: reg_src} => _dImp(14,0, s) @ _imm16(0) ;jump to s if !negative
- jns {s: reg_src} => _dImp(15,0, s) @ _imm16(0) ;jump to s if negative
- jzc {s: reg_src} => _dImp(16,0, s) @ _imm16(0) ;jump to s if !zero
- jzs {s: reg_src} => _dImp(17,0, s) @ _imm16(0) ;jump to s if zero
- jlt {s: reg_src} => _dImp(18,0, s) @ _imm16(0) ;jump to s if d_prev< s_prev
- jgt {s: reg_src} => _dImp(19,0, s) @ _imm16(0) ;jump to s if d_prev> s_prev
- jle {s: reg_src} => _dImp(20,0, s) @ _imm16(0) ;jump to s if d_prev<=s_prev
- jge {s: reg_src} => _dImp(21,0, s) @ _imm16(0) ;jump to s if d_prev>=s_prev
- jne {s: reg_src} => _dImp(22,0, s) @ _imm16(0) ;jump to s if d_prev!=s_prev
- jeq {s: reg_src} => _dImp(23,0, s) @ _imm16(0) ;jump to s if d_prev==s_prev
- jnc #{v: u32} => _dImp(14,0, 7) @ _imm32(v)
- jns #{v: u32} => _dImp(15,0, 7) @ _imm32(v)
- jzc #{v: u32} => _dImp(16,0, 7) @ _imm32(v)
- jzs #{v: u32} => _dImp(17,0, 7) @ _imm32(v)
- jlt #{v: u32} => _dImp(18,0, 7) @ _imm32(v)
- jgt #{v: u32} => _dImp(19,0, 7) @ _imm32(v)
- jle #{v: u32} => _dImp(20,0, 7) @ _imm32(v)
- jge #{v: u32} => _dImp(21,0, 7) @ _imm32(v)
- jne #{v: u32} => _dImp(22,0, 7) @ _imm32(v)
- jeq #{v: u32} => _dImp(23,0, 7) @ _imm32(v)
- jnc *#{p: u32} => _dImp(14,0,15) @ _imm32(p)
- jns *#{p: u32} => _dImp(15,0,15) @ _imm32(p)
- jzc *#{p: u32} => _dImp(16,0,15) @ _imm32(p)
- jzs *#{p: u32} => _dImp(17,0,15) @ _imm32(p)
- jlt *#{p: u32} => _dImp(18,0,15) @ _imm32(p)
- jgt *#{p: u32} => _dImp(19,0,15) @ _imm32(p)
- jle *#{p: u32} => _dImp(20,0,15) @ _imm32(p)
- jge *#{p: u32} => _dImp(21,0,15) @ _imm32(p)
- jne *#{p: u32} => _dImp(22,0,15) @ _imm32(p)
- jeq *#{p: u32} => _dImp(23,0,15) @ _imm32(p)
- u2b {d: reg_dst}, {s: reg_src} => _dImp(24,d,s) @ _imm16(0) ;u32-to-binary-coded-decimal
- b2u {d: reg_dst}, {s: reg_src} => _dImp(25,d,s) @ _imm16(0) ;binary-coded-decimal-to-u32
- i2f {d: reg_dst}, {s: reg_src} => _dImp(26,d,s) @ _imm16(0) ;s32-to-float cast
- f2i {d: reg_dst}, {s: reg_src} => _dImp(27,d,s) @ _imm16(0) ;float-to-s32 cast
- u2b {d: reg_dst}, #{v: u32} => _dImp(24,d, 7) @ _imm32(v)
- b2u {d: reg_dst}, #{v: u32} => _dImp(25,d, 7) @ _imm32(v)
- i2f {d: reg_dst}, #{v: s32} => _dImp(26,d, 7) @ _imm32(v)
- f2i {d: reg_dst}, #{f: i32} => _dImp(27,d, 7) @ _imm32(f)
- u2b {d: reg_dst}, *#{p: u32} => _dImp(24,d,15) @ _imm32(p)
- b2u {d: reg_dst}, *#{p: u32} => _dImp(25,d,15) @ _imm32(p)
- i2f {d: reg_dst}, *#{p: u32} => _dImp(26,d,15) @ _imm32(p)
- f2i {d: reg_dst}, *#{p: u32} => _dImp(27,d,15) @ _imm32(p)
- rts => _dImp(28,0,0) @ _imm16(0) ;return from subroutine
- bra {s: reg_src} => _dImp(29,0,s) @ _imm16(0) ;branch always
- bra #{v: s16} => _dImp(29,0, 7) @ _imm16(to_relative(v))
- bra *#{p: u32} => _dImp(29,0,15) @ _imm32(p)
- ;return from subroutine, with custom (signed) stack ptr increment
- ;(example: "rsi #4" is equivalent to rts)
- rsi {s: reg_src} => _dImp(30,0,s) @ _imm16(0)
- rsi #{v: s16} => _dImp(30,0, 7) @ _imm16(v)
- rsi *#{p: u32} => _dImp(30,0,15) @ _imm32(p)
- ;return from function; rts, except r5 -> r1 are pulled (not r0)
- rfn => _dImp(31,0,0) @ _imm16(0)
- }
- #fn _dF32(op, dst, src) => 0b111`3 @ op`5 @ dst`4 @ src`4
- #ruledef datatype_f32 { ;data = 0b111
- brk.f32 => _dF32(0,0,0) @ _imm16(0) ;(tbd)
- mov.f32 {d: reg_dst}, {s: reg_src} => _dF32(1,d,s) @ _imm16(0) ;d = s
- cmp.f32 {d: reg_dst}, {s: reg_src} => _dF32(2,d,s) @ _imm16(0) ;compare d and s
- mov.f32 {d: reg_dst}, #{f: i32} => _dF32(1,d, 7) @ _imm32(f)
- cmp.f32 {d: reg_dst}, #{f: i32} => _dF32(2,d, 7) @ _imm32(f)
- mov.f32 {d: reg_dst}, *#{p: u32} => _dF32(1,d,15) @ _imm32(p)
- cmp.f32 {d: reg_dst}, *#{p: u32} => _dF32(2,d,15) @ _imm32(p)
- jmp.f32 {s: reg_src} => _dF32(3,0,s) @ _imm16(0) ;unconditional jump to s
- jsr.f32 {s: reg_src} => _dF32(4,0,s) @ _imm16(0) ;jump to subroutine in s
- jmp.f32 #{f: i32} => _dF32(3,0, 7) @ _imm32(f)
- jsr.f32 #{f: i32} => _dF32(4,0, 7) @ _imm32(f)
- jmp.f32 *#{p: u32} => _dF32(3,0,15) @ _imm32(p)
- jsr.f32 *#{p: u32} => _dF32(4,0,15) @ _imm32(p)
- sld.f32 {d: reg_dst}, {s: reg_src} => _dF32(5,d, s) @ _imm16(0) ;load to d from stack offset (s16 s offset, relative to sp)
- sst.f32 {d: reg_dst}, {s: reg_src} => _dF32(6,d, s) @ _imm16(0) ;store d to stack offset (s16 s, relative to sp)
- sld.f32 {d: reg_dst}, #{v: s16} => _dF32(5,d, 7) @ _imm16(v)
- sst.f32 {d: reg_dst}, #{v: s16} => _dF32(6,d, 7) @ _imm16(v)
- sld.f32 {d: reg_dst}, *#{p: u32} => _dF32(5,d,15) @ _imm32(p)
- sst.f32 {d: reg_dst}, *#{p: u32} => _dF32(6,d,15) @ _imm32(p)
- sph.f32 {s: reg_src} => _dF32(7,0,s) @ _imm16(0) ;push s to stack
- sph.f32 #{f: i32} => _dF32(7,0, 7) @ _imm32(f)
- sph.f32 *#{p: u32} => _dF32(7,0,15) @ _imm32(p)
- spl.f32 {d: reg_dst} => _dF32(8,d,0) @ _imm16(0) ;pull from stack into d
- inc.f32 {d: reg_dst} => _dF32( 9,d,0) @ _imm16(0) ;++d
- dec.f32 {d: reg_dst} => _dF32(10,d,0) @ _imm16(0) ;--d
- add.f32 {d: reg_dst}, {s: reg_src} => _dF32(11,d,s) @ _imm16(0) ;d += s
- sub.f32 {d: reg_dst}, {s: reg_src} => _dF32(12,d,s) @ _imm16(0) ;d -= s
- mul.f32 {d: reg_dst}, {s: reg_src} => _dF32(13,d,s) @ _imm16(0) ;d *= s
- div.f32 {d: reg_dst}, {s: reg_src} => _dF32(14,d,s) @ _imm16(0) ;d /= s
- mod.f32 {d: reg_dst}, {s: reg_src} => _dF32(15,d,s) @ _imm16(0) ;d %= s
- neg.f32 {d: reg_dst}, {s: reg_src} => _dF32(16,d,s) @ _imm16(0) ;d = -s
- add.f32 {d: reg_dst}, #{f: i32} => _dF32(11,d, 7) @ _imm32(f)
- sub.f32 {d: reg_dst}, #{f: i32} => _dF32(12,d, 7) @ _imm32(f)
- mul.f32 {d: reg_dst}, #{f: i32} => _dF32(13,d, 7) @ _imm32(f)
- div.f32 {d: reg_dst}, #{f: i32} => _dF32(14,d, 7) @ _imm32(f)
- mod.f32 {d: reg_dst}, #{f: i32} => _dF32(15,d, 7) @ _imm32(f)
- neg.f32 {d: reg_dst}, #{f: i32} => _dF32(16,d, 7) @ _imm32(f)
- add.f32 {d: reg_dst}, *#{p: u32} => _dF32(11,d,15) @ _imm32(p)
- sub.f32 {d: reg_dst}, *#{p: u32} => _dF32(12,d,15) @ _imm32(p)
- mul.f32 {d: reg_dst}, *#{p: u32} => _dF32(13,d,15) @ _imm32(p)
- div.f32 {d: reg_dst}, *#{p: u32} => _dF32(14,d,15) @ _imm32(p)
- mod.f32 {d: reg_dst}, *#{p: u32} => _dF32(15,d,15) @ _imm32(p)
- neg.f32 {d: reg_dst}, *#{p: u32} => _dF32(16,d,15) @ _imm32(p)
- jfn.f32 {s: reg_src} => _dF32(28,0,s) @ _imm16(0)
- jfn.f32 #{f: i32} => _dF32(28,0, 7) @ _imm32(f)
- jfn.f32 *#{p: u32} => _dF32(28,0,15) @ _imm32(p)
- }
- ;EXAMPLE PROGRAM: DRAW ELLIPSE
- ;(";*" is the start of a long comment!)
- ;*
- mov.u32 r0, #0xFFFFFFFF ;set bg to white
- sys #SYSCALL_SETDRAWCOLOR ;
- sys #SYSCALL_CLEAR ;
- mov.u32 r0, #0xFF000000 ;set color to black
- sys #SYSCALL_SETDRAWCOLOR ;
- mov.f32 r5, #0 ;init r5 to 0.0f
- mov.u32 r4, r5 ;init r4 to 0
- draw_loop:
- ;r0, r1 = cossin(r5)
- mov.f32 r0, r5
- mov.f32 r1, r5
- sys #SYSCALL_COSSIN
- ; -1.0f -> 1.0f TO 0.0f, 1.0f
- add.f32 r0, #F32_1_0 ; += 1.0f
- add.f32 r1, #F32_1_0 ;
- div.f32 r0, #F32_2_0 ; /= 2.0f
- div.f32 r1, #F32_2_0 ;
- ;for a 256x144 screen
- mul.f32 r0, #F32_255_0 ; *=255
- mul.f32 r1, #F32_143_0 ; *=143
- sys #SYSCALL_DRAWPOINT_F32
- add.f32 r5, #F32_0_05 ;+= 0.05f
- mod.f32 r5, #F32_2PI ;%= 2pi
- ;only update screen every 4096 iterations
- and.u16 r4, #bitmask(12)
- bzc #dont_present
- sys #SYSCALL_PRESENT ;flip screen
- dont_present:
- inc.u16 r4
- bra #draw_loop ;goto start
- *;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement