Class: Lignite::Assembler

Inherits:
Object
  • Object
show all
Includes:
Lignite, Bytes, Logger, VariableDeclarer
Defined in:
lib/lignite/assembler.rb

Overview

Assemble a complete RBF program file.

The compilation has two passes:

  1. pass1, Declaration

  2. 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

Methods included from VariableDeclarer

#array8, #data16, #data32, #data8, #dataf, #datas

Methods included from Lignite

program

Methods included from Logger

default_logger, #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

#initializeAssembler

Returns a new instance of Assembler.



34
35
36
37
# File 'lib/lignite/assembler.rb', line 34

def initialize
  @objects = []
  @globals = Variables.new
end

Instance Attribute Details

#globalsVariables

Returns:



32
33
34
# File 'lib/lignite/assembler.rb', line 32

def globals
  @globals
end

#objectsArray<RbfObject>

Returns:



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)?

Parameters:

  • rb_filename (String)

    input

  • rbf_filename (String)

    output



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

#variablesObject



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