Class: Lignite::Assembler
- Inherits:
-
Object
- Object
- Lignite::Assembler
- Includes:
- Lignite, Bytes, Logger, VariableDeclarer
- Defined in:
- lib/lignite/assembler.rb
Overview
Assemble a complete RBF program file.
The compilation has two passes:
-
pass1, Declaration
-
pass2, Resolution
After P1, the instruction sequence is iterated. If an item responds to :pass2, it is replaced by the result of that call. After pass2 we have a sequence of ByteStrings which are just concatenated
No, pass1, gather names, pass2 do all the rest
Constant Summary collapse
- HEADER_SIZE =
16
- SIGNATURE =
"LEGO".freeze
Constants included from Lignite
ABS, ACOS, ADD, ADDRESS, ALLOW_PULSE, ANY_BUTTON, APPS_DIR, ARROW_ICON, ASIN, ATAN, A_ICON_NOS, BACK_BUTTON, BG_COLOR, BLACKCOLOR, BLANK, BLUE, BLUECOLOR, BLUETOOTH_FILE_NAME, BMPFILE, BRAKE, BREAK, BRICKNAMESIZE, BROWSE, BROWSERTYPES, BROWSE_CACHE, BROWSE_FILES, BROWSE_FOLDERS, BROWSE_FOLDS_FILES, BTADRSIZE, BTPASSKEYSIZE, BTTYPES, BTTYPE_BRICK, BTTYPE_PC, BTTYPE_PHONE, BTTYPE_UNKNOWN, BUSY, BUTTONS, BUTTONTYPES, CALDATA_FILE_NAME, CAL_DEFAULT, CAL_MAX, CAL_MIN, CAL_MINMAX, CEIL, CHAIN_DEPT, CHARSET_BTPASSKEY, CHARSET_FILENAME, CHARSET_NAME, CHARSET_WIFIPASSKEY, CHARSET_WIFISSID, CHAR_ERROR, CHECK, CIRCLE, CLEAN, CLOSE, CLOSE_LOG, CLR_ALL, CLR_CHANGES, CMD_SLOT, COAST, CODE, COLORS, COMMAND, COMPARE, CONNEC_ITEM, CONNEC_ITEMS, COPY, COPY_ERROR, COS, CREATE16, CREATE32, CREATE8, CREATEF, CURRENT_SLOT, DATA16_MAX, DATA16_MIN, DATA16_NAN, DATA32_MAX, DATA32_MIN, DATA32_NAN, DATA8_MAX, DATA8_MIN, DATA8_NAN, DATAF_MAX, DATAF_MIN, DATAF_NAN, DATALOG_FOLDER, DATA_16, DATA_32, DATA_8, DATA_A, DATA_F, DATA_FORMATS, DATA_PCT, DATA_RAW, DATA_S, DATA_SI, DATA_V, DEBUG_SLOT, DEFAULT_SLEEPMINUTES, DEFAULT_VOLUME, DELETE, DELS, DEL_CACHE_FILE, DEL_COLON, DEL_COMMA, DEL_CRLF, DEL_LINEFEED, DEL_NONE, DEL_RETURN, DEL_SPACE, DEL_SUBFOLDER, DEL_TAB, DESTROY, DEVCMDS, DEVCMD_CHANNEL, DEVCMD_FIRE, DEVCMD_RESET, DIR_DEEPT, DOTLINE, DOWNLOAD_END, DOWN_BUTTON, DUPLICATE, ENCRYPTS, ENCRYPT_NONE, ENCRYPT_WPA2, ENTER_BUTTON, ERRORTEXT, ERR_STRING_SIZE, EVENT_BT_PIN, EVENT_BT_REQ_CONF, EVENT_NONE, EXIST, EXP, EXTSIZE, EXT_ARCHIVE, EXT_BYTECODE, EXT_CONFIG, EXT_DATALOG, EXT_GRAPHICS, EXT_PROGRAM, EXT_SOUND, EXT_TEXT, FAIL, FAVOUR_ITEM, FAVOUR_ITEMS, FG_COLOR, FILENAMESIZE, FILETYPES, FILETYPE_UNKNOWN, FILL, FILLCIRCLE, FILLRECT, FILLWINDOW, FLOATVALUE, FLOOR, FLUSH, FONTTYPES, GET_ADDRESS, GET_BACK_BLOCK, GET_BRICKNAME, GET_BUMBED, GET_BUMPED, GET_BUMPS, GET_CACHE_FILE, GET_CACHE_FILES, GET_CHANGES, GET_CLICK, GET_CODE, GET_CONNECTION, GET_ENCRYPT, GET_ERROR, GET_EVENT, GET_FIGURES, GET_FOLDERNAME, GET_FOLDERS, GET_FORMAT, GET_FW_BUILD, GET_FW_VERS, GET_HANDLE, GET_HORZ, GET_HW_VERS, GET_IBATT, GET_ID, GET_IINT, GET_IMAGE, GET_IMOTOR, GET_INCOMING, GET_IP, GET_ITEM, GET_LBATT, GET_LOG_NAME, GET_LOG_SYNC_TIME, GET_MINMAX, GET_MINUTES, GET_MODE2, GET_MODENAME, GET_NAME, GET_NETWORK, GET_ON_OFF, GET_OS_BUILD, GET_OS_VERS, GET_PIN, GET_POOL, GET_POWER, GET_PRESENT, GET_PRGNAME, GET_PRGRESULT, GET_RAW, GET_RESULT, GET_SDCARD, GET_SHUTDOWN, GET_SIZE, GET_SPEED, GET_STATUS, GET_STRING, GET_SUBFOLDER_NAME, GET_SYMBOL, GET_TBATT, GET_TYPEMODE, GET_USBSTICK, GET_VBATT, GET_VERSION, GET_VERT, GET_VISIBLE, GET_VOLUME, GET_WARNING, GRAPH_DRAW, GRAPH_SAMPLE, GRAPH_SETUP, GREEN, GREENCOLOR, GUI_SLOT, HALTED, HWTYPES, HW_BT, HW_USB, HW_WIFI, ICON, ICONTYPES, ICON_ADD_HIDDEN, ICON_BLUETOOTH, ICON_BRICK, ICON_BRICK1, ICON_CHECKBOX, ICON_CHECKED, ICON_CONNECT, ICON_CONNECTED, ICON_CONNECTIONS, ICON_DISC, ICON_DISCONNECT, ICON_DOWN, ICON_FOLDER, ICON_FOLDER2, ICON_FROM_FOLDER, ICON_IMAGE, ICON_INFO, ICON_INFO_FILE, ICON_KEY, ICON_LEFT, ICON_LOCK, ICON_LOCKSTAR, ICON_NONE, ICON_OBD, ICON_OBP, ICON_ONOFF, ICON_OPENFOLDER, ICON_PC, ICON_PHONE, ICON_QUESTION, ICON_QUESTIONMARK, ICON_RIGHT, ICON_RUN, ICON_SD, ICON_SEARCH, ICON_SETTINGS, ICON_SOUND, ICON_STAR, ICON_TEXT, ICON_TRASHBIN, ICON_UNKNOWN, ICON_UP, ICON_USB, ICON_VISIBILITY, ICON_WAIT1, ICON_WAIT2, ICON_WIFI, ICON_XED, INIT16, INIT32, INIT8, INITF, INIT_RUN, INPUTS, INSERT_TYPE, INVERSERECT, IPSIZE, KEY, KEYBOARD, LARGE_FONT, LARGE_ICON, LASTRUN_FILE_NAME, LAYER_0, LCD_HEIGHT, LCD_STORE_LEVELS, LCD_WIDTH, LED, LEDPATTERNS, LEDS, LED_ALL, LED_BLACK, LED_GREEN, LED_GREEN_FLASH, LED_GREEN_PULSE, LED_LG, LED_LR, LED_ORANGE, LED_ORANGE_FLASH, LED_ORANGE_PULSE, LED_RED, LED_RED_FLASH, LED_RED_PULSE, LED_RG, LED_RR, LEFT_BUTTON, LINE, LIST_STATE, LMS_ENCRYPTS, LMS_ENCRYPT_NONE, LMS_ENCRYPT_WPA2, LN, LOAD_IMAGE, LOG, LONGPRESS, L_ICON_NOS, MACSIZE, MAKE_FOLDER, MAX_VALID_TYPE, MEMORY_FOLDER, MENU_ICON, MERGE, MOD, MOD16, MOD32, MOD8, MODE_KEEP, MOVE, M_ICON_NOS, NAMESIZE, NEGATE, NORMAL_FONT, NORMAL_ICON, NOTIFICATION, NO_BUTTON, NO_NOTSEL, NO_SEL, NO_USBSTICK, NUMBER_FORMATTED, NUMBER_TO_STRING, N_ICON_NOS, OBJ_START, OBJ_STOP, OFF, OK, OPEN_APPEND, OPEN_LOG, OPEN_READ, OPEN_WRITE, OUTPUTS, PACK, PATHSIZE, PICTURE, PIXEL, PLAY, POP3_ABS_WARN_ICON_X, POP3_ABS_WARN_ICON_X1, POP3_ABS_WARN_ICON_X2, POP3_ABS_WARN_ICON_X3, POP3_ABS_WARN_ICON_Y, POP3_ABS_WARN_LINE_ENDX, POP3_ABS_WARN_LINE_X, POP3_ABS_WARN_LINE_Y, POP3_ABS_WARN_SPEC_ICON_X, POP3_ABS_WARN_SPEC_ICON_Y, POP3_ABS_WARN_TEXT_X, POP3_ABS_WARN_TEXT_Y, POP3_ABS_WARN_YES_X, POP3_ABS_WARN_YES_Y, POP3_ABS_X, POP3_ABS_Y, POPUP, PORT_1, PORT_2, PORT_3, PORT_4, PORT_A, PORT_B, PORT_C, PORT_D, POW, POWER, PRESS, PRESSED, PRJS_DIR, PROGRAM_ERROR, PROGRAM_FOLDER, PULSE_BROWSER, PULSE_GUI_BACKGROUND, PULSE_KEY, PUT_CACHE_FILE, PUT_STRING, QUESTION, READY_IIC, READY_PCT, READY_RAW, READY_SI, READ_BYTES, READ_CONTENT, READ_SIZE, READ_TEXT, READ_VALUE, RECT, RECTANGLE, RED, REDCOLOR, RELEASE, REMOVE, REPEAT, REPLY, RESIZE, RESTORE, RIGHT_BUTTON, ROUND, RUNNING, SCREEN_BLOCK, SCROLL, SDCARD_FOLDER, SEARCH_ITEM, SEARCH_ITEMS, SELECT_FONT, SERVICE, SETTINGS_DIR, SETUP, SET_BACK_BLOCK, SET_BRICKNAME, SET_BUSY, SET_CONNECTION, SET_ENCRYPT, SET_ERROR, SET_INSTR, SET_LOG_SYNC_TIME, SET_MINUTES, SET_MODE2, SET_MOVEDOWN, SET_MOVEUP, SET_ON_OFF, SET_PASSKEY, SET_PIN, SET_PULSE, SET_RAW, SET_SEARCH, SET_SIZE, SET_SSID, SET_TESTPIN, SET_TYPEMODE, SET_VISIBLE, SET_VOLUME, SHORTPRESS, SICON_BATT_0, SICON_BATT_1, SICON_BATT_2, SICON_BATT_3, SICON_BATT_4, SICON_BT_CONNECTED, SICON_BT_CONNVISIB, SICON_BT_ON, SICON_BT_VISIBLE, SICON_CHARGING, SICON_USB, SICON_WAIT1, SICON_WAIT2, SICON_WIFI_1, SICON_WIFI_2, SICON_WIFI_3, SICON_WIFI_CONNECTED, SIN, SIZE, SLEEP_FILE_NAME, SLOTS, SMALL_FONT, SMALL_ICON, SPLIT, SQRT, STAMP, START, STOP, STOPPED, STOP_ALL, STORE, STRING_TO_VALUE, STRIP, SUB, S_ICON_NOS, TAN, TERMINAL, TERM_SLOT, TESTLONGPRESS, TESTSHORTPRESS, TEXT, TEXTBOX, TEXTBOX_APPEND, TEXTBOX_READ, TINY_FONT, TMP_DIR, TONE, TOOLS_DIR, TOPLINE, TOPLINE_HEIGHT, TOTALSIZE, TO_BLUETOOTH, TO_BRICK, TO_COPY, TO_EXECUTE, TO_FILE, TO_MANUAL, TO_SDCARD, TO_TRASH, TO_USBSTICK, TO_WIFI, TRUNC, TST_ACCU_SWITCH, TST_BOOT_MODE2, TST_CLOSE, TST_CLOSE_MODE2, TST_DISABLE_UART, TST_ENABLE_UART, TST_OPEN, TST_POLL_MODE2, TST_RAM_CHECK, TST_READ_ADC, TST_READ_PINS, TST_READ_UART, TST_WRITE_PINS, TST_WRITE_UART, TYPE_BYTECODE, TYPE_COLOR, TYPE_DATALOG, TYPE_ENERGYMETER, TYPE_ERROR, TYPE_FOLDER, TYPE_GRAPHICS, TYPE_GYRO, TYPE_IIC_UNKNOWN, TYPE_IR, TYPE_KEEP, TYPE_MINITACHO, TYPE_NEWTACHO, TYPE_NONE, TYPE_NXT_COLOR, TYPE_NXT_IIC, TYPE_NXT_LIGHT, TYPE_NXT_SOUND, TYPE_NXT_TEMPERATURE, TYPE_NXT_TEST, TYPE_NXT_TOUCH, TYPE_NXT_ULTRASONIC, TYPE_PROGRAM, TYPE_REFRESH_BROWSER, TYPE_RESTART_BROWSER, TYPE_SDCARD, TYPE_SOUND, TYPE_TACHO, TYPE_TERMINAL, TYPE_TEXT, TYPE_THIRD_PARTY_END, TYPE_THIRD_PARTY_START, TYPE_TOUCH, TYPE_ULTRASONIC, TYPE_UNKNOWN, TYPE_USBSTICK, UNPACK, UPDATE, UPDATE_RUN, UP_BUTTON, USBSTICK_FOLDER, USER_SLOT, VALUE, VALUE16, VALUE32, VALUE8, VALUEF, VALUE_FORMATTED, VALUE_TO_STRING, VERSION, VERTBAR, VIEW_UNIT, VIEW_VALUE, VOLUME_FILE_NAME, WAITING, WAIT_FOR_PRESS, WAIT_HORZ, WAIT_VERT, WARNINGS, WARNING_BATTLOW, WARNING_BUSY, WARNING_CURRENT, WARNING_DSPSTAT, WARNING_MEMORY, WARNING_RAM, WARNING_TEMP, WARNING_VOLTAGE, WARNSIGN, WARN_BATT, WARN_MEMORY, WARN_POWER, WARN_TEMP, WHITECOLOR, WIFIPASSKEYSIZE, WIFI_FILE_NAME, WRITE_BYTES, WRITE_CONTENT, WRITE_FLUSH, WRITE_LOG, WRITE_TEXT, WRITE_VALUE, YELLOWCOLOR, YES_NOTSEL, YES_SEL
Instance Attribute Summary collapse
Instance Method Summary collapse
-
#assemble(rb_filename, rbf_filename, version: 109) ⇒ Object
Assemble a complete RBF program file.
- #compile(&block) ⇒ Object
- #image_header(image_size:, version:, object_count:, global_bytes:) ⇒ Object
-
#initialize ⇒ Assembler
constructor
A new instance of Assembler.
- #sub(_name, &body) ⇒ Object
- #variables ⇒ Object
- #vmthread(name, &body) ⇒ Object
- #write(rbf_filename, version = 109) ⇒ Object
Methods included from VariableDeclarer
#array8, #data16, #data32, #data8, #dataf, #datas
Methods included from Lignite
Methods included from Logger
Methods included from Bytes
#bin_to_hex, #f32, #hex_to_bin, #u16, #u32, #u8, #unpack_f32, #unpack_u16, #unpack_u32, #unpack_u8
Constructor Details
Instance Attribute Details
#objects ⇒ Array<RbfObject>
30 31 32 |
# File 'lib/lignite/assembler.rb', line 30 def objects @objects end |
Instance Method Details
#assemble(rb_filename, rbf_filename, version: 109) ⇒ Object
Assemble a complete RBF program file. (it is OK to reuse an Assembler and call this several times in a sequence) TODO: redesign for Assembler.new(rb_filename).assemble(rbf_filename)?
44 45 46 47 48 49 50 51 52 53 |
# File 'lib/lignite/assembler.rb', line 44 def assemble(rb_filename, rbf_filename, version: 109) initialize rb_text = File.read(rb_filename) @declarer = RbfDeclarer.new @declarer.instance_eval(rb_text, rb_filename, 1) # 1 is the line number instance_eval(rb_text, rb_filename, 1) # 1 is the line number write(rbf_filename, version) end |
#compile(&block) ⇒ Object
55 56 57 58 59 |
# File 'lib/lignite/assembler.rb', line 55 def compile(&block) @declarer = RbfDeclarer.new @declarer.instance_exec(&block) instance_exec(&block) end |
#image_header(image_size:, version:, object_count:, global_bytes:) ⇒ Object
24 25 26 27 |
# File 'lib/lignite/assembler.rb', line 24 def image_header(image_size:, version:, object_count:, global_bytes:) SIGNATURE + u32(image_size) + u16(version) + u16(object_count) + u32(global_bytes) end |
#sub(_name, &body) ⇒ Object
101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/lignite/assembler.rb', line 101 def sub(_name, &body) @locals = Variables.new bodyc = BodyCompiler.new(@globals, @locals, @declarer) bodyc.instance_exec(&body) bodyc.instance_exec do self.return object_end end @objects << RbfObject.subcall(body: bodyc.param_decl_header + bodyc.bytes, local_bytes: @locals.bytesize) end |
#variables ⇒ Object
85 86 87 |
# File 'lib/lignite/assembler.rb', line 85 def variables globals end |
#vmthread(name, &body) ⇒ Object
90 91 92 93 94 95 96 97 98 99 |
# File 'lib/lignite/assembler.rb', line 90 def vmthread(name, &body) @locals = Variables.new bodyc = BodyCompiler.new(@globals, @locals, @declarer) bodyc.instance_exec(&body) bodyc.instance_exec { object_end } logger.debug "VMTHREAD #{name}" logger.debug " size #{bodyc.bytes.bytesize}" logger.debug " " + bin_to_hex(bodyc.bytes) @objects << RbfObject.vmthread(body: bodyc.bytes, local_bytes: @locals.bytesize) end |
#write(rbf_filename, version = 109) ⇒ Object
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/lignite/assembler.rb', line 61 def write(rbf_filename, version = 109) image_size = HEADER_SIZE + @objects.map(&:size).reduce(0, :+) File.open(rbf_filename, "w") do |f| header = image_header(image_size: image_size, version: version, object_count: @objects.size, global_bytes: @globals.bytesize) f.write(header) object_instruction_offset = HEADER_SIZE + @objects.count * RbfObject::HEADER_SIZE @objects.each do |obj| h = obj.header(object_instruction_offset) f.write(h) object_instruction_offset += obj.body.bytesize end @objects.each do |obj| f.write(obj.body) # align?? end end end |