Advertisement
Kitomas

work for 2025-01-31 (0/4)

Jan 31st, 2025
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 71.72 KB | None | 0 0
  1. /******************************************************************************/
  2. /******************************************************************************/
  3. //"sokoban_and_kit32_2025-01-31\kit32\snake\kit-32.asm":
  4. #once
  5. ;IMPORTANT:
  6. ;* is how you start a long comment! *;
  7. ;flg = 0bN--Z--EL
  8.  
  9. ;note: use le() instead where possible
  10. #fn lend16(imm) => imm[7:0] @ imm[15:8]
  11. #fn lend32(imm) => imm[7:0] @ imm[15:8] @ imm[23:16] @ imm[31:24]
  12.  
  13. ;get relative address from an absolute one
  14.  ;(relative to the next byte after the branch)
  15. ;(also, to_relative() is used by default by
  16.  ;the branch operations, so to_absolute() is what you want
  17.  ;if you actually want to use relative addressing on a branch)
  18. #fn to_relative(absolute_address) => ((absolute_address)-$-4)
  19. ;get absolute address from a relative one
  20.  ;(relative to the next byte after the branch)
  21. #fn to_absolute(relative_address) => ($+4+(relative_address))
  22.  
  23. #fn bitmask(length) => ((1<<(length))-1)
  24.  
  25.  
  26.  
  27.  
  28.  
  29. SYSCALL_TAN            =  0 ;r0.f32 = tanf(r0.f32)
  30. SYSCALL_COSSIN         =  1 ;r0.f32 = cosf(r0.f32), r1.f32 = sinf(r1.f32)
  31. SYSCALL_COS            =  2 ;r0.f32 = cosf(r0.f32)
  32. SYSCALL_SIN            =  3 ;r1.f32 = sinf(r1.f32)
  33.  
  34. SYSCALL_MEMSET         =  4 ;memory::set ((void*)r0.u32, r1.u8 , r2.u32)
  35. SYSCALL_MEMCPY         =  5 ;memory::copy((void*)r0.u32, (void*)r1.u32, r2.u32)
  36.  
  37. SYSCALL_SETDRAWCOLOR   =  6 ;rndr->setDrawColor(r0.u32)
  38.  
  39. SYSCALL_DRAWPOINT_S32  =  7 ;rndr->drawPoint(r0.s32, r1.s32)
  40. SYSCALL_DRAWPOINT_F32  =  8 ;rndr->drawPoint(r0.f32, r1.f32)
  41. SYSCALL_DRAWLINE_S32   =  9 ;rndr->drawLine(r0.s32, r1.s32, r2.s32, r3.s32)
  42. SYSCALL_DRAWLINE_F32   = 10 ;rndr->drawLine(r0.f32, r1.f32, r2.f32, r3.f32)
  43. SYSCALL_DRAWRECT_S32   = 11 ;rndr->drawRects(&{r0.s32, r1.s32, r2.s32, r3.s32}, 1)
  44. SYSCALL_DRAWRECT_F32   = 12 ;rndr->drawRects(&{r0.f32, r1.f32, r2.f32, r3.f32}, 1)
  45. SYSCALL_FILLRECT_S32   = 13 ;rndr->fillRects(&{r0.s32, r1.s32, r2.s32, r3.s32}, 1)
  46. SYSCALL_FILLRECT_F32   = 14 ;rndr->fillRects(&{r0.f32, r1.f32, r2.f32, r3.f32}, 1)
  47.  
  48. SYSCALL_DRAWPOINTS_S32 = 15 ;rndr->drawPoints((shape::point *)r0.u32, r1.u32)
  49. SYSCALL_DRAWPOINTS_F32 = 16 ;rndr->drawPoints((shape::fpoint*)r0.u32, r1.u32)
  50. SYSCALL_DRAWLINES_S32  = 17 ;rndr->drawLines((shape::point *)r0.u32, r1.u32)
  51. SYSCALL_DRAWLINES_F32  = 18 ;rndr->drawLines((shape::fpoint*)r0.u32, r1.u32)
  52. SYSCALL_DRAWRECTS_S32  = 19 ;rndr->drawRects((shape::rect *)r0.u32, r1.u32)
  53. SYSCALL_DRAWRECTS_F32  = 20 ;rndr->drawRects((shape::frect*)r0.u32, r1.u32)
  54. SYSCALL_FILLRECTS_S32  = 21 ;rndr->fillRects((shape::rect *)r0.u32, r1.u32)
  55. SYSCALL_FILLRECTS_F32  = 22 ;rndr->fillRects((shape::frect*)r0.u32, r1.u32)
  56.  
  57. SYSCALL_CLEAR          = 23 ;rndr->clear()
  58. SYSCALL_PRESENT        = 24 ;rndr->present(), then wait until next frame
  59.  
  60. SYSCALL_RAND_U8        = 25 ;r0.u8  = (u8 )(frandf_b()*KIT_U8_MAX )
  61. SYSCALL_RAND_U16       = 26 ;r0.u16 = (u16)(frandf_b()*KIT_U16_MAX)
  62. SYSCALL_RAND_U32       = 27 ;r0.u32 = (u32)(frandf()*KIT_U32_MAX)
  63. SYSCALL_RAND_F32       = 28 ;r0.f32 = frandf()
  64.  
  65. ;r0.u32 = key32 if a key event was in the queue, or 0 if queue is empty
  66. SYSCALL_GETKEY         = 29
  67.  
  68. ;text->draw(r0.s32, r1.s32, r2.u32, r3.u32&KIT_S32_MAX)
  69. SYSCALL_DRAWTEXT       = 30
  70.  
  71.  
  72.  
  73. ;set x and/or y to this to center drawn text on that axis
  74. CENTERED_TEXT = -2147483647 ;aka 0x80000001
  75.  
  76.  
  77.  
  78. ;float constants as u32 literals, since
  79.  ;customasm doesn't support ieee-754 float literals
  80. ;(F32_X_Y = X.Yf -> F32_0_5 = 0.5f)
  81. F32_0_05  = 0x3D4CCCCD
  82. F32_255_0 = 0x437F0000
  83. F32_143_0 = 0x430F0000
  84.  
  85. F32_0_5 = 0x3F000000
  86. F32_1_0 = 0x3F800000
  87. F32_2_0 = 0x40000000
  88. F32_4_0 = 0x40800000
  89.  
  90. F32_PI2 = 0x3FC90FDB ;pi/2
  91. F32_PI  = 0x40490FDB ;pi
  92. F32_2PI = 0x40C90FDB ;2*pi
  93.  
  94.  
  95.  
  96.  
  97.  
  98. ;* -------------------------------------------------------------------------- *;
  99. ;* -------------------------------------------------------------------------- *;
  100.  
  101.  
  102.  
  103.  
  104.  
  105. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  106.  
  107. KE_SHIFT_PRESSED = 31
  108. KE_MASK_PRESSED  = bitmask(1)
  109.  
  110. KE_SHIFT_REPEAT = 30
  111. KE_MASK_REPEAT  = bitmask(1)
  112.  
  113. KE_SHIFT_KEYMOD = 19
  114. KE_MASK_KEYMOD  = bitmask(11)
  115.  
  116. KE_SHIFT_PKEY = 10
  117. KE_MASK_PKEY  = bitmask(9)
  118.  
  119. KE_SHIFT_VKEY = 0 ;redundant, since vkey uses the key event's lowest bits anyway
  120. KE_MASK_VKEY  = bitmask(10)
  121.  
  122.  
  123.  
  124. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  125.  
  126. KEYMOD_LSHIFT = 0x001
  127. KEYMOD_RSHIFT = 0x002
  128. KEYMOD_LCTRL  = 0x004
  129. KEYMOD_RCTRL  = 0x008
  130. KEYMOD_LALT   = 0x010
  131. KEYMOD_RALT   = 0x020
  132. KEYMOD_LGUI   = 0x040
  133. KEYMOD_RGUI   = 0x080
  134.   KEYMOD_LWIN = KEYMOD_RGUI
  135.   KEYMOD_RWIN = KEYMOD_RGUI
  136. KEYMOD_NUM    = 0x100
  137. KEYMOD_CAPS   = 0x200
  138. KEYMOD_MODE   = 0x400
  139.  
  140. KEYMOD_CTRL  = ( KEYMOD_LCTRL  | KEYMOD_RCTRL  )
  141. KEYMOD_SHIFT = ( KEYMOD_LSHIFT | KEYMOD_RSHIFT )
  142. KEYMOD_ALT   = ( KEYMOD_LALT   | KEYMOD_RALT   )
  143. KEYMOD_GUI   = ( KEYMOD_LGUI   | KEYMOD_RGUI   )
  144. KEYMOD_WIN   = ( KEYMOD_LWIN   | KEYMOD_RWIN   )
  145.  
  146.  
  147.  
  148. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  149.  
  150. PKEY_UNKNOWN = 0
  151.  
  152. ;Usage page 0x07
  153. ;These values are from usage page 0x07 (USB keyboard page).
  154.  
  155. PKEY_A =  4
  156. PKEY_B =  5
  157. PKEY_C =  6
  158. PKEY_D =  7
  159. PKEY_E =  8
  160. PKEY_F =  9
  161. PKEY_G = 10
  162. PKEY_H = 11
  163. PKEY_I = 12
  164. PKEY_J = 13
  165. PKEY_K = 14
  166. PKEY_L = 15
  167. PKEY_M = 16
  168. PKEY_N = 17
  169. PKEY_O = 18
  170. PKEY_P = 19
  171. PKEY_Q = 20
  172. PKEY_R = 21
  173. PKEY_S = 22
  174. PKEY_T = 23
  175. PKEY_U = 24
  176. PKEY_V = 25
  177. PKEY_W = 26
  178. PKEY_X = 27
  179. PKEY_Y = 28
  180. PKEY_Z = 29
  181.  
  182. PKEY_1 = 30
  183. PKEY_2 = 31
  184. PKEY_3 = 32
  185. PKEY_4 = 33
  186. PKEY_5 = 34
  187. PKEY_6 = 35
  188. PKEY_7 = 36
  189. PKEY_8 = 37
  190. PKEY_9 = 38
  191. PKEY_0 = 39
  192.  
  193. PKEY_RETURN    = 40
  194. PKEY_ESCAPE    = 41
  195. PKEY_BACKSPACE = 42
  196. PKEY_TAB       = 43
  197. PKEY_SPACE     = 44
  198.  
  199. PKEY_MINUS        = 45
  200. PKEY_EQUALS       = 46
  201. PKEY_LEFTBRACKET  = 47
  202. PKEY_RIGHTBRACKET = 48
  203. PKEY_BACKSLASH    = 49 ;* Located at the lower left of the return
  204.                         * key on ISO keyboards and at the right end
  205.                         * of the QWERTY row on ANSI keyboards.
  206.                         * Produces REVERSE SOLIDUS (backslash) and
  207.                         * VERTICAL LINE in a US layout, REVERSE
  208.                         * SOLIDUS and VERTICAL LINE in a UK Mac
  209.                         * layout, NUMBER SIGN and TILDE in a UK
  210.                         * Windows layout, DOLLAR SIGN and POUND SIGN
  211.                         * in a Swiss German layout, NUMBER SIGN and
  212.                         * APOSTROPHE in a German layout, GRAVE
  213.                         * ACCENT and POUND SIGN in a French Mac
  214.                         * layout, and ASTERISK and MICRO SIGN in a
  215.                         * French Windows layout.
  216.                         *;
  217. PKEY_NONUSHASH    = 50 ;* ISO USB keyboards actually use this code
  218.                         * instead of 49 for the same key, but all
  219.                         * OSes I've seen treat the two codes
  220.                        * identically. So, as an implementor, unless
  221.                        * your keyboard generates both of those
  222.                        * codes and your OS treats them differently,
  223.                        * you should generate PKEY_BACKSLASH
  224.                        * instead of this code. As a user, you
  225.                        * should not rely on this code because SDL
  226.                        * will never generate it with most (all?)
  227.                        * keyboards.
  228.                        *;
  229. PKEY_SEMICOLON    = 51
  230. PKEY_APOSTROPHE   = 52
  231. PKEY_GRAVE        = 53 ;* Located in the top left corner (on both ANSI
  232.                        * and ISO keyboards). Produces GRAVE ACCENT and
  233.                        * TILDE in a US Windows layout and in US and UK
  234.                        * Mac layouts on ANSI keyboards, GRAVE ACCENT
  235.                        * and NOT SIGN in a UK Windows layout, SECTION
  236.                        * SIGN and PLUS-MINUS SIGN in US and UK Mac
  237.                        * layouts on ISO keyboards, SECTION SIGN and
  238.                        * DEGREE SIGN in a Swiss German layout (Mac:
  239.                        * only on ISO keyboards), CIRCUMFLEX ACCENT and
  240.                        * DEGREE SIGN in a German layout (Mac: only on
  241.                        * ISO keyboards), SUPERSCRIPT TWO and TILDE in a
  242.                        * French Windows layout, COMMERCIAL AT and
  243.                        * NUMBER SIGN in a French Mac layout on ISO
  244.                        * keyboards, and LESS-THAN SIGN and GREATER-THAN
  245.                        * SIGN in a Swiss German, German, or French Mac
  246.                        * layout on ANSI keyboards.
  247.                        *;
  248. PKEY_COMMA        = 54
  249. PKEY_PERIOD       = 55
  250. PKEY_SLASH        = 56
  251.  
  252. PKEY_CAPSLOCK = 57
  253.  
  254. PKEY_F1  = 58
  255. PKEY_F2  = 59
  256. PKEY_F3  = 60
  257. PKEY_F4  = 61
  258. PKEY_F5  = 62
  259. PKEY_F6  = 63
  260. PKEY_F7  = 64
  261. PKEY_F8  = 65
  262. PKEY_F9  = 66
  263. PKEY_F10 = 67
  264. PKEY_F11 = 68
  265. PKEY_F12 = 69
  266.  
  267. PKEY_PRINTSCREEN = 70
  268. PKEY_SCROLLLOCK  = 71
  269. PKEY_PAUSE       = 72
  270. PKEY_INSERT      = 73 ;* insert on PC, help on some Mac keyboards (but
  271.                         does send code 73, not 117) *;
  272. PKEY_HOME        = 74
  273. PKEY_PAGEUP      = 75
  274. PKEY_DELETE      = 76
  275. PKEY_END         = 77
  276. PKEY_PAGEDOWN    = 78
  277. PKEY_RIGHT       = 79
  278. PKEY_LEFT        = 80
  279. PKEY_DOWN        = 81
  280. PKEY_UP          = 82
  281.  
  282. PKEY_NUMLOCKCLEAR = 83 ;num lock on PC, clear on Mac keyboards
  283. PKEY_KP_DIVIDE    = 84
  284. PKEY_KP_MULTIPLY  = 85
  285. PKEY_KP_MINUS     = 86
  286. PKEY_KP_PLUS      = 87
  287. PKEY_KP_ENTER     = 88
  288. PKEY_KP_1         = 89
  289. PKEY_KP_2         = 90
  290. PKEY_KP_3         = 91
  291. PKEY_KP_4         = 92
  292. PKEY_KP_5         = 93
  293. PKEY_KP_6         = 94
  294. PKEY_KP_7         = 95
  295. PKEY_KP_8         = 96
  296. PKEY_KP_9         = 97
  297. PKEY_KP_0         = 98
  298. PKEY_KP_PERIOD    = 99
  299.  
  300. PKEY_NONUSBACKSLASH = 100 ;* This is the additional key that ISO
  301.                           * keyboards have over ANSI ones,
  302.                           * located between left shift and Y.
  303.                           * Produces GRAVE ACCENT and TILDE in a
  304.                           * US or UK Mac layout, REVERSE SOLIDUS
  305.                           * (backslash) and VERTICAL LINE in a
  306.                           * US or UK Windows layout, and
  307.                           * LESS-THAN SIGN and GREATER-THAN SIGN
  308.                           * in a Swiss German, German, or French
  309.                           * layout. *;
  310. PKEY_APPLICATION    = 101 ;windows contextual menu, compose
  311. PKEY_POWER          = 102 ;* The USB document says this is a status flag,
  312.                           * not a physical key - but some Mac keyboards
  313.                           * do have a power key. *;
  314. PKEY_KP_EQUALS      = 103
  315. PKEY_F13            = 104
  316. PKEY_F14            = 105
  317. PKEY_F15            = 106
  318. PKEY_F16            = 107
  319. PKEY_F17            = 108
  320. PKEY_F18            = 109
  321. PKEY_F19            = 110
  322. PKEY_F20            = 111
  323. PKEY_F21            = 112
  324. PKEY_F22            = 113
  325. PKEY_F23            = 114
  326. PKEY_F24            = 115
  327. PKEY_EXECUTE        = 116
  328. PKEY_HELP           = 117 ;AL Integrated Help Center
  329. PKEY_MENU           = 118 ;Menu (show menu)
  330. PKEY_SELECT         = 119
  331. PKEY_STOP           = 120 ;AC Stop
  332. PKEY_AGAIN          = 121 ;AC Redo/Repeat
  333. PKEY_UNDO           = 122 ;AC Undo
  334. PKEY_CUT            = 123 ;AC Cut
  335. PKEY_COPY           = 124 ;AC Copy
  336. PKEY_PASTE          = 125 ;AC Paste
  337. PKEY_FIND           = 126 ;AC Find
  338. PKEY_MUTE           = 127
  339. PKEY_VOLUMEUP       = 128
  340. PKEY_VOLUMEDOWN     = 129
  341. ;not sure whether there's a reason to enable these
  342. ;*  PKEY_LOCKINGCAPSLOCK   = 130, *;
  343. ;*  PKEY_LOCKINGNUMLOCK    = 131, *;
  344. ;*  PKEY_LOCKINGSCROLLLOCK = 132, *;
  345. PKEY_KP_COMMA       = 133
  346. PKEY_KP_EQUALSAS400 = 134
  347.  
  348. PKEY_INTERNATIONAL1 = 135 ;* used on Asian keyboards, see
  349.                              footnotes in USB doc *;
  350. PKEY_INTERNATIONAL2 = 136
  351. PKEY_INTERNATIONAL3 = 137 ;Yen
  352. PKEY_INTERNATIONAL4 = 138
  353. PKEY_INTERNATIONAL5 = 139
  354. PKEY_INTERNATIONAL6 = 140
  355. PKEY_INTERNATIONAL7 = 141
  356. PKEY_INTERNATIONAL8 = 142
  357. PKEY_INTERNATIONAL9 = 143
  358. PKEY_LANG1          = 144 ;Hangul/English toggle
  359. PKEY_LANG2          = 145 ;Hanja conversion
  360. PKEY_LANG3          = 146 ;Katakana
  361. PKEY_LANG4          = 147 ;Hiragana
  362. PKEY_LANG5          = 148 ;Zenkaku/Hankaku
  363. PKEY_LANG6          = 149 ;reserved
  364. PKEY_LANG7          = 150 ;reserved
  365. PKEY_LANG8          = 151 ;reserved
  366. PKEY_LANG9          = 152 ;reserved
  367.  
  368. PKEY_ALTERASE   = 153 ;Erase-Eaze
  369. PKEY_SYSREQ     = 154
  370. PKEY_CANCEL     = 155 ;AC Cancel
  371. PKEY_CLEAR      = 156
  372. PKEY_PRIOR      = 157
  373. PKEY_RETURN2    = 158
  374. PKEY_SEPARATOR  = 159
  375. PKEY_OUT        = 160
  376. PKEY_OPER       = 161
  377. PKEY_CLEARAGAIN = 162
  378. PKEY_CRSEL      = 163
  379. PKEY_EXSEL      = 164
  380.  
  381. PKEY_KP_00              = 176
  382. PKEY_KP_000             = 177
  383. PKEY_THOUSANDSSEPARATOR = 178
  384. PKEY_DECIMALSEPARATOR   = 179
  385. PKEY_CURRENCYUNIT       = 180
  386. PKEY_CURRENCYSUBUNIT    = 181
  387. PKEY_KP_LEFTPAREN       = 182
  388. PKEY_KP_RIGHTPAREN      = 183
  389. PKEY_KP_LEFTBRACE       = 184
  390. PKEY_KP_RIGHTBRACE      = 185
  391. PKEY_KP_TAB             = 186
  392. PKEY_KP_BACKSPACE       = 187
  393. PKEY_KP_A               = 188
  394. PKEY_KP_B               = 189
  395. PKEY_KP_C               = 190
  396. PKEY_KP_D               = 191
  397. PKEY_KP_E               = 192
  398. PKEY_KP_F               = 193
  399. PKEY_KP_XOR             = 194
  400. PKEY_KP_POWER           = 195
  401. PKEY_KP_PERCENT         = 196
  402. PKEY_KP_LESS            = 197
  403. PKEY_KP_GREATER         = 198
  404. PKEY_KP_AMPERSAND       = 199
  405. PKEY_KP_DBLAMPERSAND    = 200
  406. PKEY_KP_VERTICALBAR     = 201
  407. PKEY_KP_DBLVERTICALBAR  = 202
  408. PKEY_KP_COLON           = 203
  409. PKEY_KP_HASH            = 204
  410. PKEY_KP_SPACE           = 205
  411. PKEY_KP_AT              = 206
  412. PKEY_KP_EXCLAM          = 207
  413. PKEY_KP_MEMSTORE        = 208
  414. PKEY_KP_MEMRECALL       = 209
  415. PKEY_KP_MEMCLEAR        = 210
  416. PKEY_KP_MEMADD          = 211
  417. PKEY_KP_MEMSUBTRACT     = 212
  418. PKEY_KP_MEMMULTIPLY     = 213
  419. PKEY_KP_MEMDIVIDE       = 214
  420. PKEY_KP_PLUSMINUS       = 215
  421. PKEY_KP_CLEAR           = 216
  422. PKEY_KP_CLEARENTRY      = 217
  423. PKEY_KP_BINARY          = 218
  424. PKEY_KP_OCTAL           = 219
  425. PKEY_KP_DECIMAL         = 220
  426. PKEY_KP_HEXADECIMAL     = 221
  427.  
  428. PKEY_LCTRL  = 224
  429. PKEY_LSHIFT = 225
  430. PKEY_LALT   = 226 ;alt, option
  431. PKEY_LGUI   = 227 ;windows, command (apple), meta
  432. PKEY_RCTRL  = 228
  433. PKEY_RSHIFT = 229
  434. PKEY_RALT   = 230 ;alt gr, option
  435. PKEY_RGUI   = 231 ;windows, command (apple), meta
  436.  
  437. PKEY_MODE   = 257 ;* I'm not sure if this is really not covered
  438.                   *   by any of the above, but since there's a
  439.                    *   special KEYMOD_MODE for it I'm adding it here
  440.                   *;
  441.  
  442. ;*
  443. *  Usage page 0x0C
  444. *
  445. *  These values are mapped from usage page 0x0C (USB consumer page).
  446. *  See https://usb.org/sites/default/files/hut1_2.pdf
  447. *
  448. *  There are way more keys in the spec than we can represent in the
  449. *  current scancode range, so pick the ones that commonly come up in
  450. *  real world usage.
  451. *;
  452.  
  453. PKEY_AUDIONEXT    = 258
  454. PKEY_AUDIOPREV    = 259
  455. PKEY_AUDIOSTOP    = 260
  456. PKEY_AUDIOPLAY    = 261
  457. PKEY_AUDIOMUTE    = 262
  458. PKEY_MEDIASELECT  = 263
  459. PKEY_WWW          = 264 ;AL Internet Browser
  460. PKEY_MAIL         = 265
  461. PKEY_CALCULATOR   = 266 ;AL Calculator
  462. PKEY_COMPUTER     = 267
  463. PKEY_AC_SEARCH    = 268 ;AC Search
  464. PKEY_AC_HOME      = 269 ;AC Home
  465. PKEY_AC_BACK      = 270 ;AC Back
  466. PKEY_AC_FORWARD   = 271 ;AC Forward
  467. PKEY_AC_STOP      = 272 ;AC Stop
  468. PKEY_AC_REFRESH   = 273 ;AC Refresh
  469. PKEY_AC_BOOKMARKS = 274 ;AC Bookmarks
  470.  
  471. ;*
  472. *  Walther keys
  473. *
  474. *  These are values that Christian Walther added (for mac keyboard?).
  475. *;
  476.  
  477. PKEY_BRIGHTNESSDOWN = 275
  478. PKEY_BRIGHTNESSUP   = 276
  479. PKEY_DISPLAYSWITCH  = 277 ;* display mirroring/dual display
  480.                             switch, video mode switch *;
  481. PKEY_KBDILLUMTOGGLE = 278
  482. PKEY_KBDILLUMDOWN   = 279
  483. PKEY_KBDILLUMUP     = 280
  484. PKEY_EJECT          = 281
  485. PKEY_SLEEP          = 282 ;SC System Sleep
  486.  
  487. PKEY_APP1 = 283
  488. PKEY_APP2 = 284
  489.  
  490. ;*
  491. *  Usage page 0x0C (additional media keys)
  492. *
  493. *  These values are mapped from usage page 0x0C (USB consumer page).
  494. *;
  495.  
  496. PKEY_AUDIOREWIND      = 285
  497. PKEY_AUDIOFASTFORWARD = 286
  498.  
  499. ;*
  500. *  Mobile keys
  501. *
  502. *  These are values that are often used on mobile phones.
  503. *;
  504.  
  505. PKEY_SOFTLEFT = 287 ;* Usually situated below the display on phones and
  506.                       used as a multi-function feature key for selecting
  507.                       a software defined function shown on the bottom left
  508.                       of the display. *;
  509. PKEY_SOFTRIGHT = 288 ;* Usually situated below the display on phones and
  510.                        used as a multi-function feature key for selecting
  511.                        a software defined function shown on the bottom right
  512.                        of the display. *;
  513. PKEY_CALL    = 289 ;Used for accepting phone calls.
  514. PKEY_ENDCALL = 290 ;Used for rejecting phone calls.
  515.  
  516. ;(Add any other keys here.)
  517.  
  518. KIT_NUM_PKEYS = 512 ;* not a key, just marks the number of scancodes
  519.                       for array bounds *;
  520.                        
  521.  
  522.  
  523. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  524.  
  525. _KIT_PKEY_MASK = (1<<9) ;10th bit
  526. #fn KIT_PKEY_TO_VKEY(X) => ((X)|_KIT_PKEY_MASK)[9:0]
  527.  
  528.  
  529.  
  530. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  531.  
  532. VKEY_UNKNOWN = 0
  533.  
  534.  
  535. VKEY_RETURN     = 0x0D ;'\r'
  536. VKEY_ESCAPE     = 0x1B
  537. VKEY_BACKSPACE  = 0x08 ;'\b'
  538. VKEY_TAB        = "\t"
  539. VKEY_SPACE      = " "
  540. VKEY_EXCLAIM    = "!"
  541. VKEY_QUOTEDBL   = 0x22 ;'\"'
  542. VKEY_HASH       = "#"
  543. VKEY_PERCENT    = "%"
  544. VKEY_DOLLAR     = "$"
  545. VKEY_AMPERSAND  = "&"
  546. VKEY_QUOTE      = "\'"
  547. VKEY_LEFTPAREN  = "("
  548. VKEY_RIGHTPAREN = ")"
  549. VKEY_ASTERISK   = "*"
  550. VKEY_PLUS       = "+"
  551. VKEY_COMMA      = ","
  552. VKEY_MINUS      = "-"
  553. VKEY_PERIOD     = "."
  554. VKEY_SLASH      = "/"
  555. VKEY_0          = "0"
  556. VKEY_1          = "1"
  557. VKEY_2          = "2"
  558. VKEY_3          = "3"
  559. VKEY_4          = "4"
  560. VKEY_5          = "5"
  561. VKEY_6          = "6"
  562. VKEY_7          = "7"
  563. VKEY_8          = "8"
  564. VKEY_9          = "9"
  565. VKEY_COLON      = ":"
  566. VKEY_SEMICOLON  = ";"
  567. VKEY_LESS       = "<"
  568. VKEY_EQUALS     = "="
  569. VKEY_GREATER    = ">"
  570. VKEY_QUESTION   = "?"
  571. VKEY_AT         = "@"
  572.  
  573. ;(Skip uppercase letters)
  574.  
  575. VKEY_LEFTBRACKET  = "["
  576. VKEY_BACKSLASH    = "\\"
  577. VKEY_RIGHTBRACKET = "]"
  578. VKEY_CARET        = "^"
  579. VKEY_UNDERSCORE   = "_"
  580. VKEY_BACKQUOTE    = "`"
  581. VKEY_a            = "a"
  582. VKEY_b            = "b"
  583. VKEY_c            = "c"
  584. VKEY_d            = "d"
  585. VKEY_e            = "e"
  586. VKEY_f            = "f"
  587. VKEY_g            = "g"
  588. VKEY_h            = "h"
  589. VKEY_i            = "i"
  590. VKEY_j            = "j"
  591. VKEY_k            = "k"
  592. VKEY_l            = "l"
  593. VKEY_m            = "m"
  594. VKEY_n            = "n"
  595. VKEY_o            = "o"
  596. VKEY_p            = "p"
  597. VKEY_q            = "q"
  598. VKEY_r            = "r"
  599. VKEY_s            = "s"
  600. VKEY_t            = "t"
  601. VKEY_u            = "u"
  602. VKEY_v            = "v"
  603. VKEY_w            = "w"
  604. VKEY_x            = "x"
  605. VKEY_y            = "y"
  606. VKEY_z            = "z"
  607.  
  608. VKEY_CAPSLOCK = KIT_PKEY_TO_VKEY(PKEY_CAPSLOCK)
  609.  
  610. VKEY_F1  = KIT_PKEY_TO_VKEY(PKEY_F1)
  611. VKEY_F2  = KIT_PKEY_TO_VKEY(PKEY_F2)
  612. VKEY_F3  = KIT_PKEY_TO_VKEY(PKEY_F3)
  613. VKEY_F4  = KIT_PKEY_TO_VKEY(PKEY_F4)
  614. VKEY_F5  = KIT_PKEY_TO_VKEY(PKEY_F5)
  615. VKEY_F6  = KIT_PKEY_TO_VKEY(PKEY_F6)
  616. VKEY_F7  = KIT_PKEY_TO_VKEY(PKEY_F7)
  617. VKEY_F8  = KIT_PKEY_TO_VKEY(PKEY_F8)
  618. VKEY_F9  = KIT_PKEY_TO_VKEY(PKEY_F9)
  619. VKEY_F10 = KIT_PKEY_TO_VKEY(PKEY_F10)
  620. VKEY_F11 = KIT_PKEY_TO_VKEY(PKEY_F11)
  621. VKEY_F12 = KIT_PKEY_TO_VKEY(PKEY_F12)
  622.  
  623. VKEY_PRINTSCREEN = KIT_PKEY_TO_VKEY(PKEY_PRINTSCREEN)
  624. VKEY_SCROLLLOCK  = KIT_PKEY_TO_VKEY(PKEY_SCROLLLOCK)
  625. VKEY_PAUSE       = KIT_PKEY_TO_VKEY(PKEY_PAUSE)
  626. VKEY_INSERT      = KIT_PKEY_TO_VKEY(PKEY_INSERT)
  627. VKEY_HOME        = KIT_PKEY_TO_VKEY(PKEY_HOME)
  628. VKEY_PAGEUP      = KIT_PKEY_TO_VKEY(PKEY_PAGEUP)
  629. VKEY_DELETE      = "\x7F"
  630. VKEY_END         = KIT_PKEY_TO_VKEY(PKEY_END)
  631. VKEY_PAGEDOWN    = KIT_PKEY_TO_VKEY(PKEY_PAGEDOWN)
  632. VKEY_RIGHT       = KIT_PKEY_TO_VKEY(PKEY_RIGHT)
  633. VKEY_LEFT        = KIT_PKEY_TO_VKEY(PKEY_LEFT)
  634. VKEY_DOWN        = KIT_PKEY_TO_VKEY(PKEY_DOWN)
  635. VKEY_UP          = KIT_PKEY_TO_VKEY(PKEY_UP)
  636.  
  637. VKEY_NUMLOCKCLEAR = KIT_PKEY_TO_VKEY(PKEY_NUMLOCKCLEAR)
  638. VKEY_KP_DIVIDE    = KIT_PKEY_TO_VKEY(PKEY_KP_DIVIDE)
  639. VKEY_KP_MULTIPLY  = KIT_PKEY_TO_VKEY(PKEY_KP_MULTIPLY)
  640. VKEY_KP_MINUS     = KIT_PKEY_TO_VKEY(PKEY_KP_MINUS)
  641. VKEY_KP_PLUS      = KIT_PKEY_TO_VKEY(PKEY_KP_PLUS)
  642. VKEY_KP_ENTER     = KIT_PKEY_TO_VKEY(PKEY_KP_ENTER)
  643. VKEY_KP_1         = KIT_PKEY_TO_VKEY(PKEY_KP_1)
  644. VKEY_KP_2         = KIT_PKEY_TO_VKEY(PKEY_KP_2)
  645. VKEY_KP_3         = KIT_PKEY_TO_VKEY(PKEY_KP_3)
  646. VKEY_KP_4         = KIT_PKEY_TO_VKEY(PKEY_KP_4)
  647. VKEY_KP_5         = KIT_PKEY_TO_VKEY(PKEY_KP_5)
  648. VKEY_KP_6         = KIT_PKEY_TO_VKEY(PKEY_KP_6)
  649. VKEY_KP_7         = KIT_PKEY_TO_VKEY(PKEY_KP_7)
  650. VKEY_KP_8         = KIT_PKEY_TO_VKEY(PKEY_KP_8)
  651. VKEY_KP_9         = KIT_PKEY_TO_VKEY(PKEY_KP_9)
  652. VKEY_KP_0         = KIT_PKEY_TO_VKEY(PKEY_KP_0)
  653. VKEY_KP_PERIOD    = KIT_PKEY_TO_VKEY(PKEY_KP_PERIOD)
  654.  
  655. VKEY_APPLICATION    = KIT_PKEY_TO_VKEY(PKEY_APPLICATION)
  656. VKEY_POWER          = KIT_PKEY_TO_VKEY(PKEY_POWER)
  657. VKEY_KP_EQUALS      = KIT_PKEY_TO_VKEY(PKEY_KP_EQUALS)
  658. VKEY_F13            = KIT_PKEY_TO_VKEY(PKEY_F13)
  659. VKEY_F14            = KIT_PKEY_TO_VKEY(PKEY_F14)
  660. VKEY_F15            = KIT_PKEY_TO_VKEY(PKEY_F15)
  661. VKEY_F16            = KIT_PKEY_TO_VKEY(PKEY_F16)
  662. VKEY_F17            = KIT_PKEY_TO_VKEY(PKEY_F17)
  663. VKEY_F18            = KIT_PKEY_TO_VKEY(PKEY_F18)
  664. VKEY_F19            = KIT_PKEY_TO_VKEY(PKEY_F19)
  665. VKEY_F20            = KIT_PKEY_TO_VKEY(PKEY_F20)
  666. VKEY_F21            = KIT_PKEY_TO_VKEY(PKEY_F21)
  667. VKEY_F22            = KIT_PKEY_TO_VKEY(PKEY_F22)
  668. VKEY_F23            = KIT_PKEY_TO_VKEY(PKEY_F23)
  669. VKEY_F24            = KIT_PKEY_TO_VKEY(PKEY_F24)
  670. VKEY_EXECUTE        = KIT_PKEY_TO_VKEY(PKEY_EXECUTE)
  671. VKEY_HELP           = KIT_PKEY_TO_VKEY(PKEY_HELP)
  672. VKEY_MENU           = KIT_PKEY_TO_VKEY(PKEY_MENU)
  673. VKEY_SELECT         = KIT_PKEY_TO_VKEY(PKEY_SELECT)
  674. VKEY_STOP           = KIT_PKEY_TO_VKEY(PKEY_STOP)
  675. VKEY_AGAIN          = KIT_PKEY_TO_VKEY(PKEY_AGAIN)
  676. VKEY_UNDO           = KIT_PKEY_TO_VKEY(PKEY_UNDO)
  677. VKEY_CUT            = KIT_PKEY_TO_VKEY(PKEY_CUT)
  678. VKEY_COPY           = KIT_PKEY_TO_VKEY(PKEY_COPY)
  679. VKEY_PASTE          = KIT_PKEY_TO_VKEY(PKEY_PASTE)
  680. VKEY_FIND           = KIT_PKEY_TO_VKEY(PKEY_FIND)
  681. VKEY_MUTE           = KIT_PKEY_TO_VKEY(PKEY_MUTE)
  682. VKEY_VOLUMEUP       = KIT_PKEY_TO_VKEY(PKEY_VOLUMEUP)
  683. VKEY_VOLUMEDOWN     = KIT_PKEY_TO_VKEY(PKEY_VOLUMEDOWN)
  684. VKEY_KP_COMMA       = KIT_PKEY_TO_VKEY(PKEY_KP_COMMA)
  685. VKEY_KP_EQUALSAS400 = KIT_PKEY_TO_VKEY(PKEY_KP_EQUALSAS400)
  686.  
  687. VKEY_ALTERASE   = KIT_PKEY_TO_VKEY(PKEY_ALTERASE)
  688. VKEY_SYSREQ     = KIT_PKEY_TO_VKEY(PKEY_SYSREQ)
  689. VKEY_CANCEL     = KIT_PKEY_TO_VKEY(PKEY_CANCEL)
  690. VKEY_CLEAR      = KIT_PKEY_TO_VKEY(PKEY_CLEAR)
  691. VKEY_PRIOR      = KIT_PKEY_TO_VKEY(PKEY_PRIOR)
  692. VKEY_RETURN2    = KIT_PKEY_TO_VKEY(PKEY_RETURN2)
  693. VKEY_SEPARATOR  = KIT_PKEY_TO_VKEY(PKEY_SEPARATOR)
  694. VKEY_OUT        = KIT_PKEY_TO_VKEY(PKEY_OUT)
  695. VKEY_OPER       = KIT_PKEY_TO_VKEY(PKEY_OPER)
  696. VKEY_CLEARAGAIN = KIT_PKEY_TO_VKEY(PKEY_CLEARAGAIN)
  697. VKEY_CRSEL      = KIT_PKEY_TO_VKEY(PKEY_CRSEL)
  698. VKEY_EXSEL      = KIT_PKEY_TO_VKEY(PKEY_EXSEL)
  699.  
  700. VKEY_KP_00              = KIT_PKEY_TO_VKEY(PKEY_KP_00)
  701. VKEY_KP_000             = KIT_PKEY_TO_VKEY(PKEY_KP_000)
  702. VKEY_THOUSANDSSEPARATOR = KIT_PKEY_TO_VKEY(PKEY_THOUSANDSSEPARATOR)
  703. VKEY_DECIMALSEPARATOR   = KIT_PKEY_TO_VKEY(PKEY_DECIMALSEPARATOR)
  704. VKEY_CURRENCYUNIT       = KIT_PKEY_TO_VKEY(PKEY_CURRENCYUNIT)
  705. VKEY_CURRENCYSUBUNIT    = KIT_PKEY_TO_VKEY(PKEY_CURRENCYSUBUNIT)
  706. VKEY_KP_LEFTPAREN       = KIT_PKEY_TO_VKEY(PKEY_KP_LEFTPAREN)
  707. VKEY_KP_RIGHTPAREN      = KIT_PKEY_TO_VKEY(PKEY_KP_RIGHTPAREN)
  708. VKEY_KP_LEFTBRACE       = KIT_PKEY_TO_VKEY(PKEY_KP_LEFTBRACE)
  709. VKEY_KP_RIGHTBRACE      = KIT_PKEY_TO_VKEY(PKEY_KP_RIGHTBRACE)
  710. VKEY_KP_TAB             = KIT_PKEY_TO_VKEY(PKEY_KP_TAB)
  711. VKEY_KP_BACKSPACE       = KIT_PKEY_TO_VKEY(PKEY_KP_BACKSPACE)
  712. VKEY_KP_A               = KIT_PKEY_TO_VKEY(PKEY_KP_A)
  713. VKEY_KP_B               = KIT_PKEY_TO_VKEY(PKEY_KP_B)
  714. VKEY_KP_C               = KIT_PKEY_TO_VKEY(PKEY_KP_C)
  715. VKEY_KP_D               = KIT_PKEY_TO_VKEY(PKEY_KP_D)
  716. VKEY_KP_E               = KIT_PKEY_TO_VKEY(PKEY_KP_E)
  717. VKEY_KP_F               = KIT_PKEY_TO_VKEY(PKEY_KP_F)
  718. VKEY_KP_XOR             = KIT_PKEY_TO_VKEY(PKEY_KP_XOR)
  719. VKEY_KP_POWER           = KIT_PKEY_TO_VKEY(PKEY_KP_POWER)
  720. VKEY_KP_PERCENT         = KIT_PKEY_TO_VKEY(PKEY_KP_PERCENT)
  721. VKEY_KP_LESS            = KIT_PKEY_TO_VKEY(PKEY_KP_LESS)
  722. VKEY_KP_GREATER         = KIT_PKEY_TO_VKEY(PKEY_KP_GREATER)
  723. VKEY_KP_AMPERSAND       = KIT_PKEY_TO_VKEY(PKEY_KP_AMPERSAND)
  724. VKEY_KP_DBLAMPERSAND    = KIT_PKEY_TO_VKEY(PKEY_KP_DBLAMPERSAND)
  725. VKEY_KP_VERTICALBAR     = KIT_PKEY_TO_VKEY(PKEY_KP_VERTICALBAR)
  726. VKEY_KP_DBLVERTICALBAR  = KIT_PKEY_TO_VKEY(PKEY_KP_DBLVERTICALBAR)
  727. VKEY_KP_COLON           = KIT_PKEY_TO_VKEY(PKEY_KP_COLON)
  728. VKEY_KP_HASH            = KIT_PKEY_TO_VKEY(PKEY_KP_HASH)
  729. VKEY_KP_SPACE           = KIT_PKEY_TO_VKEY(PKEY_KP_SPACE)
  730. VKEY_KP_AT              = KIT_PKEY_TO_VKEY(PKEY_KP_AT)
  731. VKEY_KP_EXCLAM          = KIT_PKEY_TO_VKEY(PKEY_KP_EXCLAM)
  732. VKEY_KP_MEMSTORE        = KIT_PKEY_TO_VKEY(PKEY_KP_MEMSTORE)
  733. VKEY_KP_MEMRECALL       = KIT_PKEY_TO_VKEY(PKEY_KP_MEMRECALL)
  734. VKEY_KP_MEMCLEAR        = KIT_PKEY_TO_VKEY(PKEY_KP_MEMCLEAR)
  735. VKEY_KP_MEMADD          = KIT_PKEY_TO_VKEY(PKEY_KP_MEMADD)
  736. VKEY_KP_MEMSUBTRACT     = KIT_PKEY_TO_VKEY(PKEY_KP_MEMSUBTRACT)
  737. VKEY_KP_MEMMULTIPLY     = KIT_PKEY_TO_VKEY(PKEY_KP_MEMMULTIPLY)
  738. VKEY_KP_MEMDIVIDE       = KIT_PKEY_TO_VKEY(PKEY_KP_MEMDIVIDE)
  739. VKEY_KP_PLUSMINUS       = KIT_PKEY_TO_VKEY(PKEY_KP_PLUSMINUS)
  740. VKEY_KP_CLEAR           = KIT_PKEY_TO_VKEY(PKEY_KP_CLEAR)
  741. VKEY_KP_CLEARENTRY      = KIT_PKEY_TO_VKEY(PKEY_KP_CLEARENTRY)
  742. VKEY_KP_BINARY          = KIT_PKEY_TO_VKEY(PKEY_KP_BINARY)
  743. VKEY_KP_OCTAL           = KIT_PKEY_TO_VKEY(PKEY_KP_OCTAL)
  744. VKEY_KP_DECIMAL         = KIT_PKEY_TO_VKEY(PKEY_KP_DECIMAL)
  745. VKEY_KP_HEXADECIMAL     = KIT_PKEY_TO_VKEY(PKEY_KP_HEXADECIMAL)
  746.  
  747. VKEY_LCTRL  = KIT_PKEY_TO_VKEY(PKEY_LCTRL)
  748. VKEY_LSHIFT = KIT_PKEY_TO_VKEY(PKEY_LSHIFT)
  749. VKEY_LALT   = KIT_PKEY_TO_VKEY(PKEY_LALT)
  750. VKEY_LGUI   = KIT_PKEY_TO_VKEY(PKEY_LGUI)
  751. VKEY_RCTRL  = KIT_PKEY_TO_VKEY(PKEY_RCTRL)
  752. VKEY_RSHIFT = KIT_PKEY_TO_VKEY(PKEY_RSHIFT)
  753. VKEY_RALT   = KIT_PKEY_TO_VKEY(PKEY_RALT)
  754. VKEY_RGUI   = KIT_PKEY_TO_VKEY(PKEY_RGUI)
  755.  
  756. VKEY_MODE = KIT_PKEY_TO_VKEY(PKEY_MODE)
  757.  
  758. VKEY_AUDIONEXT    = KIT_PKEY_TO_VKEY(PKEY_AUDIONEXT)
  759. VKEY_AUDIOPREV    = KIT_PKEY_TO_VKEY(PKEY_AUDIOPREV)
  760. VKEY_AUDIOSTOP    = KIT_PKEY_TO_VKEY(PKEY_AUDIOSTOP)
  761. VKEY_AUDIOPLAY    = KIT_PKEY_TO_VKEY(PKEY_AUDIOPLAY)
  762. VKEY_AUDIOMUTE    = KIT_PKEY_TO_VKEY(PKEY_AUDIOMUTE)
  763. VKEY_MEDIASELECT  = KIT_PKEY_TO_VKEY(PKEY_MEDIASELECT)
  764. VKEY_WWW          = KIT_PKEY_TO_VKEY(PKEY_WWW)
  765. VKEY_MAIL         = KIT_PKEY_TO_VKEY(PKEY_MAIL)
  766. VKEY_CALCULATOR   = KIT_PKEY_TO_VKEY(PKEY_CALCULATOR)
  767. VKEY_COMPUTER     = KIT_PKEY_TO_VKEY(PKEY_COMPUTER)
  768. VKEY_AC_SEARCH    = KIT_PKEY_TO_VKEY(PKEY_AC_SEARCH)
  769. VKEY_AC_HOME      = KIT_PKEY_TO_VKEY(PKEY_AC_HOME)
  770. VKEY_AC_BACK      = KIT_PKEY_TO_VKEY(PKEY_AC_BACK)
  771. VKEY_AC_FORWARD   = KIT_PKEY_TO_VKEY(PKEY_AC_FORWARD)
  772. VKEY_AC_STOP      = KIT_PKEY_TO_VKEY(PKEY_AC_STOP)
  773. VKEY_AC_REFRESH   = KIT_PKEY_TO_VKEY(PKEY_AC_REFRESH)
  774. VKEY_AC_BOOKMARKS = KIT_PKEY_TO_VKEY(PKEY_AC_BOOKMARKS)
  775.  
  776. VKEY_BRIGHTNESSDOWN = KIT_PKEY_TO_VKEY(PKEY_BRIGHTNESSDOWN)
  777. VKEY_BRIGHTNESSUP   = KIT_PKEY_TO_VKEY(PKEY_BRIGHTNESSUP)
  778. VKEY_DISPLAYSWITCH  = KIT_PKEY_TO_VKEY(PKEY_DISPLAYSWITCH)
  779. VKEY_KBDILLUMTOGGLE = KIT_PKEY_TO_VKEY(PKEY_KBDILLUMTOGGLE)
  780. VKEY_KBDILLUMDOWN   = KIT_PKEY_TO_VKEY(PKEY_KBDILLUMDOWN)
  781. VKEY_KBDILLUMUP     = KIT_PKEY_TO_VKEY(PKEY_KBDILLUMUP)
  782. VKEY_EJECT          = KIT_PKEY_TO_VKEY(PKEY_EJECT)
  783. VKEY_SLEEP          = KIT_PKEY_TO_VKEY(PKEY_SLEEP)
  784. VKEY_APP1           = KIT_PKEY_TO_VKEY(PKEY_APP1)
  785. VKEY_APP2           = KIT_PKEY_TO_VKEY(PKEY_APP2)
  786.  
  787. VKEY_AUDIOREWIND      = KIT_PKEY_TO_VKEY(PKEY_AUDIOREWIND)
  788. VKEY_AUDIOFASTFORWARD = KIT_PKEY_TO_VKEY(PKEY_AUDIOFASTFORWARD)
  789.  
  790. VKEY_SOFTLEFT  = KIT_PKEY_TO_VKEY(PKEY_SOFTLEFT)
  791. VKEY_SOFTRIGHT = KIT_PKEY_TO_VKEY(PKEY_SOFTRIGHT)
  792. VKEY_CALL      = KIT_PKEY_TO_VKEY(PKEY_CALL)
  793. VKEY_ENDCALL   = KIT_PKEY_TO_VKEY(PKEY_ENDCALL)
  794.  
  795.  
  796.  
  797. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  798.  
  799.  
  800.  
  801.  
  802.  
  803. ; integer bounds
  804. U8_MAX  = 0xFF
  805. U16_MAX = 0xFFFF
  806. U24_MAX = 0xFFFFFF
  807. U32_MAX = 0xFFFFFFFF
  808.  ;
  809. S8_MIN  = 0x80
  810. S8_MAX  = 0x7F
  811. S16_MIN = 0x8000
  812. S16_MAX = 0x7FFF
  813. S24_MIN = 0x800000
  814. S24_MAX = 0x7FFFFF
  815. S32_MIN = 0x80000000
  816. S32_MAX = 0x7FFFFFFF
  817.  
  818.  
  819. ; most significant bits/Bytes
  820. MSb_8  = 0x80
  821. MSb_16 = 0x8000
  822. MSb_24 = 0x800000
  823. MSb_32 = 0x80000000
  824.  ;
  825. MSB_8  = 0xFF
  826. MSB_16 = 0xFF00
  827. MSB_24 = 0xFF0000
  828. MSB_32 = 0xFF000000
  829.  
  830.  
  831.  
  832.  
  833.  
  834. ;* -------------------------------------------------------------------------- *;
  835. ;* -------------------------------------------------------------------------- *;
  836.  
  837.  
  838.  
  839.  
  840.  
  841. ;(flg and *flg are only available for dst)
  842. #subruledef reg_src
  843. {
  844.   ;by value
  845.   r0  => 0b0000`4
  846.   r1  => 0b0001`4
  847.   r2  => 0b0010`4
  848.   r3  => 0b0011`4
  849.   r4  => 0b0100`4
  850.   r5  => 0b0101`4
  851.   sp  => 0b0110`4
  852.  
  853.   ;by reference
  854.   *r0  => 0b1000`4
  855.   *r1  => 0b1001`4
  856.   *r2  => 0b1010`4
  857.   *r3  => 0b1011`4
  858.   *r4  => 0b1100`4
  859.   *r5  => 0b1101`4
  860.   *sp  => 0b1110`4
  861. }
  862.  
  863. #subruledef reg_dst
  864. {
  865.   ;by value
  866.   r0  => 0b0000`4
  867.   r1  => 0b0001`4
  868.   r2  => 0b0010`4
  869.   r3  => 0b0011`4
  870.   r4  => 0b0100`4
  871.   r5  => 0b0101`4
  872.   sp  => 0b0110`4
  873.   flg => 0b0111`4
  874.  
  875.   ;by reference
  876.   *r0  => 0b1000`4
  877.   *r1  => 0b1001`4
  878.   *r2  => 0b1010`4
  879.   *r3  => 0b1011`4
  880.   *r4  => 0b1100`4
  881.   *r5  => 0b1101`4
  882.   *sp  => 0b1110`4
  883.   *flg => 0b1111`4
  884. }
  885.  
  886.  
  887.  
  888.  
  889.  
  890. #fn _imm8(v8)   => v8[7:0] @ 0`8
  891. #fn _imm16(v16) => lend16(v16)
  892. #fn _imm32(v32) => 0`16 @ lend32(v32)
  893.  
  894.  
  895.  
  896.  
  897.  
  898. #fn _dU8(op, dst, src) => 0b000`3 @ op`5  @  dst`4 @ src`4
  899.  
  900. #ruledef datatype_u8 { ;data = 0b000
  901.   brk.u8 => _dU8(0,0,0) @ _imm16(0) ;(tbd)
  902.  
  903.  
  904.  
  905.   mov.u8 {d: reg_dst}, {s: reg_src} => _dU8(1,d,s) @ _imm16(0) ;d = s
  906.   cmp.u8 {d: reg_dst}, {s: reg_src} => _dU8(2,d,s) @ _imm16(0) ;compare d and s
  907.  
  908.   mov.u8 {d: reg_dst},  #{v: u8} => _dU8(1,d, 7) @ _imm8(v)
  909.   cmp.u8 {d: reg_dst},  #{v: u8} => _dU8(2,d, 7) @ _imm8(v)
  910.  
  911.   mov.u8 {d: reg_dst}, *#{p: u32} => _dU8(1,d,15) @ _imm32(p)
  912.   cmp.u8 {d: reg_dst}, *#{p: u32} => _dU8(2,d,15) @ _imm32(p)
  913.  
  914.  
  915.  
  916.   jmp.u8 {s: reg_src} => _dU8(3,0,s) @ _imm16(0) ;unconditional jump to s
  917.   jsr.u8 {s: reg_src} => _dU8(4,0,s) @ _imm16(0) ;jump to subroutine in s
  918.  
  919.   jmp.u8  #{v: u8} => _dU8(3,0, 7) @ _imm8(v)
  920.   jsr.u8  #{v: u8} => _dU8(4,0, 7) @ _imm8(v)
  921.  
  922.   jmp.u8 *#{p: u32} => _dU8(3,0,15) @ _imm32(p)
  923.   jsr.u8 *#{p: u32} => _dU8(4,0,15) @ _imm32(p)
  924.  
  925.  
  926.  
  927.   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)
  928.   sst.u8 {d: reg_dst}, {s: reg_src} => _dU8(6,d, s) @ _imm16(0) ;store d to stack offset  (s16 s, relative to sp)
  929.  
  930.   sld.u8 {d: reg_dst},  #{v: s16} => _dU8(5,d, 7) @ _imm16(v)
  931.   sst.u8 {d: reg_dst},  #{v: s16} => _dU8(6,d, 7) @ _imm16(v)
  932.  
  933.   sld.u8 {d: reg_dst}, *#{p: u32} => _dU8(5,d,15) @ _imm32(p)
  934.   sst.u8 {d: reg_dst}, *#{p: u32} => _dU8(6,d,15) @ _imm32(p)
  935.  
  936.   sph.u8 {s: reg_src} => _dU8(7,0,s) @ _imm16(0) ;push s to stack
  937.  
  938.   sph.u8  #{v: u8 } => _dU8(7,0, 7) @ _imm8(v)
  939.  
  940.   sph.u8 *#{p: u32} => _dU8(7,0,15) @ _imm32(p)
  941.  
  942.   spl.u8 {d: reg_dst} => _dU8(8,d,0) @ _imm16(0) ;pull from stack into d
  943.  
  944.  
  945.  
  946.   inc.u8 {d: reg_dst} => _dU8( 9,d,0) @ _imm16(0) ;++d
  947.   dec.u8 {d: reg_dst} => _dU8(10,d,0) @ _imm16(0) ;--d
  948.  
  949.   add.u8 {d: reg_dst}, {s: reg_src} => _dU8(11,d,s) @ _imm16(0) ;d += s
  950.   sub.u8 {d: reg_dst}, {s: reg_src} => _dU8(12,d,s) @ _imm16(0) ;d -= s
  951.   mul.u8 {d: reg_dst}, {s: reg_src} => _dU8(13,d,s) @ _imm16(0) ;d *= s
  952.   div.u8 {d: reg_dst}, {s: reg_src} => _dU8(14,d,s) @ _imm16(0) ;d /= s
  953.   mod.u8 {d: reg_dst}, {s: reg_src} => _dU8(15,d,s) @ _imm16(0) ;d %= s
  954.   neg.u8 {d: reg_dst}, {s: reg_src} => _dU8(16,d,s) @ _imm16(0) ;d = -s
  955.  
  956.   add.u8 {d: reg_dst},  #{v: u8} => _dU8(11,d, 7) @ _imm8(v)
  957.   sub.u8 {d: reg_dst},  #{v: u8} => _dU8(12,d, 7) @ _imm8(v)
  958.   mul.u8 {d: reg_dst},  #{v: u8} => _dU8(13,d, 7) @ _imm8(v)
  959.   div.u8 {d: reg_dst},  #{v: u8} => _dU8(14,d, 7) @ _imm8(v)
  960.   mod.u8 {d: reg_dst},  #{v: u8} => _dU8(15,d, 7) @ _imm8(v)
  961.   neg.u8 {d: reg_dst},  #{v: u8} => _dU8(16,d, 7) @ _imm8(v)
  962.  
  963.   add.u8 {d: reg_dst}, *#{p: u32} => _dU8(11,d,15) @ _imm32(p)
  964.   sub.u8 {d: reg_dst}, *#{p: u32} => _dU8(12,d,15) @ _imm32(p)
  965.   mul.u8 {d: reg_dst}, *#{p: u32} => _dU8(13,d,15) @ _imm32(p)
  966.   div.u8 {d: reg_dst}, *#{p: u32} => _dU8(14,d,15) @ _imm32(p)
  967.   mod.u8 {d: reg_dst}, *#{p: u32} => _dU8(15,d,15) @ _imm32(p)
  968.   neg.u8 {d: reg_dst}, *#{p: u32} => _dU8(16,d,15) @ _imm32(p)
  969.  
  970.  
  971.  
  972.   not.u8 {d: reg_dst}, {s: reg_src} => _dU8(17,d,s) @ _imm16(0) ;~
  973.   nnd.u8 {d: reg_dst}, {s: reg_src} => _dU8(18,d,s) @ _imm16(0) ;& ~
  974.   and.u8 {d: reg_dst}, {s: reg_src} => _dU8(19,d,s) @ _imm16(0) ;&
  975.   nor.u8 {d: reg_dst}, {s: reg_src} => _dU8(20,d,s) @ _imm16(0) ;| ~
  976.   ior.u8 {d: reg_dst}, {s: reg_src} => _dU8(21,d,s) @ _imm16(0) ;|
  977.   xor.u8 {d: reg_dst}, {s: reg_src} => _dU8(22,d,s) @ _imm16(0) ;^
  978.   shl.u8 {d: reg_dst}, {s: reg_src} => _dU8(23,d,s) @ _imm16(0) ;<<
  979.   shr.u8 {d: reg_dst}, {s: reg_src} => _dU8(24,d,s) @ _imm16(0) ;>>
  980.   rol.u8 {d: reg_dst}, {s: reg_src} => _dU8(25,d,s) @ _imm16(0) ;rotate left
  981.   ror.u8 {d: reg_dst}, {s: reg_src} => _dU8(26,d,s) @ _imm16(0) ;rotate right
  982.   ext.u8 {d: reg_dst}, {s: reg_src} => _dU8(27,d,s) @ _imm16(0) ;sign extension
  983.  
  984.   not.u8 {d: reg_dst},  #{v: u8 } => _dU8(17,d, 7) @ _imm8(v)
  985.   nnd.u8 {d: reg_dst},  #{v: u8 } => _dU8(18,d, 7) @ _imm8(v)
  986.   and.u8 {d: reg_dst},  #{v: u8 } => _dU8(19,d, 7) @ _imm8(v)
  987.   nor.u8 {d: reg_dst},  #{v: u8 } => _dU8(20,d, 7) @ _imm8(v)
  988.   ior.u8 {d: reg_dst},  #{v: u8 } => _dU8(21,d, 7) @ _imm8(v)
  989.   xor.u8 {d: reg_dst},  #{v: u8 } => _dU8(22,d, 7) @ _imm8(v)
  990.   shl.u8 {d: reg_dst},  #{v: u8 } => _dU8(23,d, 7) @ _imm8(v)
  991.   shr.u8 {d: reg_dst},  #{v: u8 } => _dU8(24,d, 7) @ _imm8(v)
  992.   rol.u8 {d: reg_dst},  #{v: u8 } => _dU8(25,d, 7) @ _imm8(v)
  993.   ror.u8 {d: reg_dst},  #{v: u8 } => _dU8(26,d, 7) @ _imm8(v)
  994.   ext.u8 {d: reg_dst},  #{v: u8 } => _dU8(27,d, 7) @ _imm8(v)
  995.  
  996.   not.u8 {d: reg_dst}, *#{p: u32} => _dU8(17,d,15) @ _imm32(p)
  997.   nnd.u8 {d: reg_dst}, *#{p: u32} => _dU8(18,d,15) @ _imm32(p)
  998.   and.u8 {d: reg_dst}, *#{p: u32} => _dU8(19,d,15) @ _imm32(p)
  999.   nor.u8 {d: reg_dst}, *#{p: u32} => _dU8(20,d,15) @ _imm32(p)
  1000.   ior.u8 {d: reg_dst}, *#{p: u32} => _dU8(21,d,15) @ _imm32(p)
  1001.   xor.u8 {d: reg_dst}, *#{p: u32} => _dU8(22,d,15) @ _imm32(p)
  1002.   shl.u8 {d: reg_dst}, *#{p: u32} => _dU8(23,d,15) @ _imm32(p)
  1003.   shr.u8 {d: reg_dst}, *#{p: u32} => _dU8(24,d,15) @ _imm32(p)
  1004.   rol.u8 {d: reg_dst}, *#{p: u32} => _dU8(25,d,15) @ _imm32(p)
  1005.   ror.u8 {d: reg_dst}, *#{p: u32} => _dU8(26,d,15) @ _imm32(p)
  1006.   ext.u8 {d: reg_dst}, *#{p: u32} => _dU8(27,d,15) @ _imm32(p)
  1007.  
  1008.  
  1009.  
  1010.   jfn.u8 {s: reg_src} => _dU8(28,0,s) @ _imm16(0)
  1011.  
  1012.   jfn.u8  #{v: u8} => _dU8(28,0, 7) @ _imm8(v)
  1013.  
  1014.   jfn.u8 *#{p: u32} => _dU8(28,0,15) @ _imm32(p)
  1015.  
  1016. }
  1017.  
  1018.  
  1019.  
  1020.  
  1021.  
  1022. #fn _dS8(op, dst, src) => 0b100`3 @ op`5  @  dst`4 @ src`4
  1023.  
  1024. #ruledef datatype_s8 { ;data = 0b100
  1025.   brk.s8 => _dS8(0,0,0) @ _imm16(0) ;(tbd)
  1026.  
  1027.  
  1028.  
  1029.   mov.s8 {d: reg_dst}, {s: reg_src} => _dS8(1,d,s) @ _imm16(0) ;d = s
  1030.   cmp.s8 {d: reg_dst}, {s: reg_src} => _dS8(2,d,s) @ _imm16(0) ;compare d and s
  1031.  
  1032.   mov.s8 {d: reg_dst},  #{v: s8} => _dS8(1,d, 7) @ _imm8(v)
  1033.   cmp.s8 {d: reg_dst},  #{v: s8} => _dS8(2,d, 7) @ _imm8(v)
  1034.  
  1035.   mov.s8 {d: reg_dst}, *#{p: u32} => _dS8(1,d,15) @ _imm32(p)
  1036.   cmp.s8 {d: reg_dst}, *#{p: u32} => _dS8(2,d,15) @ _imm32(p)
  1037.  
  1038.  
  1039.  
  1040.   jmp.s8 {s: reg_src} => _dS8(3,0,s) @ _imm16(0) ;unconditional jump to s
  1041.   jsr.s8 {s: reg_src} => _dS8(4,0,s) @ _imm16(0) ;jump to subroutine in s
  1042.  
  1043.   jmp.s8  #{v: s8} => _dS8(3,0, 7) @ _imm8(v)
  1044.   jsr.s8  #{v: s8} => _dS8(4,0, 7) @ _imm8(v)
  1045.  
  1046.   jmp.s8 *#{p: u32} => _dS8(3,0,15) @ _imm32(p)
  1047.   jsr.s8 *#{p: u32} => _dS8(4,0,15) @ _imm32(p)
  1048.  
  1049.  
  1050.  
  1051.   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)
  1052.   sst.s8 {d: reg_dst}, {s: reg_src} => _dS8(6,d, s) @ _imm16(0) ;store d to stack offset  (s16 s, relative to sp)
  1053.  
  1054.   sld.s8 {d: reg_dst},  #{v: s16} => _dS8(5,d, 7) @ _imm16(v)
  1055.   sst.s8 {d: reg_dst},  #{v: s16} => _dS8(6,d, 7) @ _imm16(v)
  1056.  
  1057.   sld.s8 {d: reg_dst}, *#{p: u32} => _dS8(5,d,15) @ _imm32(p)
  1058.   sst.s8 {d: reg_dst}, *#{p: u32} => _dS8(6,d,15) @ _imm32(p)
  1059.  
  1060.   sph.s8 {s: reg_src} => _dS8(7,0,s) @ _imm16(0) ;push s to stack
  1061.  
  1062.   sph.s8  #{v: s8 } => _dS8(7,0, 7) @ _imm8(v)
  1063.  
  1064.   sph.s8 *#{p: u32} => _dS8(7,0,15) @ _imm32(p)
  1065.  
  1066.   spl.s8 {d: reg_dst} => _dS8(8,d,0) @ _imm16(0) ;pull from stack into d
  1067.  
  1068.  
  1069.  
  1070.   inc.s8 {d: reg_dst} => _dS8( 9,d,0) @ _imm16(0) ;++d
  1071.   dec.s8 {d: reg_dst} => _dS8(10,d,0) @ _imm16(0) ;--d
  1072.  
  1073.   add.s8 {d: reg_dst}, {s: reg_src} => _dS8(11,d,s) @ _imm16(0) ;d += s
  1074.   sub.s8 {d: reg_dst}, {s: reg_src} => _dS8(12,d,s) @ _imm16(0) ;d -= s
  1075.   mul.s8 {d: reg_dst}, {s: reg_src} => _dS8(13,d,s) @ _imm16(0) ;d *= s
  1076.   div.s8 {d: reg_dst}, {s: reg_src} => _dS8(14,d,s) @ _imm16(0) ;d /= s
  1077.   mod.s8 {d: reg_dst}, {s: reg_src} => _dS8(15,d,s) @ _imm16(0) ;d %= s
  1078.   neg.s8 {d: reg_dst}, {s: reg_src} => _dS8(16,d,s) @ _imm16(0) ;d = -s
  1079.  
  1080.   add.s8 {d: reg_dst},  #{v: s8} => _dS8(11,d, 7) @ _imm8(v)
  1081.   sub.s8 {d: reg_dst},  #{v: s8} => _dS8(12,d, 7) @ _imm8(v)
  1082.   mul.s8 {d: reg_dst},  #{v: s8} => _dS8(13,d, 7) @ _imm8(v)
  1083.   div.s8 {d: reg_dst},  #{v: s8} => _dS8(14,d, 7) @ _imm8(v)
  1084.   mod.s8 {d: reg_dst},  #{v: s8} => _dS8(15,d, 7) @ _imm8(v)
  1085.   neg.s8 {d: reg_dst},  #{v: s8} => _dS8(16,d, 7) @ _imm8(v)
  1086.  
  1087.   add.s8 {d: reg_dst}, *#{p: u32} => _dS8(11,d,15) @ _imm32(p)
  1088.   sub.s8 {d: reg_dst}, *#{p: u32} => _dS8(12,d,15) @ _imm32(p)
  1089.   mul.s8 {d: reg_dst}, *#{p: u32} => _dS8(13,d,15) @ _imm32(p)
  1090.   div.s8 {d: reg_dst}, *#{p: u32} => _dS8(14,d,15) @ _imm32(p)
  1091.   mod.s8 {d: reg_dst}, *#{p: u32} => _dS8(15,d,15) @ _imm32(p)
  1092.   neg.s8 {d: reg_dst}, *#{p: u32} => _dS8(16,d,15) @ _imm32(p)
  1093.  
  1094.  
  1095.  
  1096.   not.s8 {d: reg_dst}, {s: reg_src} => _dS8(17,d,s) @ _imm16(0) ;~
  1097.   nnd.s8 {d: reg_dst}, {s: reg_src} => _dS8(18,d,s) @ _imm16(0) ;& ~
  1098.   and.s8 {d: reg_dst}, {s: reg_src} => _dS8(19,d,s) @ _imm16(0) ;&
  1099.   nor.s8 {d: reg_dst}, {s: reg_src} => _dS8(20,d,s) @ _imm16(0) ;| ~
  1100.   ior.s8 {d: reg_dst}, {s: reg_src} => _dS8(21,d,s) @ _imm16(0) ;|
  1101.   xor.s8 {d: reg_dst}, {s: reg_src} => _dS8(22,d,s) @ _imm16(0) ;^
  1102.   shl.s8 {d: reg_dst}, {s: reg_src} => _dS8(23,d,s) @ _imm16(0) ;<<
  1103.   shr.s8 {d: reg_dst}, {s: reg_src} => _dS8(24,d,s) @ _imm16(0) ;>>
  1104.   rol.s8 {d: reg_dst}, {s: reg_src} => _dS8(25,d,s) @ _imm16(0) ;rotate left
  1105.   ror.s8 {d: reg_dst}, {s: reg_src} => _dS8(26,d,s) @ _imm16(0) ;rotate right
  1106.   ext.s8 {d: reg_dst}, {s: reg_src} => _dS8(27,d,s) @ _imm16(0) ;sign extension
  1107.  
  1108.   not.s8 {d: reg_dst},  #{v: s8} => _dS8(17,d, 7) @ _imm8(v)
  1109.   nnd.s8 {d: reg_dst},  #{v: s8} => _dS8(18,d, 7) @ _imm8(v)
  1110.   and.s8 {d: reg_dst},  #{v: s8} => _dS8(19,d, 7) @ _imm8(v)
  1111.   nor.s8 {d: reg_dst},  #{v: s8} => _dS8(20,d, 7) @ _imm8(v)
  1112.   ior.s8 {d: reg_dst},  #{v: s8} => _dS8(21,d, 7) @ _imm8(v)
  1113.   xor.s8 {d: reg_dst},  #{v: s8} => _dS8(22,d, 7) @ _imm8(v)
  1114.   shl.s8 {d: reg_dst},  #{v: s8} => _dS8(23,d, 7) @ _imm8(v)
  1115.   shr.s8 {d: reg_dst},  #{v: s8} => _dS8(24,d, 7) @ _imm8(v)
  1116.   rol.s8 {d: reg_dst},  #{v: s8} => _dS8(25,d, 7) @ _imm8(v)
  1117.   ror.s8 {d: reg_dst},  #{v: s8} => _dS8(26,d, 7) @ _imm8(v)
  1118.   ext.s8 {d: reg_dst},  #{v: s8} => _dS8(27,d, 7) @ _imm8(v)
  1119.  
  1120.   not.s8 {d: reg_dst}, *#{p: u32} => _dS8(17,d,15) @ _imm32(p)
  1121.   nnd.s8 {d: reg_dst}, *#{p: u32} => _dS8(18,d,15) @ _imm32(p)
  1122.   and.s8 {d: reg_dst}, *#{p: u32} => _dS8(19,d,15) @ _imm32(p)
  1123.   nor.s8 {d: reg_dst}, *#{p: u32} => _dS8(20,d,15) @ _imm32(p)
  1124.   ior.s8 {d: reg_dst}, *#{p: u32} => _dS8(21,d,15) @ _imm32(p)
  1125.   xor.s8 {d: reg_dst}, *#{p: u32} => _dS8(22,d,15) @ _imm32(p)
  1126.   shl.s8 {d: reg_dst}, *#{p: u32} => _dS8(23,d,15) @ _imm32(p)
  1127.   shr.s8 {d: reg_dst}, *#{p: u32} => _dS8(24,d,15) @ _imm32(p)
  1128.   rol.s8 {d: reg_dst}, *#{p: u32} => _dS8(25,d,15) @ _imm32(p)
  1129.   ror.s8 {d: reg_dst}, *#{p: u32} => _dS8(26,d,15) @ _imm32(p)
  1130.   ext.s8 {d: reg_dst}, *#{p: u32} => _dS8(27,d,15) @ _imm32(p)
  1131.  
  1132.  
  1133.  
  1134.   jfn.s8 {s: reg_src} => _dS8(28,0,s) @ _imm16(0)
  1135.  
  1136.   jfn.s8  #{v: s8} => _dS8(28,0, 7) @ _imm8(v)
  1137.  
  1138.   jfn.s8 *#{p: u32} => _dS8(28,0,15) @ _imm32(p)
  1139.  
  1140. }
  1141.  
  1142.  
  1143.  
  1144.  
  1145.  
  1146. #fn _dU16(op, dst, src) => 0b001`3 @ op`5  @  dst`4 @ src`4
  1147.  
  1148. #ruledef datatype_u16 { ;data = 0b001
  1149.   brk.u16 => _dU16(0,0,0) @ _imm16(0) ;(tbd)
  1150.  
  1151.  
  1152.  
  1153.   mov.u16 {d: reg_dst}, {s: reg_src} => _dU16(1,d,s) @ _imm16(0) ;d = s
  1154.   cmp.u16 {d: reg_dst}, {s: reg_src} => _dU16(2,d,s) @ _imm16(0) ;compare d and s
  1155.  
  1156.   mov.u16 {d: reg_dst},  #{v: u16} => _dU16(1,d, 7) @ _imm16(v)
  1157.   cmp.u16 {d: reg_dst},  #{v: u16} => _dU16(2,d, 7) @ _imm16(v)
  1158.  
  1159.   mov.u16 {d: reg_dst}, *#{p: u32} => _dU16(1,d,15) @ _imm32(p)
  1160.   cmp.u16 {d: reg_dst}, *#{p: u32} => _dU16(2,d,15) @ _imm32(p)
  1161.  
  1162.  
  1163.  
  1164.   jmp.u16 {s: reg_src} => _dU16(3,0,s) @ _imm16(0) ;unconditional jump to s
  1165.   jsr.u16 {s: reg_src} => _dU16(4,0,s) @ _imm16(0) ;jump to subroutine in s
  1166.  
  1167.   jmp.u16  #{v: u16} => _dU16(3,0, 7) @ _imm16(v)
  1168.   jsr.u16  #{v: u16} => _dU16(4,0, 7) @ _imm16(v)
  1169.  
  1170.   jmp.u16 *#{p: u32} => _dU16(3,0,15) @ _imm32(p)
  1171.   jsr.u16 *#{p: u32} => _dU16(4,0,15) @ _imm32(p)
  1172.  
  1173.  
  1174.  
  1175.   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)
  1176.   sst.u16 {d: reg_dst}, {s: reg_src} => _dU16(6,d, s) @ _imm16(0) ;store d to stack offset  (s16 s, relative to sp)
  1177.  
  1178.   sld.u16 {d: reg_dst},  #{v: s16} => _dU16(5,d, 7) @ _imm16(v)
  1179.   sst.u16 {d: reg_dst},  #{v: s16} => _dU16(6,d, 7) @ _imm16(v)
  1180.  
  1181.   sld.u16 {d: reg_dst}, *#{p: u32} => _dU16(5,d,15) @ _imm32(p)
  1182.   sst.u16 {d: reg_dst}, *#{p: u32} => _dU16(6,d,15) @ _imm32(p)
  1183.  
  1184.   sph.u16 {s: reg_src} => _dU16(7,0,s) @ _imm16(0) ;push s to stack
  1185.  
  1186.   sph.u16  #{v: u16} => _dU16(7,0, 7) @ _imm16(v)
  1187.  
  1188.   sph.u16 *#{p: u32} => _dU16(7,0,15) @ _imm32(p)
  1189.  
  1190.   spl.u16 {d: reg_dst} => _dU16(8,d,0) @ _imm16(0) ;pull from stack into d
  1191.  
  1192.  
  1193.  
  1194.   inc.u16 {d: reg_dst} => _dU16( 9,d,0) @ _imm16(0) ;++d
  1195.   dec.u16 {d: reg_dst} => _dU16(10,d,0) @ _imm16(0) ;--d
  1196.  
  1197.   add.u16 {d: reg_dst}, {s: reg_src} => _dU16(11,d,s) @ _imm16(0) ;d += s
  1198.   sub.u16 {d: reg_dst}, {s: reg_src} => _dU16(12,d,s) @ _imm16(0) ;d -= s
  1199.   mul.u16 {d: reg_dst}, {s: reg_src} => _dU16(13,d,s) @ _imm16(0) ;d *= s
  1200.   div.u16 {d: reg_dst}, {s: reg_src} => _dU16(14,d,s) @ _imm16(0) ;d /= s
  1201.   mod.u16 {d: reg_dst}, {s: reg_src} => _dU16(15,d,s) @ _imm16(0) ;d %= s
  1202.   neg.u16 {d: reg_dst}, {s: reg_src} => _dU16(16,d,s) @ _imm16(0) ;d = -s
  1203.  
  1204.   add.u16 {d: reg_dst},  #{v: u16} => _dU16(11,d, 7) @ _imm16(v)
  1205.   sub.u16 {d: reg_dst},  #{v: u16} => _dU16(12,d, 7) @ _imm16(v)
  1206.   mul.u16 {d: reg_dst},  #{v: u16} => _dU16(13,d, 7) @ _imm16(v)
  1207.   div.u16 {d: reg_dst},  #{v: u16} => _dU16(14,d, 7) @ _imm16(v)
  1208.   mod.u16 {d: reg_dst},  #{v: u16} => _dU16(15,d, 7) @ _imm16(v)
  1209.   neg.u16 {d: reg_dst},  #{v: u16} => _dU16(16,d, 7) @ _imm16(v)
  1210.  
  1211.   add.u16 {d: reg_dst}, *#{p: u32} => _dU16(11,d,15) @ _imm32(p)
  1212.   sub.u16 {d: reg_dst}, *#{p: u32} => _dU16(12,d,15) @ _imm32(p)
  1213.   mul.u16 {d: reg_dst}, *#{p: u32} => _dU16(13,d,15) @ _imm32(p)
  1214.   div.u16 {d: reg_dst}, *#{p: u32} => _dU16(14,d,15) @ _imm32(p)
  1215.   mod.u16 {d: reg_dst}, *#{p: u32} => _dU16(15,d,15) @ _imm32(p)
  1216.   neg.u16 {d: reg_dst}, *#{p: u32} => _dU16(16,d,15) @ _imm32(p)
  1217.  
  1218.  
  1219.  
  1220.   not.u16 {d: reg_dst}, {s: reg_src} => _dU16(17,d,s) @ _imm16(0) ;~
  1221.   nnd.u16 {d: reg_dst}, {s: reg_src} => _dU16(18,d,s) @ _imm16(0) ;& ~
  1222.   and.u16 {d: reg_dst}, {s: reg_src} => _dU16(19,d,s) @ _imm16(0) ;&
  1223.   nor.u16 {d: reg_dst}, {s: reg_src} => _dU16(20,d,s) @ _imm16(0) ;| ~
  1224.   ior.u16 {d: reg_dst}, {s: reg_src} => _dU16(21,d,s) @ _imm16(0) ;|
  1225.   xor.u16 {d: reg_dst}, {s: reg_src} => _dU16(22,d,s) @ _imm16(0) ;^
  1226.   shl.u16 {d: reg_dst}, {s: reg_src} => _dU16(23,d,s) @ _imm16(0) ;<<
  1227.   shr.u16 {d: reg_dst}, {s: reg_src} => _dU16(24,d,s) @ _imm16(0) ;>>
  1228.   rol.u16 {d: reg_dst}, {s: reg_src} => _dU16(25,d,s) @ _imm16(0) ;rotate left
  1229.   ror.u16 {d: reg_dst}, {s: reg_src} => _dU16(26,d,s) @ _imm16(0) ;rotate right
  1230.   ext.u16 {d: reg_dst}, {s: reg_src} => _dU16(27,d,s) @ _imm16(0) ;sign extension
  1231.  
  1232.   not.u16 {d: reg_dst},  #{v: u16} => _dU16(17,d, 7) @ _imm16(v)
  1233.   nnd.u16 {d: reg_dst},  #{v: u16} => _dU16(18,d, 7) @ _imm16(v)
  1234.   and.u16 {d: reg_dst},  #{v: u16} => _dU16(19,d, 7) @ _imm16(v)
  1235.   nor.u16 {d: reg_dst},  #{v: u16} => _dU16(20,d, 7) @ _imm16(v)
  1236.   ior.u16 {d: reg_dst},  #{v: u16} => _dU16(21,d, 7) @ _imm16(v)
  1237.   xor.u16 {d: reg_dst},  #{v: u16} => _dU16(22,d, 7) @ _imm16(v)
  1238.   shl.u16 {d: reg_dst},  #{v: u16} => _dU16(23,d, 7) @ _imm16(v)
  1239.   shr.u16 {d: reg_dst},  #{v: u16} => _dU16(24,d, 7) @ _imm16(v)
  1240.   rol.u16 {d: reg_dst},  #{v: u16} => _dU16(25,d, 7) @ _imm16(v)
  1241.   ror.u16 {d: reg_dst},  #{v: u16} => _dU16(26,d, 7) @ _imm16(v)
  1242.   ext.u16 {d: reg_dst},  #{v: u16} => _dU16(27,d, 7) @ _imm16(v)
  1243.  
  1244.   not.u16 {d: reg_dst}, *#{p: u32} => _dU16(17,d,15) @ _imm32(p)
  1245.   nnd.u16 {d: reg_dst}, *#{p: u32} => _dU16(18,d,15) @ _imm32(p)
  1246.   and.u16 {d: reg_dst}, *#{p: u32} => _dU16(19,d,15) @ _imm32(p)
  1247.   nor.u16 {d: reg_dst}, *#{p: u32} => _dU16(20,d,15) @ _imm32(p)
  1248.   ior.u16 {d: reg_dst}, *#{p: u32} => _dU16(21,d,15) @ _imm32(p)
  1249.   xor.u16 {d: reg_dst}, *#{p: u32} => _dU16(22,d,15) @ _imm32(p)
  1250.   shl.u16 {d: reg_dst}, *#{p: u32} => _dU16(23,d,15) @ _imm32(p)
  1251.   shr.u16 {d: reg_dst}, *#{p: u32} => _dU16(24,d,15) @ _imm32(p)
  1252.   rol.u16 {d: reg_dst}, *#{p: u32} => _dU16(25,d,15) @ _imm32(p)
  1253.   ror.u16 {d: reg_dst}, *#{p: u32} => _dU16(26,d,15) @ _imm32(p)
  1254.   ext.u16 {d: reg_dst}, *#{p: u32} => _dU16(27,d,15) @ _imm32(p)
  1255.  
  1256.  
  1257.  
  1258.   jfn.u16 {s: reg_src} => _dU16(28,0,s) @ _imm16(0)
  1259.  
  1260.   jfn.u16  #{v: u16} => _dU16(28,0, 7) @ _imm16(v)
  1261.  
  1262.   jfn.u16 *#{p: u32} => _dU16(28,0,15) @ _imm32(p)
  1263.  
  1264. }
  1265.  
  1266.  
  1267.  
  1268.  
  1269.  
  1270. #fn _dS16(op, dst, src) => 0b101`3 @ op`5  @  dst`4 @ src`4
  1271.  
  1272. #ruledef datatype_s16 { ;data = 0b101
  1273.   brk.s16 => _dS16(0,0,0) @ _imm16(0) ;(tbd)
  1274.  
  1275.  
  1276.  
  1277.   mov.s16 {d: reg_dst}, {s: reg_src} => _dS16(1,d,s) @ _imm16(0) ;d = s
  1278.   cmp.s16 {d: reg_dst}, {s: reg_src} => _dS16(2,d,s) @ _imm16(0) ;compare d and s
  1279.  
  1280.   mov.s16 {d: reg_dst},  #{v: s16} => _dS16(1,d, 7) @ _imm16(v)
  1281.   cmp.s16 {d: reg_dst},  #{v: s16} => _dS16(2,d, 7) @ _imm16(v)
  1282.  
  1283.   mov.s16 {d: reg_dst}, *#{p: u32} => _dS16(1,d,15) @ _imm32(p)
  1284.   cmp.s16 {d: reg_dst}, *#{p: u32} => _dS16(2,d,15) @ _imm32(p)
  1285.  
  1286.  
  1287.  
  1288.   jmp.s16 {s: reg_src} => _dS16(3,0,s) @ _imm16(0) ;unconditional jump to s
  1289.   jsr.s16 {s: reg_src} => _dS16(4,0,s) @ _imm16(0) ;jump to subroutine in s
  1290.  
  1291.   jmp.s16  #{v: s16} => _dS16(3,0, 7) @ _imm16(v)
  1292.   jsr.s16  #{v: s16} => _dS16(4,0, 7) @ _imm16(v)
  1293.  
  1294.   jmp.s16 *#{p: u32} => _dS16(3,0,15) @ _imm32(p)
  1295.   jsr.s16 *#{p: u32} => _dS16(4,0,15) @ _imm32(p)
  1296.  
  1297.  
  1298.  
  1299.   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)
  1300.   sst.s16 {d: reg_dst}, {s: reg_src} => _dS16(6,d, s) @ _imm16(0) ;store d to stack offset  (s16 s, relative to sp)
  1301.  
  1302.   sld.s16 {d: reg_dst},  #{v: s16} => _dS16(5,d, 7) @ _imm16(v)
  1303.   sst.s16 {d: reg_dst},  #{v: s16} => _dS16(6,d, 7) @ _imm16(v)
  1304.  
  1305.   sld.s16 {d: reg_dst}, *#{p: u32} => _dS16(5,d,15) @ _imm32(p)
  1306.   sst.s16 {d: reg_dst}, *#{p: u32} => _dS16(6,d,15) @ _imm32(p)
  1307.  
  1308.   sph.s16 {s: reg_src} => _dS16(7,0,s) @ _imm16(0) ;push s to stack
  1309.  
  1310.   sph.s16  #{v: s16} => _dS16(7,0, 7) @ _imm16(v)
  1311.  
  1312.   sph.s16 *#{p: u32} => _dS16(7,0,15) @ _imm32(p)
  1313.  
  1314.   spl.s16 {d: reg_dst} => _dS16(8,d,0) @ _imm16(0) ;pull from stack into d
  1315.  
  1316.  
  1317.  
  1318.   inc.s16 {d: reg_dst} => _dS16( 9,d,0) @ _imm16(0) ;++d
  1319.   dec.s16 {d: reg_dst} => _dS16(10,d,0) @ _imm16(0) ;--d
  1320.  
  1321.   add.s16 {d: reg_dst}, {s: reg_src} => _dS16(11,d,s) @ _imm16(0) ;d += s
  1322.   sub.s16 {d: reg_dst}, {s: reg_src} => _dS16(12,d,s) @ _imm16(0) ;d -= s
  1323.   mul.s16 {d: reg_dst}, {s: reg_src} => _dS16(13,d,s) @ _imm16(0) ;d *= s
  1324.   div.s16 {d: reg_dst}, {s: reg_src} => _dS16(14,d,s) @ _imm16(0) ;d /= s
  1325.   mod.s16 {d: reg_dst}, {s: reg_src} => _dS16(15,d,s) @ _imm16(0) ;d %= s
  1326.   neg.s16 {d: reg_dst}, {s: reg_src} => _dS16(16,d,s) @ _imm16(0) ;d = -s
  1327.  
  1328.   add.s16 {d: reg_dst},  #{v: s16} => _dS16(11,d, 7) @ _imm16(v)
  1329.   sub.s16 {d: reg_dst},  #{v: s16} => _dS16(12,d, 7) @ _imm16(v)
  1330.   mul.s16 {d: reg_dst},  #{v: s16} => _dS16(13,d, 7) @ _imm16(v)
  1331.   div.s16 {d: reg_dst},  #{v: s16} => _dS16(14,d, 7) @ _imm16(v)
  1332.   mod.s16 {d: reg_dst},  #{v: s16} => _dS16(15,d, 7) @ _imm16(v)
  1333.   neg.s16 {d: reg_dst},  #{v: s16} => _dS16(16,d, 7) @ _imm16(v)
  1334.  
  1335.   add.s16 {d: reg_dst}, *#{p: u32} => _dS16(11,d,15) @ _imm32(p)
  1336.   sub.s16 {d: reg_dst}, *#{p: u32} => _dS16(12,d,15) @ _imm32(p)
  1337.   mul.s16 {d: reg_dst}, *#{p: u32} => _dS16(13,d,15) @ _imm32(p)
  1338.   div.s16 {d: reg_dst}, *#{p: u32} => _dS16(14,d,15) @ _imm32(p)
  1339.   mod.s16 {d: reg_dst}, *#{p: u32} => _dS16(15,d,15) @ _imm32(p)
  1340.   neg.s16 {d: reg_dst}, *#{p: u32} => _dS16(16,d,15) @ _imm32(p)
  1341.  
  1342.  
  1343.  
  1344.   not.s16 {d: reg_dst}, {s: reg_src} => _dS16(17,d,s) @ _imm16(0) ;~
  1345.   nnd.s16 {d: reg_dst}, {s: reg_src} => _dS16(18,d,s) @ _imm16(0) ;& ~
  1346.   and.s16 {d: reg_dst}, {s: reg_src} => _dS16(19,d,s) @ _imm16(0) ;&
  1347.   nor.s16 {d: reg_dst}, {s: reg_src} => _dS16(20,d,s) @ _imm16(0) ;| ~
  1348.   ior.s16 {d: reg_dst}, {s: reg_src} => _dS16(21,d,s) @ _imm16(0) ;|
  1349.   xor.s16 {d: reg_dst}, {s: reg_src} => _dS16(22,d,s) @ _imm16(0) ;^
  1350.   shl.s16 {d: reg_dst}, {s: reg_src} => _dS16(23,d,s) @ _imm16(0) ;<<
  1351.   shr.s16 {d: reg_dst}, {s: reg_src} => _dS16(24,d,s) @ _imm16(0) ;>>
  1352.   rol.s16 {d: reg_dst}, {s: reg_src} => _dS16(25,d,s) @ _imm16(0) ;rotate left
  1353.   ror.s16 {d: reg_dst}, {s: reg_src} => _dS16(26,d,s) @ _imm16(0) ;rotate right
  1354.   ext.s16 {d: reg_dst}, {s: reg_src} => _dS16(27,d,s) @ _imm16(0) ;sign extension
  1355.  
  1356.   not.s16 {d: reg_dst},  #{v: s16} => _dS16(17,d, 7) @ _imm16(v)
  1357.   nnd.s16 {d: reg_dst},  #{v: s16} => _dS16(18,d, 7) @ _imm16(v)
  1358.   and.s16 {d: reg_dst},  #{v: s16} => _dS16(19,d, 7) @ _imm16(v)
  1359.   nor.s16 {d: reg_dst},  #{v: s16} => _dS16(20,d, 7) @ _imm16(v)
  1360.   ior.s16 {d: reg_dst},  #{v: s16} => _dS16(21,d, 7) @ _imm16(v)
  1361.   xor.s16 {d: reg_dst},  #{v: s16} => _dS16(22,d, 7) @ _imm16(v)
  1362.   shl.s16 {d: reg_dst},  #{v: s16} => _dS16(23,d, 7) @ _imm16(v)
  1363.   shr.s16 {d: reg_dst},  #{v: s16} => _dS16(24,d, 7) @ _imm16(v)
  1364.   rol.s16 {d: reg_dst},  #{v: s16} => _dS16(25,d, 7) @ _imm16(v)
  1365.   ror.s16 {d: reg_dst},  #{v: s16} => _dS16(26,d, 7) @ _imm16(v)
  1366.   ext.s16 {d: reg_dst},  #{v: s16} => _dS16(27,d, 7) @ _imm16(v)
  1367.  
  1368.   not.s16 {d: reg_dst}, *#{p: u32} => _dS16(17,d,15) @ _imm32(p)
  1369.   nnd.s16 {d: reg_dst}, *#{p: u32} => _dS16(18,d,15) @ _imm32(p)
  1370.   and.s16 {d: reg_dst}, *#{p: u32} => _dS16(19,d,15) @ _imm32(p)
  1371.   nor.s16 {d: reg_dst}, *#{p: u32} => _dS16(20,d,15) @ _imm32(p)
  1372.   ior.s16 {d: reg_dst}, *#{p: u32} => _dS16(21,d,15) @ _imm32(p)
  1373.   xor.s16 {d: reg_dst}, *#{p: u32} => _dS16(22,d,15) @ _imm32(p)
  1374.   shl.s16 {d: reg_dst}, *#{p: u32} => _dS16(23,d,15) @ _imm32(p)
  1375.   shr.s16 {d: reg_dst}, *#{p: u32} => _dS16(24,d,15) @ _imm32(p)
  1376.   rol.s16 {d: reg_dst}, *#{p: u32} => _dS16(25,d,15) @ _imm32(p)
  1377.   ror.s16 {d: reg_dst}, *#{p: u32} => _dS16(26,d,15) @ _imm32(p)
  1378.   ext.s16 {d: reg_dst}, *#{p: u32} => _dS16(27,d,15) @ _imm32(p)
  1379.  
  1380.  
  1381.  
  1382.   jfn.s16 {s: reg_src} => _dS16(28,0,s) @ _imm16(0)
  1383.  
  1384.   jfn.s16  #{v: s16} => _dS16(28,0, 7) @ _imm16(v)
  1385.  
  1386.   jfn.s16 *#{p: u32} => _dS16(29,0,15) @ _imm32(p)
  1387.  
  1388. }
  1389.  
  1390.  
  1391.  
  1392.  
  1393.  
  1394. #fn _dU32(op, dst, src) => 0b010`3 @ op`5  @  dst`4 @ src`4
  1395.  
  1396. #ruledef datatype_u32 { ;data = 0b010
  1397.   brk.u32 => _dU32(0,0,0) @ _imm16(0) ;(tbd)
  1398.   ;brk defaults to u32
  1399.   brk => _dU32(0,0,0) @ _imm16(0)
  1400.  
  1401.  
  1402.  
  1403.   mov.u32 {d: reg_dst}, {s: reg_src} => _dU32(1,d,s) @ _imm16(0) ;d = s
  1404.   cmp.u32 {d: reg_dst}, {s: reg_src} => _dU32(2,d,s) @ _imm16(0) ;compare d and s
  1405.  
  1406.   mov.u32 {d: reg_dst},  #{v: u32} => _dU32(1,d, 7) @ _imm32(v)
  1407.   cmp.u32 {d: reg_dst},  #{v: u32} => _dU32(2,d, 7) @ _imm32(v)
  1408.  
  1409.   mov.u32 {d: reg_dst}, *#{p: u32} => _dU32(1,d,15) @ _imm32(p)
  1410.   cmp.u32 {d: reg_dst}, *#{p: u32} => _dU32(2,d,15) @ _imm32(p)
  1411.  
  1412.  
  1413.  
  1414.   jmp.u32 {s: reg_src} => _dU32(3,0,s) @ _imm16(0) ;unconditional jump to s
  1415.   jsr.u32 {s: reg_src} => _dU32(4,0,s) @ _imm16(0) ;jump to subroutine in s
  1416.  
  1417.   jmp.u32  #{v: u32} => _dU32(3,0, 7) @ _imm32(v)
  1418.   jsr.u32  #{v: u32} => _dU32(4,0, 7) @ _imm32(v)
  1419.  
  1420.   jmp.u32 *#{p: u32} => _dU32(3,0,15) @ _imm32(p)
  1421.   jsr.u32 *#{p: u32} => _dU32(4,0,15) @ _imm32(p)
  1422.  
  1423.   ;jmp and jsr are naturally u32
  1424.   jmp {s: reg_src} => _dU32(3,0,s) @ _imm16(0)
  1425.   jsr {s: reg_src} => _dU32(4,0,s) @ _imm16(0)
  1426.  
  1427.   jmp  #{v: u32} => _dU32(3,0, 7) @ _imm32(v)
  1428.   jsr  #{v: u32} => _dU32(4,0, 7) @ _imm32(v)
  1429.  
  1430.   jmp *#{p: u32} => _dU32(3,0,15) @ _imm32(p)
  1431.   jsr *#{p: u32} => _dU32(4,0,15) @ _imm32(p)
  1432.  
  1433.  
  1434.  
  1435.   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)
  1436.   sst.u32 {d: reg_dst}, {s: reg_src} => _dU32(6,d, s) @ _imm16(0) ;store d to stack offset  (s16 s, relative to sp)
  1437.  
  1438.   sld.u32 {d: reg_dst},  #{v: s16} => _dU32(5,d, 7) @ _imm16(v)
  1439.   sst.u32 {d: reg_dst},  #{v: s16} => _dU32(6,d, 7) @ _imm16(v)
  1440.  
  1441.   sld.u32 {d: reg_dst}, *#{p: u32} => _dU32(5,d,15) @ _imm32(p)
  1442.   sst.u32 {d: reg_dst}, *#{p: u32} => _dU32(6,d,15) @ _imm32(p)
  1443.  
  1444.   sph.u32 {s: reg_src} => _dU32(7,0,s) @ _imm16(0) ;push s to stack
  1445.  
  1446.   sph.u32  #{v: u32} => _dU32(7,0, 7) @ _imm32(v)
  1447.  
  1448.   sph.u32 *#{p: u32} => _dU32(7,0,15) @ _imm32(p)
  1449.  
  1450.   spl.u32 {d: reg_dst} => _dU32(8,d,0) @ _imm16(0) ;pull from stack into d
  1451.  
  1452.  
  1453.  
  1454.   inc.u32 {d: reg_dst} => _dU32( 9,d,0) @ _imm16(0) ;++d
  1455.   dec.u32 {d: reg_dst} => _dU32(10,d,0) @ _imm16(0) ;--d
  1456.  
  1457.   add.u32 {d: reg_dst}, {s: reg_src} => _dU32(11,d,s) @ _imm16(0) ;d += s
  1458.   sub.u32 {d: reg_dst}, {s: reg_src} => _dU32(12,d,s) @ _imm16(0) ;d -= s
  1459.   mul.u32 {d: reg_dst}, {s: reg_src} => _dU32(13,d,s) @ _imm16(0) ;d *= s
  1460.   div.u32 {d: reg_dst}, {s: reg_src} => _dU32(14,d,s) @ _imm16(0) ;d /= s
  1461.   mod.u32 {d: reg_dst}, {s: reg_src} => _dU32(15,d,s) @ _imm16(0) ;d %= s
  1462.   neg.u32 {d: reg_dst}, {s: reg_src} => _dU32(16,d,s) @ _imm16(0) ;d = -s
  1463.  
  1464.   add.u32 {d: reg_dst},  #{v: u32} => _dU32(11,d, 7) @ _imm32(v)
  1465.   sub.u32 {d: reg_dst},  #{v: u32} => _dU32(12,d, 7) @ _imm32(v)
  1466.   mul.u32 {d: reg_dst},  #{v: u32} => _dU32(13,d, 7) @ _imm32(v)
  1467.   div.u32 {d: reg_dst},  #{v: u32} => _dU32(14,d, 7) @ _imm32(v)
  1468.   mod.u32 {d: reg_dst},  #{v: u32} => _dU32(15,d, 7) @ _imm32(v)
  1469.   neg.u32 {d: reg_dst},  #{v: u32} => _dU32(16,d, 7) @ _imm32(v)
  1470.  
  1471.   add.u32 {d: reg_dst}, *#{p: u32} => _dU32(11,d,15) @ _imm32(p)
  1472.   sub.u32 {d: reg_dst}, *#{p: u32} => _dU32(12,d,15) @ _imm32(p)
  1473.   mul.u32 {d: reg_dst}, *#{p: u32} => _dU32(13,d,15) @ _imm32(p)
  1474.   div.u32 {d: reg_dst}, *#{p: u32} => _dU32(14,d,15) @ _imm32(p)
  1475.   mod.u32 {d: reg_dst}, *#{p: u32} => _dU32(15,d,15) @ _imm32(p)
  1476.   neg.u32 {d: reg_dst}, *#{p: u32} => _dU32(16,d,15) @ _imm32(p)
  1477.  
  1478.  
  1479.  
  1480.   not.u32 {d: reg_dst}, {s: reg_src} => _dU32(17,d,s) @ _imm16(0) ;~
  1481.   nnd.u32 {d: reg_dst}, {s: reg_src} => _dU32(18,d,s) @ _imm16(0) ;& ~
  1482.   and.u32 {d: reg_dst}, {s: reg_src} => _dU32(19,d,s) @ _imm16(0) ;&
  1483.   nor.u32 {d: reg_dst}, {s: reg_src} => _dU32(20,d,s) @ _imm16(0) ;| ~
  1484.   ior.u32 {d: reg_dst}, {s: reg_src} => _dU32(21,d,s) @ _imm16(0) ;|
  1485.   xor.u32 {d: reg_dst}, {s: reg_src} => _dU32(22,d,s) @ _imm16(0) ;^
  1486.   shl.u32 {d: reg_dst}, {s: reg_src} => _dU32(23,d,s) @ _imm16(0) ;<<
  1487.   shr.u32 {d: reg_dst}, {s: reg_src} => _dU32(24,d,s) @ _imm16(0) ;>>
  1488.   rol.u32 {d: reg_dst}, {s: reg_src} => _dU32(25,d,s) @ _imm16(0) ;rotate left
  1489.   ror.u32 {d: reg_dst}, {s: reg_src} => _dU32(26,d,s) @ _imm16(0) ;rotate right
  1490.   ext.u32 {d: reg_dst}, {s: reg_src} => _dU32(27,d,s) @ _imm16(0) ;sign extension
  1491.  
  1492.   not.u32 {d: reg_dst},  #{v: u32} => _dU32(17,d, 7) @ _imm32(v)
  1493.   nnd.u32 {d: reg_dst},  #{v: u32} => _dU32(18,d, 7) @ _imm32(v)
  1494.   and.u32 {d: reg_dst},  #{v: u32} => _dU32(19,d, 7) @ _imm32(v)
  1495.   nor.u32 {d: reg_dst},  #{v: u32} => _dU32(20,d, 7) @ _imm32(v)
  1496.   ior.u32 {d: reg_dst},  #{v: u32} => _dU32(21,d, 7) @ _imm32(v)
  1497.   xor.u32 {d: reg_dst},  #{v: u32} => _dU32(22,d, 7) @ _imm32(v)
  1498.   shl.u32 {d: reg_dst},  #{v: u32} => _dU32(23,d, 7) @ _imm32(v)
  1499.   shr.u32 {d: reg_dst},  #{v: u32} => _dU32(24,d, 7) @ _imm32(v)
  1500.   rol.u32 {d: reg_dst},  #{v: u32} => _dU32(25,d, 7) @ _imm32(v)
  1501.   ror.u32 {d: reg_dst},  #{v: u32} => _dU32(26,d, 7) @ _imm32(v)
  1502.   ext.u32 {d: reg_dst},  #{v: u32} => _dU32(27,d, 7) @ _imm32(v)
  1503.  
  1504.   not.u32 {d: reg_dst}, *#{p: u32} => _dU32(17,d,15) @ _imm32(p)
  1505.   nnd.u32 {d: reg_dst}, *#{p: u32} => _dU32(18,d,15) @ _imm32(p)
  1506.   and.u32 {d: reg_dst}, *#{p: u32} => _dU32(19,d,15) @ _imm32(p)
  1507.   nor.u32 {d: reg_dst}, *#{p: u32} => _dU32(20,d,15) @ _imm32(p)
  1508.   ior.u32 {d: reg_dst}, *#{p: u32} => _dU32(21,d,15) @ _imm32(p)
  1509.   xor.u32 {d: reg_dst}, *#{p: u32} => _dU32(22,d,15) @ _imm32(p)
  1510.   shl.u32 {d: reg_dst}, *#{p: u32} => _dU32(23,d,15) @ _imm32(p)
  1511.   shr.u32 {d: reg_dst}, *#{p: u32} => _dU32(24,d,15) @ _imm32(p)
  1512.   rol.u32 {d: reg_dst}, *#{p: u32} => _dU32(25,d,15) @ _imm32(p)
  1513.   ror.u32 {d: reg_dst}, *#{p: u32} => _dU32(26,d,15) @ _imm32(p)
  1514.   ext.u32 {d: reg_dst}, *#{p: u32} => _dU32(27,d,15) @ _imm32(p)
  1515.  
  1516.  
  1517.  
  1518.   jfn.u32 {s: reg_src} => _dU32(28,0,s) @ _imm16(0)
  1519.  
  1520.   jfn.u32  #{v: u32} => _dU32(28,0, 7) @ _imm32(v)
  1521.  
  1522.   jfn.u32 *#{p: u32} => _dU32(28,0,15) @ _imm32(p)
  1523.  
  1524.   ;jfn are naturally u32
  1525.   jfn {s: reg_src} => _dU32(28,0,s) @ _imm16(0)
  1526.  
  1527.   jfn  #{v: u32} => _dU32(28,0, 7) @ _imm32(v)
  1528.  
  1529.   jfn *#{p: u32} => _dU32(28,0,15) @ _imm32(p)
  1530.  
  1531. }
  1532.  
  1533.  
  1534.  
  1535.  
  1536.  
  1537. #fn _dS32(op, dst, src) => 0b110`3 @ op`5  @  dst`4 @ src`4
  1538.  
  1539. #ruledef datatype_s32 { ;data = 0b110
  1540.   brk.s32 => _dS32(0,0,0) @ _imm16(0) ;(tbd)
  1541.  
  1542.  
  1543.  
  1544.   mov.s32 {d: reg_dst}, {s: reg_src} => _dS32(1,d,s) @ _imm16(0) ;d = s
  1545.   cmp.s32 {d: reg_dst}, {s: reg_src} => _dS32(2,d,s) @ _imm16(0) ;compare d and s
  1546.  
  1547.   mov.s32 {d: reg_dst},  #{v: s32} => _dS32(1,d, 7) @ _imm32(v)
  1548.   cmp.s32 {d: reg_dst},  #{v: s32} => _dS32(2,d, 7) @ _imm32(v)
  1549.  
  1550.   mov.s32 {d: reg_dst}, *#{p: u32} => _dS32(1,d,15) @ _imm32(p)
  1551.   cmp.s32 {d: reg_dst}, *#{p: u32} => _dS32(2,d,15) @ _imm32(p)
  1552.  
  1553.  
  1554.  
  1555.   jmp.s32 {s: reg_src} => _dS32(3,0,s) @ _imm16(0) ;unconditional jump to s
  1556.   jsr.s32 {s: reg_src} => _dS32(4,0,s) @ _imm16(0) ;jump to subroutine in s
  1557.  
  1558.   jmp.s32  #{v: s32} => _dS32(3,0, 7) @ _imm32(v)
  1559.   jsr.s32  #{v: s32} => _dS32(4,0, 7) @ _imm32(v)
  1560.  
  1561.   jmp.s32 *#{p: u32} => _dS32(3,0,15) @ _imm32(p)
  1562.   jsr.s32 *#{p: u32} => _dS32(4,0,15) @ _imm32(p)
  1563.  
  1564.  
  1565.  
  1566.   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)
  1567.   sst.s32 {d: reg_dst}, {s: reg_src} => _dS32(6,d, s) @ _imm16(0) ;store d to stack offset  (s16 s, relative to sp)
  1568.  
  1569.   sld.s32 {d: reg_dst},  #{v: s16} => _dS32(5,d, 7) @ _imm16(v)
  1570.   sst.s32 {d: reg_dst},  #{v: s16} => _dS32(6,d, 7) @ _imm16(v)
  1571.  
  1572.   sld.s32 {d: reg_dst}, *#{p: u32} => _dS32(5,d,15) @ _imm32(p)
  1573.   sst.s32 {d: reg_dst}, *#{p: u32} => _dS32(6,d,15) @ _imm32(p)
  1574.  
  1575.   sph.s32 {s: reg_src} => _dS32(7,0,s) @ _imm16(0) ;push s to stack
  1576.  
  1577.   sph.s32  #{v: s32} => _dS32(7,0, 7) @ _imm32(v)
  1578.  
  1579.   sph.s32 *#{p: u32} => _dS32(7,0,15) @ _imm32(p)
  1580.  
  1581.   spl.s32 {d: reg_dst} => _dS32(8,d,0) @ _imm16(0) ;pull from stack into d
  1582.  
  1583.  
  1584.  
  1585.   inc.s32 {d: reg_dst} => _dS32( 9,d,0) @ _imm16(0) ;++d
  1586.   dec.s32 {d: reg_dst} => _dS32(10,d,0) @ _imm16(0) ;--d
  1587.  
  1588.   add.s32 {d: reg_dst}, {s: reg_src} => _dS32(11,d,s) @ _imm16(0) ;d += s
  1589.   sub.s32 {d: reg_dst}, {s: reg_src} => _dS32(12,d,s) @ _imm16(0) ;d -= s
  1590.   mul.s32 {d: reg_dst}, {s: reg_src} => _dS32(13,d,s) @ _imm16(0) ;d *= s
  1591.   div.s32 {d: reg_dst}, {s: reg_src} => _dS32(14,d,s) @ _imm16(0) ;d /= s
  1592.   mod.s32 {d: reg_dst}, {s: reg_src} => _dS32(15,d,s) @ _imm16(0) ;d %= s
  1593.   neg.s32 {d: reg_dst}, {s: reg_src} => _dS32(16,d,s) @ _imm16(0) ;d = -s
  1594.  
  1595.   add.s32 {d: reg_dst},  #{v: s32} => _dS32(11,d, 7) @ _imm32(v)
  1596.   sub.s32 {d: reg_dst},  #{v: s32} => _dS32(12,d, 7) @ _imm32(v)
  1597.   mul.s32 {d: reg_dst},  #{v: s32} => _dS32(13,d, 7) @ _imm32(v)
  1598.   div.s32 {d: reg_dst},  #{v: s32} => _dS32(14,d, 7) @ _imm32(v)
  1599.   mod.s32 {d: reg_dst},  #{v: s32} => _dS32(15,d, 7) @ _imm32(v)
  1600.   neg.s32 {d: reg_dst},  #{v: s32} => _dS32(16,d, 7) @ _imm32(v)
  1601.  
  1602.   add.s32 {d: reg_dst}, *#{p: u32} => _dS32(11,d,15) @ _imm32(p)
  1603.   sub.s32 {d: reg_dst}, *#{p: u32} => _dS32(12,d,15) @ _imm32(p)
  1604.   mul.s32 {d: reg_dst}, *#{p: u32} => _dS32(13,d,15) @ _imm32(p)
  1605.   div.s32 {d: reg_dst}, *#{p: u32} => _dS32(14,d,15) @ _imm32(p)
  1606.   mod.s32 {d: reg_dst}, *#{p: u32} => _dS32(15,d,15) @ _imm32(p)
  1607.   neg.s32 {d: reg_dst}, *#{p: u32} => _dS32(16,d,15) @ _imm32(p)
  1608.  
  1609.  
  1610.  
  1611.   not.s32 {d: reg_dst}, {s: reg_src} => _dS32(17,d,s) @ _imm16(0) ;~
  1612.   nnd.s32 {d: reg_dst}, {s: reg_src} => _dS32(18,d,s) @ _imm16(0) ;& ~
  1613.   and.s32 {d: reg_dst}, {s: reg_src} => _dS32(19,d,s) @ _imm16(0) ;&
  1614.   nor.s32 {d: reg_dst}, {s: reg_src} => _dS32(20,d,s) @ _imm16(0) ;| ~
  1615.   ior.s32 {d: reg_dst}, {s: reg_src} => _dS32(21,d,s) @ _imm16(0) ;|
  1616.   xor.s32 {d: reg_dst}, {s: reg_src} => _dS32(22,d,s) @ _imm16(0) ;^
  1617.   shl.s32 {d: reg_dst}, {s: reg_src} => _dS32(23,d,s) @ _imm16(0) ;<<
  1618.   shr.s32 {d: reg_dst}, {s: reg_src} => _dS32(24,d,s) @ _imm16(0) ;>>
  1619.   rol.s32 {d: reg_dst}, {s: reg_src} => _dS32(25,d,s) @ _imm16(0) ;rotate left
  1620.   ror.s32 {d: reg_dst}, {s: reg_src} => _dS32(26,d,s) @ _imm16(0) ;rotate right
  1621.   ext.s32 {d: reg_dst}, {s: reg_src} => _dS32(27,d,s) @ _imm16(0) ;sign extension
  1622.  
  1623.   not.s32 {d: reg_dst},  #{v: s32} => _dS32(17,d, 7) @ _imm32(v)
  1624.   nnd.s32 {d: reg_dst},  #{v: s32} => _dS32(18,d, 7) @ _imm32(v)
  1625.   and.s32 {d: reg_dst},  #{v: s32} => _dS32(19,d, 7) @ _imm32(v)
  1626.   nor.s32 {d: reg_dst},  #{v: s32} => _dS32(20,d, 7) @ _imm32(v)
  1627.   ior.s32 {d: reg_dst},  #{v: s32} => _dS32(21,d, 7) @ _imm32(v)
  1628.   xor.s32 {d: reg_dst},  #{v: s32} => _dS32(22,d, 7) @ _imm32(v)
  1629.   shl.s32 {d: reg_dst},  #{v: s32} => _dS32(23,d, 7) @ _imm32(v)
  1630.   shr.s32 {d: reg_dst},  #{v: s32} => _dS32(24,d, 7) @ _imm32(v)
  1631.   rol.s32 {d: reg_dst},  #{v: s32} => _dS32(25,d, 7) @ _imm32(v)
  1632.   ror.s32 {d: reg_dst},  #{v: s32} => _dS32(26,d, 7) @ _imm32(v)
  1633.   ext.s32 {d: reg_dst},  #{v: s32} => _dS32(27,d, 7) @ _imm32(v)
  1634.  
  1635.   not.s32 {d: reg_dst}, *#{p: u32} => _dS32(17,d,15) @ _imm32(p)
  1636.   nnd.s32 {d: reg_dst}, *#{p: u32} => _dS32(18,d,15) @ _imm32(p)
  1637.   and.s32 {d: reg_dst}, *#{p: u32} => _dS32(19,d,15) @ _imm32(p)
  1638.   nor.s32 {d: reg_dst}, *#{p: u32} => _dS32(20,d,15) @ _imm32(p)
  1639.   ior.s32 {d: reg_dst}, *#{p: u32} => _dS32(21,d,15) @ _imm32(p)
  1640.   xor.s32 {d: reg_dst}, *#{p: u32} => _dS32(22,d,15) @ _imm32(p)
  1641.   shl.s32 {d: reg_dst}, *#{p: u32} => _dS32(23,d,15) @ _imm32(p)
  1642.   shr.s32 {d: reg_dst}, *#{p: u32} => _dS32(24,d,15) @ _imm32(p)
  1643.   rol.s32 {d: reg_dst}, *#{p: u32} => _dS32(25,d,15) @ _imm32(p)
  1644.   ror.s32 {d: reg_dst}, *#{p: u32} => _dS32(26,d,15) @ _imm32(p)
  1645.   ext.s32 {d: reg_dst}, *#{p: u32} => _dS32(27,d,15) @ _imm32(p)
  1646.  
  1647.  
  1648.  
  1649.   jfn.s32 {s: reg_src} => _dS32(28,0,s) @ _imm16(0)
  1650.  
  1651.   jfn.s32  #{v: s32} => _dS32(28,0, 7) @ _imm32(v)
  1652.  
  1653.   jfn.s32 *#{p: u32} => _dS32(28,0,15) @ _imm32(p)
  1654.  
  1655. }
  1656.  
  1657.  
  1658.  
  1659.  
  1660.  
  1661. #fn _dImp(op, dst, src) => 0b011`3 @ op`5  @  dst`4 @ src`4
  1662.  
  1663. #ruledef datatype_imp { ;data = 0b011
  1664.   nop => _dImp(0,0,0) @ _imm16(0) ;no operation
  1665.  
  1666.  
  1667.  
  1668.   srt {d: reg_dst}, {s: reg_src} => _dImp(1,d, s) @ _imm16(0) ;D = sqrtf(S)
  1669.   srt {d: reg_dst},    #{f: i32} => _dImp(1,d, 7) @ _imm32(f)
  1670.   srt {d: reg_dst},   *#{p: u32} => _dImp(1,d,15) @ _imm32(p)
  1671.  
  1672.  
  1673.  
  1674.   cpu {s: reg_src} => _dImp(2,0,s) @ _imm16(0) ;cpuid
  1675.   sys {s: reg_src} => _dImp(3,0,s) @ _imm16(0) ;syscall
  1676.  
  1677.   cpu  #{v: u16} => _dImp(2,0, 7) @ _imm16(v)
  1678.   sys  #{v: u16} => _dImp(3,0, 7) @ _imm16(v)
  1679.  
  1680.   cpu *#{p: u32} => _dImp(2,0,15) @ _imm32(p)
  1681.   sys *#{p: u32} => _dImp(3,0,15) @ _imm32(p)
  1682.  
  1683.  
  1684.  
  1685.   bnc {s: reg_src} => _dImp( 4,0,s) @ _imm16(0) ;branch to s if !negative
  1686.   bns {s: reg_src} => _dImp( 5,0,s) @ _imm16(0) ;branch to s if  negative
  1687.   bzc {s: reg_src} => _dImp( 6,0,s) @ _imm16(0) ;branch to s if !zero
  1688.   bzs {s: reg_src} => _dImp( 7,0,s) @ _imm16(0) ;branch to s if  zero
  1689.   blt {s: reg_src} => _dImp( 8,0,s) @ _imm16(0) ;branch to s d_prev< s_prev
  1690.   bgt {s: reg_src} => _dImp( 9,0,s) @ _imm16(0) ;branch to s d_prev> s_prev
  1691.   ble {s: reg_src} => _dImp(10,0,s) @ _imm16(0) ;branch to s d_prev<=s_prev
  1692.   bge {s: reg_src} => _dImp(11,0,s) @ _imm16(0) ;branch to s d_prev>=s_prev
  1693.   bne {s: reg_src} => _dImp(12,0,s) @ _imm16(0) ;branch to s d_prev!=s_prev
  1694.   beq {s: reg_src} => _dImp(13,0,s) @ _imm16(0) ;branch to s d_prev==s_prev
  1695.  
  1696.   bnc  #{v: s16} => _dImp( 4,0, 7) @ _imm16(to_relative(v))
  1697.   bns  #{v: s16} => _dImp( 5,0, 7) @ _imm16(to_relative(v))
  1698.   bzc  #{v: s16} => _dImp( 6,0, 7) @ _imm16(to_relative(v))
  1699.   bzs  #{v: s16} => _dImp( 7,0, 7) @ _imm16(to_relative(v))
  1700.   blt  #{v: s16} => _dImp( 8,0, 7) @ _imm16(to_relative(v))
  1701.   bgt  #{v: s16} => _dImp( 9,0, 7) @ _imm16(to_relative(v))
  1702.   ble  #{v: s16} => _dImp(10,0, 7) @ _imm16(to_relative(v))
  1703.   bge  #{v: s16} => _dImp(11,0, 7) @ _imm16(to_relative(v))
  1704.   bne  #{v: s16} => _dImp(12,0, 7) @ _imm16(to_relative(v))
  1705.   beq  #{v: s16} => _dImp(13,0, 7) @ _imm16(to_relative(v))
  1706.  
  1707.   bnc *#{p: u32} => _dImp( 4,0,15) @ _imm32(p)
  1708.   bns *#{p: u32} => _dImp( 5,0,15) @ _imm32(p)
  1709.   bzc *#{p: u32} => _dImp( 6,0,15) @ _imm32(p)
  1710.   bzs *#{p: u32} => _dImp( 7,0,15) @ _imm32(p)
  1711.   blt *#{p: u32} => _dImp( 8,0,15) @ _imm32(p)
  1712.   bgt *#{p: u32} => _dImp( 9,0,15) @ _imm32(p)  
  1713.   ble *#{p: u32} => _dImp(10,0,15) @ _imm32(p)  
  1714.   bge *#{p: u32} => _dImp(11,0,15) @ _imm32(p)  
  1715.   bne *#{p: u32} => _dImp(12,0,15) @ _imm32(p)  
  1716.   beq *#{p: u32} => _dImp(13,0,15) @ _imm32(p)
  1717.  
  1718.  
  1719.  
  1720.   jnc {s: reg_src} => _dImp(14,0, s) @ _imm16(0) ;jump to s if !negative
  1721.   jns {s: reg_src} => _dImp(15,0, s) @ _imm16(0) ;jump to s if  negative
  1722.   jzc {s: reg_src} => _dImp(16,0, s) @ _imm16(0) ;jump to s if !zero
  1723.   jzs {s: reg_src} => _dImp(17,0, s) @ _imm16(0) ;jump to s if  zero
  1724.   jlt {s: reg_src} => _dImp(18,0, s) @ _imm16(0) ;jump to s if d_prev< s_prev
  1725.   jgt {s: reg_src} => _dImp(19,0, s) @ _imm16(0) ;jump to s if d_prev> s_prev
  1726.   jle {s: reg_src} => _dImp(20,0, s) @ _imm16(0) ;jump to s if d_prev<=s_prev
  1727.   jge {s: reg_src} => _dImp(21,0, s) @ _imm16(0) ;jump to s if d_prev>=s_prev
  1728.   jne {s: reg_src} => _dImp(22,0, s) @ _imm16(0) ;jump to s if d_prev!=s_prev
  1729.   jeq {s: reg_src} => _dImp(23,0, s) @ _imm16(0) ;jump to s if d_prev==s_prev
  1730.  
  1731.   jnc  #{v: u32} => _dImp(14,0, 7) @ _imm32(v)
  1732.   jns  #{v: u32} => _dImp(15,0, 7) @ _imm32(v)
  1733.   jzc  #{v: u32} => _dImp(16,0, 7) @ _imm32(v)
  1734.   jzs  #{v: u32} => _dImp(17,0, 7) @ _imm32(v)
  1735.   jlt  #{v: u32} => _dImp(18,0, 7) @ _imm32(v)
  1736.   jgt  #{v: u32} => _dImp(19,0, 7) @ _imm32(v)
  1737.   jle  #{v: u32} => _dImp(20,0, 7) @ _imm32(v)
  1738.   jge  #{v: u32} => _dImp(21,0, 7) @ _imm32(v)
  1739.   jne  #{v: u32} => _dImp(22,0, 7) @ _imm32(v)
  1740.   jeq  #{v: u32} => _dImp(23,0, 7) @ _imm32(v)
  1741.  
  1742.   jnc *#{p: u32} => _dImp(14,0,15) @ _imm32(p)
  1743.   jns *#{p: u32} => _dImp(15,0,15) @ _imm32(p)
  1744.   jzc *#{p: u32} => _dImp(16,0,15) @ _imm32(p)
  1745.   jzs *#{p: u32} => _dImp(17,0,15) @ _imm32(p)
  1746.   jlt *#{p: u32} => _dImp(18,0,15) @ _imm32(p)
  1747.   jgt *#{p: u32} => _dImp(19,0,15) @ _imm32(p)
  1748.   jle *#{p: u32} => _dImp(20,0,15) @ _imm32(p)
  1749.   jge *#{p: u32} => _dImp(21,0,15) @ _imm32(p)
  1750.   jne *#{p: u32} => _dImp(22,0,15) @ _imm32(p)
  1751.   jeq *#{p: u32} => _dImp(23,0,15) @ _imm32(p)
  1752.  
  1753.  
  1754.  
  1755.   u2b {d: reg_dst}, {s: reg_src} => _dImp(24,d,s) @ _imm16(0) ;u32-to-binary-coded-decimal
  1756.   b2u {d: reg_dst}, {s: reg_src} => _dImp(25,d,s) @ _imm16(0) ;binary-coded-decimal-to-u32
  1757.   i2f {d: reg_dst}, {s: reg_src} => _dImp(26,d,s) @ _imm16(0) ;s32-to-float cast
  1758.   f2i {d: reg_dst}, {s: reg_src} => _dImp(27,d,s) @ _imm16(0) ;float-to-s32 cast
  1759.  
  1760.   u2b {d: reg_dst},  #{v: u32} => _dImp(24,d, 7) @ _imm32(v)
  1761.   b2u {d: reg_dst},  #{v: u32} => _dImp(25,d, 7) @ _imm32(v)
  1762.   i2f {d: reg_dst},  #{v: s32} => _dImp(26,d, 7) @ _imm32(v)
  1763.   f2i {d: reg_dst},  #{f: i32} => _dImp(27,d, 7) @ _imm32(f)
  1764.  
  1765.   u2b {d: reg_dst}, *#{p: u32} => _dImp(24,d,15) @ _imm32(p)
  1766.   b2u {d: reg_dst}, *#{p: u32} => _dImp(25,d,15) @ _imm32(p)
  1767.   i2f {d: reg_dst}, *#{p: u32} => _dImp(26,d,15) @ _imm32(p)
  1768.   f2i {d: reg_dst}, *#{p: u32} => _dImp(27,d,15) @ _imm32(p)
  1769.  
  1770.  
  1771.  
  1772.   rts => _dImp(28,0,0) @ _imm16(0) ;return from subroutine
  1773.  
  1774.  
  1775.  
  1776.   bra {s: reg_src} => _dImp(29,0,s) @ _imm16(0) ;branch always
  1777.  
  1778.   bra  #{v: s16} => _dImp(29,0, 7) @ _imm16(to_relative(v))
  1779.  
  1780.   bra *#{p: u32} => _dImp(29,0,15) @ _imm32(p)
  1781.  
  1782.  
  1783.  
  1784.   ;return from subroutine, with custom (signed) stack ptr increment
  1785.    ;(example: "rsi #4" is equivalent to rts)
  1786.   rsi {s: reg_src} => _dImp(30,0,s) @ _imm16(0)
  1787.  
  1788.   rsi  #{v: s16} => _dImp(30,0, 7) @ _imm16(v)
  1789.  
  1790.   rsi *#{p: u32} => _dImp(30,0,15) @ _imm32(p)
  1791.  
  1792.  
  1793.   ;return from function; rts, except r5 -> r1 are pulled (not r0)
  1794.   rfn => _dImp(31,0,0) @ _imm16(0)
  1795.  
  1796. }
  1797.  
  1798.  
  1799.  
  1800.  
  1801.  
  1802. #fn _dF32(op, dst, src) => 0b111`3 @ op`5  @  dst`4 @ src`4
  1803.  
  1804. #ruledef datatype_f32 { ;data = 0b111
  1805.   brk.f32 => _dF32(0,0,0) @ _imm16(0) ;(tbd)
  1806.  
  1807.  
  1808.  
  1809.   mov.f32 {d: reg_dst}, {s: reg_src} => _dF32(1,d,s) @ _imm16(0) ;d = s
  1810.   cmp.f32 {d: reg_dst}, {s: reg_src} => _dF32(2,d,s) @ _imm16(0) ;compare d and s
  1811.  
  1812.   mov.f32 {d: reg_dst},  #{f: i32} => _dF32(1,d, 7) @ _imm32(f)
  1813.   cmp.f32 {d: reg_dst},  #{f: i32} => _dF32(2,d, 7) @ _imm32(f)
  1814.  
  1815.   mov.f32 {d: reg_dst}, *#{p: u32} => _dF32(1,d,15) @ _imm32(p)
  1816.   cmp.f32 {d: reg_dst}, *#{p: u32} => _dF32(2,d,15) @ _imm32(p)
  1817.  
  1818.  
  1819.  
  1820.   jmp.f32 {s: reg_src} => _dF32(3,0,s) @ _imm16(0) ;unconditional jump to s
  1821.   jsr.f32 {s: reg_src} => _dF32(4,0,s) @ _imm16(0) ;jump to subroutine in s
  1822.  
  1823.   jmp.f32  #{f: i32} => _dF32(3,0, 7) @ _imm32(f)
  1824.   jsr.f32  #{f: i32} => _dF32(4,0, 7) @ _imm32(f)
  1825.  
  1826.   jmp.f32 *#{p: u32} => _dF32(3,0,15) @ _imm32(p)
  1827.   jsr.f32 *#{p: u32} => _dF32(4,0,15) @ _imm32(p)
  1828.  
  1829.  
  1830.  
  1831.   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)
  1832.   sst.f32 {d: reg_dst}, {s: reg_src} => _dF32(6,d, s) @ _imm16(0) ;store d to stack offset  (s16 s, relative to sp)
  1833.  
  1834.   sld.f32 {d: reg_dst},  #{v: s16} => _dF32(5,d, 7) @ _imm16(v)
  1835.   sst.f32 {d: reg_dst},  #{v: s16} => _dF32(6,d, 7) @ _imm16(v)
  1836.  
  1837.   sld.f32 {d: reg_dst}, *#{p: u32} => _dF32(5,d,15) @ _imm32(p)
  1838.   sst.f32 {d: reg_dst}, *#{p: u32} => _dF32(6,d,15) @ _imm32(p)
  1839.  
  1840.   sph.f32 {s: reg_src} => _dF32(7,0,s) @ _imm16(0) ;push s to stack
  1841.  
  1842.   sph.f32  #{f: i32} => _dF32(7,0, 7) @ _imm32(f)
  1843.  
  1844.   sph.f32 *#{p: u32} => _dF32(7,0,15) @ _imm32(p)
  1845.  
  1846.   spl.f32 {d: reg_dst} => _dF32(8,d,0) @ _imm16(0) ;pull from stack into d
  1847.  
  1848.  
  1849.  
  1850.   inc.f32 {d: reg_dst} => _dF32( 9,d,0) @ _imm16(0) ;++d
  1851.   dec.f32 {d: reg_dst} => _dF32(10,d,0) @ _imm16(0) ;--d
  1852.  
  1853.   add.f32 {d: reg_dst}, {s: reg_src} => _dF32(11,d,s) @ _imm16(0) ;d += s
  1854.   sub.f32 {d: reg_dst}, {s: reg_src} => _dF32(12,d,s) @ _imm16(0) ;d -= s
  1855.   mul.f32 {d: reg_dst}, {s: reg_src} => _dF32(13,d,s) @ _imm16(0) ;d *= s
  1856.   div.f32 {d: reg_dst}, {s: reg_src} => _dF32(14,d,s) @ _imm16(0) ;d /= s
  1857.   mod.f32 {d: reg_dst}, {s: reg_src} => _dF32(15,d,s) @ _imm16(0) ;d %= s
  1858.   neg.f32 {d: reg_dst}, {s: reg_src} => _dF32(16,d,s) @ _imm16(0) ;d = -s
  1859.  
  1860.   add.f32 {d: reg_dst}, #{f: i32} => _dF32(11,d, 7) @ _imm32(f)
  1861.   sub.f32 {d: reg_dst}, #{f: i32} => _dF32(12,d, 7) @ _imm32(f)
  1862.   mul.f32 {d: reg_dst}, #{f: i32} => _dF32(13,d, 7) @ _imm32(f)
  1863.   div.f32 {d: reg_dst}, #{f: i32} => _dF32(14,d, 7) @ _imm32(f)
  1864.   mod.f32 {d: reg_dst}, #{f: i32} => _dF32(15,d, 7) @ _imm32(f)
  1865.   neg.f32 {d: reg_dst}, #{f: i32} => _dF32(16,d, 7) @ _imm32(f)
  1866.  
  1867.   add.f32 {d: reg_dst}, *#{p: u32} => _dF32(11,d,15) @ _imm32(p)
  1868.   sub.f32 {d: reg_dst}, *#{p: u32} => _dF32(12,d,15) @ _imm32(p)
  1869.   mul.f32 {d: reg_dst}, *#{p: u32} => _dF32(13,d,15) @ _imm32(p)
  1870.   div.f32 {d: reg_dst}, *#{p: u32} => _dF32(14,d,15) @ _imm32(p)
  1871.   mod.f32 {d: reg_dst}, *#{p: u32} => _dF32(15,d,15) @ _imm32(p)
  1872.   neg.f32 {d: reg_dst}, *#{p: u32} => _dF32(16,d,15) @ _imm32(p)
  1873.  
  1874.  
  1875.  
  1876.   jfn.f32 {s: reg_src} => _dF32(28,0,s) @ _imm16(0)
  1877.  
  1878.   jfn.f32  #{f: i32} => _dF32(28,0, 7) @ _imm32(f)
  1879.  
  1880.   jfn.f32 *#{p: u32} => _dF32(28,0,15) @ _imm32(p)
  1881.  
  1882. }
  1883.  
  1884.  
  1885.  
  1886.  
  1887.  
  1888. ;EXAMPLE PROGRAM: DRAW ELLIPSE
  1889. ;(";*" is the start of a long comment!)
  1890. ;*
  1891. mov.u32 r0, #0xFFFFFFFF           ;set bg to white
  1892. sys         #SYSCALL_SETDRAWCOLOR  ;
  1893. sys         #SYSCALL_CLEAR         ;
  1894.  
  1895. mov.u32 r0, #0xFF000000           ;set color to black
  1896. sys         #SYSCALL_SETDRAWCOLOR  ;
  1897.  
  1898. mov.f32 r5, #0 ;init r5 to 0.0f
  1899. mov.u32 r4, r5 ;init r4 to 0
  1900.  
  1901. draw_loop:
  1902.   ;r0, r1 = cossin(r5)
  1903.   mov.f32 r0, r5
  1904.   mov.f32 r1, r5
  1905.   sys         #SYSCALL_COSSIN
  1906.  
  1907.   ; -1.0f -> 1.0f  TO  0.0f, 1.0f
  1908.   add.f32 r0, #F32_1_0 ; += 1.0f
  1909.   add.f32 r1, #F32_1_0  ;
  1910.   div.f32 r0, #F32_2_0 ; /= 2.0f
  1911.   div.f32 r1, #F32_2_0  ;
  1912.  
  1913.   ;for a 256x144 screen
  1914.   mul.f32 r0, #F32_255_0 ; *=255
  1915.   mul.f32 r1, #F32_143_0 ; *=143
  1916.   sys         #SYSCALL_DRAWPOINT_F32
  1917.  
  1918.  
  1919.   add.f32 r5, #F32_0_05 ;+= 0.05f
  1920.   mod.f32 r5, #F32_2PI  ;%= 2pi
  1921.  
  1922.   ;only update screen every 4096 iterations
  1923.   and.u16 r4, #bitmask(12)
  1924.   bzc         #dont_present
  1925.   sys         #SYSCALL_PRESENT ;flip screen
  1926.   dont_present:
  1927.   inc.u16 r4
  1928.  
  1929.   bra         #draw_loop ;goto start
  1930. *;
  1931.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement