diff --git a/architecture/MIPS-32-like.json b/architecture/MIPS-32-like.json index 759dc6eb2..83d12b4fa 100644 --- a/architecture/MIPS-32-like.json +++ b/architecture/MIPS-32-like.json @@ -1866,7 +1866,7 @@ "stopbit": 0 } ], - "definition": "ra=PC; if(rs >> 0 >=0){PC=PC+((off << 16) >> 14)}; \ncheck_protection_jal()" + "definition": "ra=PC; if(rs >> 0 >=0){PC=PC+((off << 16) >> 14)}; \ncheck_protection_jal(); draw_stack_jal();" }, { "name": "bgtz", @@ -2550,7 +2550,7 @@ "stopbit": 0 } ], - "definition": "ra=PC\nPC=addr; \ncheck_protection_jal()" + "definition": "ra=PC\nPC=addr; \ncheck_protection_jal(); draw_stack_jal();" }, { "name": "jalr", @@ -2592,7 +2592,7 @@ "valueField": "001001" } ], - "definition": "rd=PC\nPC=rs\ncheck_stack_limit(rd.name; sp.name; rd); \ncheck_protection_jal()" + "definition": "rd=PC\nPC=rs\ncheck_stack_limit(rd.name; sp.name; rd); \ncheck_protection_jal(); draw_stack_jal();" }, { "name": "jr", @@ -2628,7 +2628,7 @@ "valueField": "001000" } ], - "definition": "PC=rs; \ncheck_protection_jrra()" + "definition": "PC=rs; \ncheck_protection_jrra(); draw_stack_jrra();" }, { "name": "lb", @@ -7399,4 +7399,4 @@ "value": 268435455 } ] -} \ No newline at end of file +} diff --git a/components/architecture/creator_uielto_backup.js b/components/architecture/creator_uielto_backup.js index af9b8190c..0eabbe5ac 100644 --- a/components/architecture/creator_uielto_backup.js +++ b/components/architecture/creator_uielto_backup.js @@ -93,4 +93,5 @@ } - Vue.component('uielto-backup', uielto_backup) \ No newline at end of file + Vue.component('uielto-backup', uielto_backup) ; + diff --git a/components/architecture/creator_uielto_load_architecture.js b/components/architecture/creator_uielto_load_architecture.js index 871fa3e17..cc975d0c0 100644 --- a/components/architecture/creator_uielto_load_architecture.js +++ b/components/architecture/creator_uielto_load_architecture.js @@ -96,4 +96,5 @@ } - Vue.component('form-new-architecture', uielto_new_architecture) \ No newline at end of file + Vue.component('form-new-architecture', uielto_new_architecture) ; + diff --git a/components/assembly/creator_uielto_error.js b/components/assembly/creator_uielto_error.js index c2a639f71..72a141be0 100644 --- a/components/assembly/creator_uielto_error.js +++ b/components/assembly/creator_uielto_error.js @@ -69,5 +69,5 @@ ' ' } - Vue.component('assembly-error', uielto_assembly_error) + Vue.component('assembly-error', uielto_assembly_error) ; diff --git a/components/assembly/creator_uielto_examples.js b/components/assembly/creator_uielto_examples.js index b081ded4b..57d3a4a06 100644 --- a/components/assembly/creator_uielto_examples.js +++ b/components/assembly/creator_uielto_examples.js @@ -68,4 +68,5 @@ } - Vue.component('examples', uielto_examples) \ No newline at end of file + Vue.component('examples', uielto_examples) ; + diff --git a/components/assembly/creator_uielto_library_tags.js b/components/assembly/creator_uielto_library_tags.js index fae1fab84..79ff62884 100644 --- a/components/assembly/creator_uielto_library_tags.js +++ b/components/assembly/creator_uielto_library_tags.js @@ -41,4 +41,5 @@ } - Vue.component('list-libray-tags', uielto_library_tags) \ No newline at end of file + Vue.component('list-libray-tags', uielto_library_tags) ; + diff --git a/components/assembly/creator_uielto_shortcuts.js b/components/assembly/creator_uielto_shortcuts.js index f0c93f1f3..928ec666f 100644 --- a/components/assembly/creator_uielto_shortcuts.js +++ b/components/assembly/creator_uielto_shortcuts.js @@ -75,5 +75,5 @@ ' ' } - Vue.component('popover-shortcuts', uielto_shortcuts) + Vue.component('popover-shortcuts', uielto_shortcuts) ; diff --git a/components/assembly/creator_uielto_textarea_assembly.js b/components/assembly/creator_uielto_textarea_assembly.js index 849d76b41..cffd6d822 100644 --- a/components/assembly/creator_uielto_textarea_assembly.js +++ b/components/assembly/creator_uielto_textarea_assembly.js @@ -37,4 +37,5 @@ } - Vue.component('textarea-assembly', uielto_textarea_assembly) \ No newline at end of file + Vue.component('textarea-assembly', uielto_textarea_assembly) ; + diff --git a/components/general/creator_uielto_about.js b/components/general/creator_uielto_about.js index cfd5398ef..2f3304451 100644 --- a/components/general/creator_uielto_about.js +++ b/components/general/creator_uielto_about.js @@ -54,5 +54,6 @@ '' } - Vue.component('uielto-about', uielto_about) + Vue.component('uielto-about', uielto_about) ; + diff --git a/components/general/creator_uielto_author.js b/components/general/creator_uielto_author.js index 6e721d323..bcdc1c70b 100644 --- a/components/general/creator_uielto_author.js +++ b/components/general/creator_uielto_author.js @@ -51,5 +51,6 @@ ' ' } - Vue.component('card-author', uielto_author) + Vue.component('card-author', uielto_author) ; + diff --git a/components/general/creator_uielto_configuration.js b/components/general/creator_uielto_configuration.js index 4d10e6537..5bc05f113 100644 --- a/components/general/creator_uielto_configuration.js +++ b/components/general/creator_uielto_configuration.js @@ -229,5 +229,6 @@ } - Vue.component('form-configuration', uielto_configuration) + Vue.component('form-configuration', uielto_configuration) ; + diff --git a/components/general/creator_uielto_info.js b/components/general/creator_uielto_info.js index afa6b5d14..f0ac5e64e 100644 --- a/components/general/creator_uielto_info.js +++ b/components/general/creator_uielto_info.js @@ -70,5 +70,6 @@ ' ' } - Vue.component('popover-info', uielto_info) + Vue.component('popover-info', uielto_info) ; + diff --git a/components/general/creator_uielto_instruction_help.js b/components/general/creator_uielto_instruction_help.js index ba001ba79..537940749 100644 --- a/components/general/creator_uielto_instruction_help.js +++ b/components/general/creator_uielto_instruction_help.js @@ -68,5 +68,6 @@ '' } - Vue.component('spinner-loading', uielto_loading) + Vue.component('spinner-loading', uielto_loading) ; + diff --git a/components/general/creator_uielto_navbar.js b/components/general/creator_uielto_navbar.js index 367826d8b..0eb9ba3cd 100644 --- a/components/general/creator_uielto_navbar.js +++ b/components/general/creator_uielto_navbar.js @@ -61,5 +61,6 @@ ' ' } - Vue.component('navbar-creator', uielto_navbar) + Vue.component('navbar-creator', uielto_navbar) ; + diff --git a/components/general/creator_uielto_notifications.js b/components/general/creator_uielto_notifications.js index 731f104b8..8ceee7a3a 100644 --- a/components/general/creator_uielto_notifications.js +++ b/components/general/creator_uielto_notifications.js @@ -43,5 +43,6 @@ ' ' } - Vue.component('uielto-notifications', uielto_notifications) + Vue.component('uielto-notifications', uielto_notifications) ; + diff --git a/components/general/creator_uielto_supported_browser.js b/components/general/creator_uielto_supported_browser.js index bc09947c1..e1465a9a7 100644 --- a/components/general/creator_uielto_supported_browser.js +++ b/components/general/creator_uielto_supported_browser.js @@ -62,5 +62,6 @@ ' ' } - Vue.component('supported-browser', uielto_browser) + Vue.component('supported-browser', uielto_browser) ; + diff --git a/components/simulator/creator_uielto_data_view_selector.js b/components/simulator/creator_uielto_data_view_selector.js index fda973619..0f54a676c 100644 --- a/components/simulator/creator_uielto_data_view_selector.js +++ b/components/simulator/creator_uielto_data_view_selector.js @@ -98,4 +98,5 @@ } - Vue.component('data-view-selector', uielto_data_view_selector) \ No newline at end of file + Vue.component('data-view-selector', uielto_data_view_selector) ; + diff --git a/components/simulator/creator_uielto_keyboard.js b/components/simulator/creator_uielto_keyboard.js index 5bdd8bb4d..d33b3dc28 100644 --- a/components/simulator/creator_uielto_keyboard.js +++ b/components/simulator/creator_uielto_keyboard.js @@ -125,4 +125,4 @@ else{ return 1000; } - } \ No newline at end of file + } diff --git a/components/simulator/creator_uielto_memory_data.js b/components/simulator/creator_uielto_memory_data.js index 0616f7b20..ef37b5456 100644 --- a/components/simulator/creator_uielto_memory_data.js +++ b/components/simulator/creator_uielto_memory_data.js @@ -146,4 +146,5 @@ } - Vue.component('table-mem-data', uielto_memory_data) \ No newline at end of file + Vue.component('table-mem-data', uielto_memory_data) ; + diff --git a/components/simulator/creator_uielto_memory_stack.js b/components/simulator/creator_uielto_memory_stack.js index b8526da7e..5a7709575 100644 --- a/components/simulator/creator_uielto_memory_stack.js +++ b/components/simulator/creator_uielto_memory_stack.js @@ -252,4 +252,5 @@ } - Vue.component('table-mem-stack', uielto_memory_stack) \ No newline at end of file + Vue.component('table-mem-stack', uielto_memory_stack) ; + diff --git a/components/simulator/creator_uielto_memory_text.js b/components/simulator/creator_uielto_memory_text.js index 4f4f6a190..a2ad7152b 100644 --- a/components/simulator/creator_uielto_memory_text.js +++ b/components/simulator/creator_uielto_memory_text.js @@ -142,4 +142,5 @@ } - Vue.component('table-mem-text', uielto_memory_text) \ No newline at end of file + Vue.component('table-mem-text', uielto_memory_text) ; + diff --git a/components/simulator/creator_uielto_monitor.js b/components/simulator/creator_uielto_monitor.js index 32809b908..14777c947 100644 --- a/components/simulator/creator_uielto_monitor.js +++ b/components/simulator/creator_uielto_monitor.js @@ -46,5 +46,6 @@ } - Vue.component('monitor', uielto_monitor) + Vue.component('monitor', uielto_monitor) ; + diff --git a/components/simulator/creator_uielto_stats.js b/components/simulator/creator_uielto_stats.js index f87eb9bf5..7cb9e8826 100644 --- a/components/simulator/creator_uielto_stats.js +++ b/components/simulator/creator_uielto_stats.js @@ -46,4 +46,5 @@ } - Vue.component('stats', uielto_stats) \ No newline at end of file + Vue.component('stats', uielto_stats) ; + diff --git a/components/simulator/creator_uielto_stats_plot.js b/components/simulator/creator_uielto_stats_plot.js index bc6b2a358..f0ba903e3 100644 --- a/components/simulator/creator_uielto_stats_plot.js +++ b/components/simulator/creator_uielto_stats_plot.js @@ -111,4 +111,5 @@ } - Vue.component('plot-stats', uielto_stats_plot) \ No newline at end of file + Vue.component('plot-stats', uielto_stats_plot) ; + diff --git a/components/simulator/creator_uielto_stats_table.js b/components/simulator/creator_uielto_stats_table.js index 4b3b43fe5..144c1dfb9 100644 --- a/components/simulator/creator_uielto_stats_table.js +++ b/components/simulator/creator_uielto_stats_table.js @@ -57,4 +57,5 @@ } - Vue.component('table-stats', uielto_stats_table) \ No newline at end of file + Vue.component('table-stats', uielto_stats_table) ; + diff --git a/components/simulator/creator_uielto_table_execution.js b/components/simulator/creator_uielto_table_execution.js index 559deb45b..ff927fb4d 100644 --- a/components/simulator/creator_uielto_table_execution.js +++ b/components/simulator/creator_uielto_table_execution.js @@ -159,4 +159,5 @@ } - Vue.component('table-execution', uielto_execution) \ No newline at end of file + Vue.component('table-execution', uielto_execution) ; + diff --git a/js/app.js b/js/app.js index 64353bf2d..45745e771 100644 --- a/js/app.js +++ b/js/app.js @@ -2847,49 +2847,49 @@ try /*Load the available examples*/ load_examples_available( set_name ) { - this._data.example_loaded = new Promise(function(resolve, reject) { - - $.getJSON('examples/example_set.json', function(set) { - - // current architecture in upperCase - var current_architecture = app._data.architecture_name.toUpperCase() ; - - // search for set_name in the example set 'set' - for (var i=0; i 0) { + stack_call_names.pop() ; } + // return ok return ret; } @@ -243,7 +227,8 @@ function creator_callstack_getTop() }; // check params - if (0 == stack_call_registers.length) { + if (0 == stack_call_registers.length) + { ret.ok = false; ret.msg = "creator_callstack_getTop: empty stack_call_registers !!.\n"; return ret; @@ -266,7 +251,8 @@ function creator_callstack_setTop( field, indexComponent, indexElement, value ) }; // check params - if (0 == stack_call_registers.length) { + if (0 == stack_call_registers.length) + { ret.ok = false; ret.msg = "creator_callstack_getTop: empty stack_call_registers !!.\n"; return ret; @@ -284,24 +270,10 @@ function creator_callstack_setTop( field, indexComponent, indexElement, value ) return ret; } -function creator_callstack_setsp(value) -{ - - if (typeof window !== "undefined"){ - app._data.end_callee = value; // llamado: FFFFFFF0, FFFFFF00, FFFFF000 - } - - // check params - if (0 == stack_call_registers.length) { - return; - } - - // return the last element in the array - var elto = stack_call_registers[stack_call_registers.length - 1]; - elto.end_callee = value; - -} - +// +// Reset +// Example: creator_callstack_reset() ; +// function creator_callstack_reset() { var ret = { @@ -310,12 +282,10 @@ function creator_callstack_reset() }; // initialize stack_call + stack_call_names = []; stack_call_registers = []; - if (typeof window !== "undefined"){ - app._data.begin_caller = architecture.memory_layout[4].value; - app._data.end_caller = architecture.memory_layout[4].value; - app._data.begin_callee = architecture.memory_layout[4].value; - app._data.end_callee = architecture.memory_layout[4].value; - } + // return ok + return ret ; } + diff --git a/js/creator_track_stack.js b/js/creator_track_stack.js new file mode 100644 index 000000000..e3397f737 --- /dev/null +++ b/js/creator_track_stack.js @@ -0,0 +1,244 @@ +/* + * Copyright 2018-2021 Felix Garcia Carballeira, Diego Camarmas Alonso, Alejandro Calderon Mateos + * + * This file is part of CREATOR. + * + * CREATOR is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * CREATOR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with CREATOR. If not, see . + * + */ + + + /* + * Data Structure + */ + + /* + * track_stack_names = [ "PC=xxx", "main" ] ; + */ + var track_stack_names = []; + + /* + * track_stack_limits = [ + * { + * function_name: "", + * begin_caller: 0, + * end_caller: 0, + * begin_callee: 0, + * end_callee: 0 + * }, + * ... + * ] ; + */ + var track_stack_limits = []; + + + /* + * Public API + */ + +// +// Initialize +// Example: track_stack_create() ; +// +function track_stack_create() +{ + var ret = { + ok: true, + msg: "" + }; + + // initialize array + track_stack_names = []; + track_stack_limits = []; + + return ret; +} + +// +// "jal X, ..." -> add new element (at the end) +// Example: track_stack_Enter("main") +// +function track_stack_enter ( function_name ) +{ + var ret = { + ok: true, + msg: "" + }; + + // 1.- caller name + track_stack_names.push(function_name) ; + + // 2.- new call element + var new_elto = { + function_name: function_name, + begin_caller: track_stack_getTop().begin_callee, // llamante: FFFFFFFC, FFFFFFF0 + end_caller: architecture.memory_layout[4].value, // llamante: FFFFFFF0, FFFFFF00 + begin_callee: architecture.memory_layout[4].value, // llamado: FFFFFFF0, FFFFFF00 + end_callee: architecture.memory_layout[4].value // llamado: FFFFFFF0, FFFFFF00 + }; + + track_stack_limits.push(new_elto); + + // 3.- update UI + if (typeof window !== "undefined") + { + app._data.begin_caller = architecture.memory_layout[4].value; + app._data.end_caller = architecture.memory_layout[4].value; + app._data.begin_callee = architecture.memory_layout[4].value; + app._data.end_callee = architecture.memory_layout[4].value; + } + + return ret; +} + +// +// "jr ra, ..." -> remove last element +// Example: track_stack_Leave() ; +// +function track_stack_leave() +{ + var ret = { + ok: true, + msg: "" + }; + + // check params + if (0 == track_stack_limits.length) + { + ret.msg = "track_stack_Leave: empty track_stack_limits !!.\n"; + return ret; + } + + // pop both stacks + track_stack_limits.pop(); + if (track_stack_names.length > 0) { + track_stack_names.pop() ; + } + + // draw stack zones + var elto_top = track_stack_getTop() ; + if ( (typeof window !== "undefined") && (elto_top.val != null) ) + { + app._data.begin_caller = elto_top.val.begin_caller; // llamante: FFFFFFFC, FFFFFFF0, FFFFFF00 + app._data.end_caller = elto_top.val.end_caller; // llamante: FFFFFFF0, FFFFFF00, FFFFF000 + app._data.begin_callee = elto_top.val.begin_callee; // llamado: FFFFFFF0, FFFFFF00, FFFFF000 + app._data.end_callee = elto_top.val.end_callee; // llamado: FFFFFFF0, FFFFFF00, FFFFF000 + } + + return ret; +} + +// +// Get the last element +// Example: var elto = track_stack_getTop() ; +// +function track_stack_getTop() +{ + var ret = { + ok: true, + val: null, + msg: "" + }; + + // check params + if (0 == track_stack_limits.length) + { + ret.ok = false; + ret.msg = "track_stack_getTop: empty track_stack_limits !!.\n"; + return ret; + } + + // return the last element in the array + ret.val = track_stack_limits[track_stack_limits.length - 1]; + return ret; +} + +// +// Let programmers to modify some arbitrary field. +// Example: track_stack_getTop("function_name", 1, 2, "main") ; +// +function track_stack_setTop( field, indexComponent, indexElement, value ) +{ + var ret = { + ok: true, + msg: "" + }; + + // check params + if (0 == track_stack_limits.length) + { + ret.ok = false; + ret.msg = "track_stack_getTop: empty track_stack_limits !!.\n"; + return ret; + } + + // set field value + var elto = track_stack_limits[track_stack_limits.length - 1]; + if (typeof elto.length !== "undefined") + { + elto[field][indexComponent][indexElement] = value; + return ret; + } + + elto[field] = value; + return ret; +} + +// +// Updates the .end_callee field of the top stack element +// Example: track_stack_setsp("0xFFFFFFF0") ; +// +function track_stack_setsp(value) +{ + if (typeof window !== "undefined") { + app._data.end_callee = value; // llamado: FFFFFFF0, FFFFFF00, FFFFF000 + } + + // check params + if (0 == track_stack_limits.length) { + return; + } + + // return the last element in the array + var elto = track_stack_limits[track_stack_limits.length - 1]; + elto.end_callee = value; +} + +// +// Reset +// Example: track_stack_reset() ; +// +function track_stack_reset() +{ + var ret = { + ok: true, + msg: "" + }; + + // initialize stack_call + track_stack_names = []; + track_stack_limits = []; + + // draw new limits + if (typeof window !== "undefined") + { + app._data.begin_caller = architecture.memory_layout[4].value; + app._data.end_caller = architecture.memory_layout[4].value; + app._data.begin_callee = architecture.memory_layout[4].value; + app._data.end_callee = architecture.memory_layout[4].value; + } + + return ret ; +} + diff --git a/js/min.creator_node.js b/js/min.creator_node.js index 66ee1f7fe..b34f2a6a8 100644 --- a/js/min.creator_node.js +++ b/js/min.creator_node.js @@ -233,29 +233,29 @@ function register_value_serialize(object) */ - /* + /* * Data Structure */ - var stack_call_registers = []; + /* + * [ "x", "y" ] ; + */ + var stack_call_names = []; + /* - stack_call_registers = - [ - { - function_name: "", - begin_caller: 0, - end_caller: 0, - begin_callee: 0, - end_callee: 0, - registers_modified: [ indexComp: [ false, ... ]... ; // once per register: not modified - registers_saved: [ indexComp: [ false, ... ]... ; // once per register: saved on stack - registers_value: [ indexComp: [ 0x0, ... ], ... ; // once per register: initial value (before save) - register_address_write: [ indexComp: [ 0x0, ... ], ... ; // once per register: in which position is stored - register_address_read: [ indexComp: [ 0x0, ... ], ... ; // once per register: from which position is restored - }, - ... - ] ; - */ + * [ + * { + * function_name: "", + * registers_modified: [ indexComp: [ false, ... ]... ; // once per register: not modified + * registers_saved: [ indexComp: [ false, ... ]... ; // once per register: saved on stack + * registers_value: [ indexComp: [ 0x0, ... ], ... ; // once per register: initial value (before save) + * register_address_write: [ indexComp: [ 0x0, ... ], ... ; // once per register: in which position is stored + * register_address_read: [ indexComp: [ 0x0, ... ], ... ; // once per register: from which position is restored + * }, + * ... + * ] ; + */ + var stack_call_registers = []; /* @@ -274,6 +274,7 @@ function creator_callstack_create() }; // initialize stack_call + stack_call_names = []; stack_call_registers = []; return ret; @@ -290,13 +291,16 @@ function creator_callstack_enter(function_name) msg: "" }; - // initialize fields + // 1.- caller name + stack_call_names.push(function_name) ; + + // 2.- caller element var arr_saved = []; var arr_modified = []; var arr_write = [] var arr_read = [] var arr_value = [] - + for (var i = 0; i < architecture.components.length; i++) { arr_saved.push([]); @@ -315,28 +319,18 @@ function creator_callstack_enter(function_name) } } - if (typeof window !== "undefined"){ - app._data.begin_caller = architecture.memory_layout[4].value; - app._data.end_caller = architecture.memory_layout[4].value; - app._data.begin_callee = architecture.memory_layout[4].value; - app._data.end_callee = architecture.memory_layout[4].value; - } - - // initialize elto var new_elto = { function_name: function_name, - begin_caller: creator_callstack_getTop().begin_callee, // llamante: FFFFFFFC, FFFFFFF0 - end_caller: architecture.memory_layout[4].value, // llamante: FFFFFFF0, FFFFFF00 - begin_callee: architecture.memory_layout[4].value, // llamado: FFFFFFF0, FFFFFF00 - end_callee: architecture.memory_layout[4].value, // llamado: FFFFFFF0, FFFFFF00 registers_saved: arr_saved, registers_modified: arr_modified, registers_value: arr_value, register_address_write: arr_write, register_address_read: arr_read }; - + stack_call_registers.push(new_elto); + + // return ok return ret; } @@ -351,19 +345,20 @@ function creator_callstack_leave() msg: "" }; - // check params + // check params if (0 == stack_call_registers.length) { ret.msg = "creator_callstack_Leave: empty stack_call_registers !!.\n"; return ret; } + // get stack top element var last_elto = stack_call_registers[stack_call_registers.length - 1]; - // check values (check currrent state) + // check values (check currrent state) if (ret.ok) - { - for (var i = 0; i < architecture.components.length; i++) - { + { + for (var i = 0; i < architecture.components.length; i++) + { for (var j = 0; j < architecture.components[i].elements.length; j++) { if ((last_elto.registers_value[i][j] != architecture.components[i].elements[j].value) && @@ -375,30 +370,23 @@ function creator_callstack_leave() break; } } - } - - if(creator_callstack_getTop().val.end_caller != architecture.memory_layout[4].value){ - ret.ok = false; - ret.msg = "Possible failure in the parameter passing convention"; - } + } } - - /* + + /***************************** if (ret.ok) { for (var i = 0; i < architecture.components.length; i++) { for (var j = 0; j < architecture.components[i].elements.length; j++) { - if ( (true == last_elto.registers_modified[i][j]) && // modified but (false == last_elto.registers_saved[i][j]) && - (architecture.components[i].elements[j].properties.icludes("saved")) // ...but should be saved - ) + (architecture.components[i].elements[j].properties.icludes("saved")) // ...but should be saved + ) { ret.ok = false; - // ret.msg = "The value of one or more protected registers is not kept between calls"; ret.msg = "The value of one or more protected registers is not kept between calls"; break; } @@ -412,11 +400,11 @@ function creator_callstack_leave() for (var i = 0; i < architecture.components.length; i++) { for (var j = 0; j < architecture.components[i].elements.length; j++) - { + { if ( - (true == last_elto.registers_modified[i][j]) && // modified but - (last_elto.register_address_read[i][j] != last_elto.register_address_write[i][j]) && // not read the same address... - (architecture.components[i].elements[j].properties.includes("saved")) // ...but should be saved + (true == last_elto.registers_modified[i][j]) && // modified but + (last_elto.register_address_read[i][j] != last_elto.register_address_write[i][j]) && // not read the same address... + (architecture.components[i].elements[j].properties.includes("saved")) // ...but should be saved ) { ret.ok = false; @@ -428,19 +416,15 @@ function creator_callstack_leave() } } } - */ + **********************************/ + // pop stack stack_call_registers.pop(); - - var elto_top = creator_callstack_getTop() ; - if ( (typeof window !== "undefined") && (elto_top.val != null) ) - { - app._data.begin_caller = elto_top.val.begin_caller; // llamante: FFFFFFFC, FFFFFFF0, FFFFFF00 - app._data.end_caller = elto_top.val.end_caller; // llamante: FFFFFFF0, FFFFFF00, FFFFF000 - app._data.begin_callee = elto_top.val.begin_callee; // llamado: FFFFFFF0, FFFFFF00, FFFFF000 - app._data.end_callee = elto_top.val.end_callee; // llamado: FFFFFFF0, FFFFFF00, FFFFF000 + if (stack_call_names.length > 0) { + stack_call_names.pop() ; } + // return ok return ret; } @@ -457,7 +441,8 @@ function creator_callstack_getTop() }; // check params - if (0 == stack_call_registers.length) { + if (0 == stack_call_registers.length) + { ret.ok = false; ret.msg = "creator_callstack_getTop: empty stack_call_registers !!.\n"; return ret; @@ -480,7 +465,8 @@ function creator_callstack_setTop( field, indexComponent, indexElement, value ) }; // check params - if (0 == stack_call_registers.length) { + if (0 == stack_call_registers.length) + { ret.ok = false; ret.msg = "creator_callstack_getTop: empty stack_call_registers !!.\n"; return ret; @@ -498,24 +484,10 @@ function creator_callstack_setTop( field, indexComponent, indexElement, value ) return ret; } -function creator_callstack_setsp(value) -{ - - if (typeof window !== "undefined"){ - app._data.end_callee = value; // llamado: FFFFFFF0, FFFFFF00, FFFFF000 - } - - // check params - if (0 == stack_call_registers.length) { - return; - } - - // return the last element in the array - var elto = stack_call_registers[stack_call_registers.length - 1]; - elto.end_callee = value; - -} - +// +// Reset +// Example: creator_callstack_reset() ; +// function creator_callstack_reset() { var ret = { @@ -524,15 +496,13 @@ function creator_callstack_reset() }; // initialize stack_call + stack_call_names = []; stack_call_registers = []; - if (typeof window !== "undefined"){ - app._data.begin_caller = architecture.memory_layout[4].value; - app._data.end_caller = architecture.memory_layout[4].value; - app._data.begin_callee = architecture.memory_layout[4].value; - app._data.end_callee = architecture.memory_layout[4].value; - } + // return ok + return ret ; } + /* * Copyright 2018-2021 Felix Garcia Carballeira, Diego Camarmas Alonso, Alejandro Calderon Mateos * @@ -558,29 +528,40 @@ function creator_callstack_reset() * Description API */ -var caller_stack = []; - +// +// check stack +// -function check_protection_jal () // TODO: update the name to a proper one :-) +function check_protection_jal () { - var function_name = "main"; // TODO: get current subrutine name + var function_name = "" ; + // 1.- default function name is "PC = 0x..." + if (typeof architecture.components[0] != "undefined") { + function_name = "PC=" + architecture.components[0].elements[0].value ; + } + + // TODO: get current subrutine name and save into function_name + + // 2.- callstack_enter creator_callstack_enter(function_name) ; } -function check_protection_jrra () // TODO: update the name to a proper one :-) +function check_protection_jrra () { + // 1.- callstack_leave var ret = creator_callstack_leave(); - // If everything is ok, just return + // 2) If everything is ok, just return if (ret.ok) { return; } - // Othewise... - /* Google Analytics */ + // 3) Othewise report some warning... + // Google Analytics creator_ga('send', 'event', 'execute', 'execute.exception', 'execute.exception.protection_jrra' + ret.msg); + // User notification if (typeof window !== "undefined") { /* Show Web notification */ @@ -592,6 +573,37 @@ function check_protection_jrra () // TODO: update the name to a proper one :-) } } + +// +// draw stack +// + +function draw_stack_jal () +{ + var function_name = "" ; + + // 1.- default function name is "PC = 0x..." + if (typeof architecture.components[0] != "undefined") { + function_name = "PC=" + architecture.components[0].elements[0].value ; + } + + // TODO: get current subrutine name and save into function_name + + // 2.- callstack_enter + track_stack_enter(function_name) ; +} + +function draw_stack_jrra () +{ + // track leave + var ret = track_stack_leave() ; + + // check if any problem + if (ret.ok != true) { + console.log("WARNING: " + ret.msg) ; + } +} + /* * Copyright 2018-2021 Felix Garcia Carballeira, Diego Camarmas Alonso, Alejandro Calderon Mateos * @@ -6519,7 +6531,7 @@ function writeStackLimit ( stackLimit ) newRow++; } - creator_callstack_setsp(stackLimit); + track_stack_setsp(stackLimit); architecture.memory_layout[4].value = stackLimit; diff --git a/js/min.creator_web.js b/js/min.creator_web.js index 8a5feb89c..6f3050a1e 100644 --- a/js/min.creator_web.js +++ b/js/min.creator_web.js @@ -1 +1 @@ -function bi_intToBigInt(int_value,int_base){var auxBigInt=null;if(typeof bigInt!=="undefined"&&int_base==16)auxBigInt=bigInt(int_value,int_base).value;else if(typeof bigInt!=="undefined")auxBigInt=bigInt(parseInt(int_value)>>>0,int_base).value;else auxBigInt=BigInt(parseInt(int_value)>>>0,int_base);return auxBigInt}function register_value_deserialize(object){var auxObject=object;for(var i=0;i"}catch(e){o=o+e+"
"}}}return o}function hex2char8(hexvalue){var num_char=hexvalue.toString().length/2;var exponent=0;var pos=0;var valuec=new Array;for(var i=0;i=assembly.length){return null}while(":\t\n \r#".includes(assembly.charAt(index))&&index=assembly.length){return null}if(assembly.charAt(index)=="'"){index++;while(assembly.charAt(index)!="'"&&index0){if(memory[memory_hash[0]][memory[memory_hash[0]].length-1].Binary[3].Addr>architecture.memory_layout[3].value){instructions=[];pending_instructions=[];pending_tags=[];memory[memory_hash[0]]=[];data_tag=[];instructions_binary=[];memory[memory_hash[1]]=[];extern=[];memory[memory_hash[2]]=[];data=[];return packCompileError("m0","Data overflow","warning","danger")}}if(memory[memory_hash[1]].length>0){if(memory[memory_hash[1]][memory[memory_hash[1]].length-1].Binary[3].Addr>architecture.memory_layout[1].value){instructions=[];pending_instructions=[];pending_tags=[];memory[memory_hash[0]]=[];data_tag=[];instructions_binary=[];memory[memory_hash[1]]=[];extern=[];memory[memory_hash[2]]=[];data=[];return packCompileError("m0","Instruction overflow","warning","danger")}}for(var i=0;i2*architecture.directives[j].size){return packCompileError("m18",token,"error","danger")}auxTokenString=auxTokenString.substring(auxTokenString.length-2*architecture.directives[j].size,auxTokenString.length)}else{var re=new RegExp("[0-9-]{"+token.length+"}","g");if(token.search(re)==-1){return packCompileError("m15",token,"error","danger")}auxToken=parseInt(token)>>>0;auxTokenString=auxToken.toString(16).substring(auxToken.toString(16).length-2*architecture.directives[j].size,auxToken.toString(16).length).padStart(2*architecture.directives[j].size,"0");if(auxTokenString.length>2*architecture.directives[j].size){return packCompileError("m18",token,"error","danger")}auxTokenString=auxTokenString.substring(auxTokenString.length-2*architecture.directives[j].size,auxTokenString.length)}console_log(auxTokenString);ret=data_compiler(auxTokenString,architecture.directives[j].size,label,parseInt(auxTokenString,16)>>0,"byte");if(ret.status!="ok"){return ret}label=null;console_log(memory[memory_hash[0]]);console_log("byte Terminado");next_token();token=get_token();console_log(token);for(var z=0;z2*architecture.directives[j].size){return packCompileError("m18",token,"error","danger")}auxTokenString=auxTokenString.substring(auxTokenString.length-2*architecture.directives[j].size,auxTokenString.length)}else{var re=new RegExp("[0-9-]{"+token.length+"}","g");if(token.search(re)==-1){return packCompileError("m15",token,"error","danger")}auxToken=parseInt(token)>>>0;auxTokenString=auxToken.toString(16).substring(auxToken.toString(16).length-2*architecture.directives[j].size,auxToken.toString(16).length).padStart(2*architecture.directives[j].size,"0");if(auxTokenString.length>2*architecture.directives[j].size){return packCompileError("m18",token,"error","danger")}auxTokenString=auxTokenString.substring(auxTokenString.length-2*architecture.directives[j].size,auxTokenString.length)}console_log(auxTokenString);ret=data_compiler(auxTokenString,architecture.directives[j].size,label,parseInt(auxTokenString,16)>>0,"half");if(ret.status!="ok"){return ret}label=null;console_log(memory[memory_hash[0]]);console_log("half Terminado");next_token();token=get_token();console_log(token);for(var z=0;z2*architecture.directives[j].size){return packCompileError("m18",token,"error","danger")}auxTokenString=auxTokenString.substring(auxTokenString.length-2*architecture.directives[j].size,auxTokenString.length)}else{var re=new RegExp("[0-9-]{"+token.length+"}","g");if(token.search(re)==-1){return packCompileError("m15",token,"error","danger")}auxToken=parseInt(token)>>>0;auxTokenString=auxToken.toString(16).substring(auxToken.toString(16).length-2*architecture.directives[j].size,auxToken.toString(16).length).padStart(2*architecture.directives[j].size,"0");if(auxTokenString.length>2*architecture.directives[j].size){return packCompileError("m18",token,"error","danger")}auxTokenString=auxTokenString.substring(auxTokenString.length-2*architecture.directives[j].size,auxTokenString.length)}console_log(auxTokenString);ret=data_compiler(auxTokenString,architecture.directives[j].size,label,parseInt(auxTokenString,16)>>0,"word");if(ret.status!="ok"){return ret}label=null;console_log(memory[memory_hash[0]]);console_log("word Terminado");next_token();token=get_token();console_log(token);for(var z=0;z2*architecture.directives[j].size){return packCompileError("m18",token,"error","danger")}auxTokenString=auxTokenString.substring(auxTokenString.length-2*architecture.directives[j].size,auxTokenString.length)}else{var re=new RegExp("[0-9-]{"+token.length+"}","g");if(token.search(re)==-1){return packCompileError("m15",token,"error","danger")}auxToken=parseInt(token)>>>0;auxTokenString=auxToken.toString(16).substring(auxToken.toString(16).length-2*architecture.directives[j].size,auxToken.toString(16).length).padStart(2*architecture.directives[j].size,"0");if(auxTokenString.length>2*architecture.directives[j].size){return packCompileError("m18",token,"error","danger")}auxTokenString=auxTokenString.substring(auxTokenString.length-2*architecture.directives[j].size,auxTokenString.length)}ret=data_compiler(auxTokenString,architecture.directives[j].size,label,parseInt(auxTokenString,16)>>0,"double_word");if(ret.status!="ok"){return ret}label=null;console_log(memory[memory_hash[0]]);console_log("double word Terminado");next_token();token=get_token();console_log(token);for(var z=0;z2*architecture.directives[j].size){return packCompileError("m18",token,"error","danger")}auxTokenString=auxTokenString.substring(auxTokenString.length-2*architecture.directives[j].size,auxTokenString.length);token=hex2float(token)}else{var re=new RegExp("[+e0-9.-]{"+token.length+"}","g");if(token.search(re)==-1){return packCompileError("m15",token,"error","danger")}auxToken=parseFloat(token,10);auxTokenString=bin2hex(float2bin(auxToken)).padStart(2*architecture.directives[j].size,"0");if(auxTokenString.length>2*architecture.directives[j].size){return packCompileError("m18",token,"error","danger")}auxTokenString=auxTokenString.substring(auxTokenString.length-2*architecture.directives[j].size,auxTokenString.length)}console_log(auxTokenString);data_compiler(auxTokenString,architecture.directives[j].size,label,token,"float");if(ret.status!="ok"){return ret}label=null;console_log(memory[memory_hash[0]]);console_log("float Terminado");next_token();token=get_token();console_log(token);for(var z=0;z2*architecture.directives[j].size){return packCompileError("m18",token,"error","danger")}auxTokenString=auxTokenString.substring(auxTokenString.length-2*architecture.directives[j].size,auxTokenString.length);token=hex2double(token)}else{var re=new RegExp("[+e0-9.-]{"+token.length+"}","g");if(token.search(re)==-1){return packCompileError("m15",token,"error","danger")}auxToken=parseFloat(token,10);console_log(auxTokenString);auxTokenString=bin2hex(double2bin(auxToken)).padStart(2*architecture.directives[j].size,"0");if(auxTokenString.length>2*architecture.directives[j].size){return packCompileError("m18",token,"error","danger")}auxTokenString=auxTokenString.substring(auxTokenString.length-2*architecture.directives[j].size,auxTokenString.length)}console_log(auxTokenString);data_compiler(auxTokenString,architecture.directives[j].size,label,token,"float");if(ret.status!="ok"){return ret}label=null;console_log(memory[memory_hash[0]]);console_log("double Terminado");next_token();token=get_token();console_log(token);for(var z=0;z50*1024*1024){return packCompileError("m10",token,"error","danger")}var auxToken=parseInt(token)*architecture.directives[j].size;for(var i=0;ifieldsLength){return packCompileError("m12",token,"error","danger")}console_log(reg);console_log(reg.toString(2).padStart(fieldsLength,"0"));console_log(binary);console_log(binary.length);console_log(architecture.instructions[i].fields[a].startbit+1);console_log(binary.length-(architecture.instructions[i].fields[a].startbit+1));binary=binary.substring(0,binary.length-(architecture.instructions[i].fields[a].startbit+1))+reg.toString(2).padStart(fieldsLength,"0")+binary.substring(binary.length-architecture.instructions[i].fields[a].stopbit,binary.length);console_log(binary);re=RegExp("Field[0-9]+");instruction=instruction.replace(re,token)}else if(id==regNum){validReg=true;fieldsLength=architecture.instructions[i].fields[a].startbit-architecture.instructions[i].fields[a].stopbit+1;var reg=regNum;if(reg.toString(2).length>fieldsLength){return packCompileError("m12",token,"error","danger")}binary=binary.substring(0,binary.length-(architecture.instructions[i].fields[a].startbit+1))+reg.toString(2).padStart(fieldsLength,"0")+binary.substring(binary.length-architecture.instructions[i].fields[a].stopbit,binary.length);re=RegExp("Field[0-9]+");instruction=instruction.replace(re,token)}else if(z==architecture_hash.length-1&&w==architecture.components[z].elements.length-1&&validReg==false){return packCompileError("m4",token,"error","danger")}regNum++}}}}break;case"SFP-Reg":token=instructionParts[j];console_log(token);var validReg=false;var regNum=0;for(var a=0;afieldsLength){return packCompileError("m12",token,"error","danger")}binary=binary.substring(0,binary.length-(architecture.instructions[i].fields[a].startbit+1))+reg.toString(2).padStart(fieldsLength,"0")+binary.substring(binary.length-architecture.instructions[i].fields[a].stopbit,binary.length);re=RegExp("Field[0-9]+");console_log(instruction);instruction=instruction.replace(re,token);console_log(instruction)}else if(z==architecture_hash.length-1&&w==architecture.components[z].elements.length-1&&validReg==false){return packCompileError("m4",token,"error","danger")}if(architecture.components[z].type=="floating point"&&architecture.components[z].double_precision==false){regNum++}}}}}break;case"DFP-Reg":token=instructionParts[j];console_log(token);var validReg=false;var regNum=0;for(var a=0;afieldsLength){return packCompileError("m12",token,"error","danger")}binary=binary.substring(0,binary.length-(architecture.instructions[i].fields[a].startbit+1))+reg.toString(2).padStart(fieldsLength,"0")+binary.substring(binary.length-architecture.instructions[i].fields[a].stopbit,binary.length);re=RegExp("Field[0-9]+");instruction=instruction.replace(re,token)}else if(z==architecture_hash.length-1&&w==architecture.components[z].elements.length-1&&validReg==false){return packCompileError("m4",token,"error","danger")}if(architecture.components[z].type=="floating point"&&architecture.components[z].double_precision==true){regNum++}}}}}break;case"Ctrl-Reg":token=instructionParts[j];console_log(token);var validReg=false;var regNum=0;for(var a=0;afieldsLength){return packCompileError("m12",token,"error","danger")}binary=binary.substring(0,binary.length-(architecture.instructions[i].fields[a].startbit+1))+reg.toString(2).padStart(fieldsLength,"0")+binary.substring(binary.length-architecture.instructions[i].fields[a].stopbit,binary.length);re=RegExp("Field[0-9]+");instruction=instruction.replace(re,token)}else if(z==architecture_hash.length-1&&w==architecture.components[z].elements.length-1&&validReg==false){return packCompileError("m4",token,"error","danger")}if(architecture.components[z].type=="control"){regNum++}}}}}break;case"inm-signed":token=instructionParts[j];var token_user="";console_log(token);for(var a=0;afieldsLength){resultPseudo=pseudoinstruction_compiler(oriInstruction,label,line);console_log(resultPseudo);if(resultPseudo.status!="ok"){return resultPseudo}}if(isNaN(parseInt(token,16))==true){return packCompileError("m6",token,"error","danger")}inm=parseInt(token,16).toString(2)}else if(token.match(/^(\d)+\.(\d)+/)){if(float2bin(parseFloat(token)).length>fieldsLength){resultPseudo=pseudoinstruction_compiler(oriInstruction,label,line);console_log(resultPseudo);if(resultPseudo.status!="ok"){return resultPseudo}}if(isNaN(parseFloat(token))==true){return packCompileError("m6",token,"error","danger")}inm=float2bin(parseFloat(token,16))}else if(token.match(/^\'(.*?)\'$/)){var re=/^\'(.*?)\'$/;console_log(re);var match=re.exec(token);console_log(match);var asciiCode=match[1].charCodeAt(0);console_log(asciiCode);re=RegExp("Field[0-9]+");instruction=instruction.replace(re,asciiCode);inm=(asciiCode>>>0).toString(2)}else if(isNaN(parseInt(token))){validTagPC=false;startBit=architecture.instructions[i].fields[a].startbit;stopBit=architecture.instructions[i].fields[a].stopbit}else{var comNumPos=Math.pow(2,fieldsLength-1);var comNumNeg=comNumPos*-1;comNumPos=comNumPos-1;console_log(comNumPos);console_log(comNumNeg);if(parseInt(token,10)>comNumPos||parseInt(token,10)>>0).toString(2);inm=inm.substring(inm.length-fieldsLength,inm.length)}if(validTagPC==true){console_log(inm.length);if(inm.length>architecture.instructions[i].fields[a].startbit-architecture.instructions[i].fields[a].stopbit+1){return packCompileError("m12",token,"error","danger")}binary=generateBinary(architecture.instructions[i].separated,architecture.instructions[i].fields[a].startbit,architecture.instructions[i].fields[a].stopbit,binary,inm,fieldsLength,a)}re=RegExp("Field[0-9]+");instruction=instruction.replace(re,token)}}break;case"inm-unsigned":token=instructionParts[j];var token_user="";console_log(token);for(var a=0;ab-architecture.instructions[i].fields[a].stopbit[iii]+1).reduce((old,newV)=>old+newV)}fieldsLength=getFieldLength(architecture.instructions[i].separated,architecture.instructions[i].fields[a].startbit,architecture.instructions[i].fields[a].stopbit,a);var inm;if(token.match(/^0x/)){var value=token.split("x");if(value[1].length*4>fieldsLength){resultPseudo=pseudoinstruction_compiler(oriInstruction,label,line);console_log(resultPseudo);if(resultPseudo.status!="ok"){return resultPseudo}}if(isNaN(parseInt(token,16))==true){return packCompileError("m6",token,"error","danger")}inm=parseInt(token,16).toString(2)}else if(token.match(/^(\d)+\.(\d)+/)){if(float2bin(parseFloat(token)).length>fieldsLength){resultPseudo=pseudoinstruction_compiler(oriInstruction,label,line);console_log(resultPseudo);if(resultPseudo.status!="ok"){return resultPseudo}}if(isNaN(parseFloat(token))==true){return packCompileError("m6",token,"error","danger")}inm=float2bin(parseFloat(token,16))}else if(token.match(/^\'(.*?)\'$/)){var re=/^\'(.*?)\'$/;console_log(re);var match=re.exec(token);console_log(match);var asciiCode=match[1].charCodeAt(0);console_log(asciiCode);re=RegExp("Field[0-9]+");instruction=instruction.replace(re,asciiCode);inm=(asciiCode>>>0).toString(2)}else if(isNaN(parseInt(token))){validTagPC=false;startBit=architecture.instructions[i].fields[a].startbit;stopBit=architecture.instructions[i].fields[a].stopbit}else{var comNumPos=Math.pow(2,fieldsLength);console_log(comNumPos);if(parseInt(token,10)>comNumPos){console_log(oriInstruction);console_log(label);console_log(line);resultPseudo=pseudoinstruction_compiler(oriInstruction,label,line);console_log(resultPseudo);if(resultPseudo.status!="ok"){return resultPseudo}}if(isNaN(parseInt(token))==true&&resultPseudo==-3){return packCompileError("m6",token,"error","danger")}inm=(parseInt(token,10)>>>0).toString(2);inm=inm.substring(inm.length-fieldsLength,inm.length)}if(validTagPC==true){console_log(inm.length);if(inm.length>architecture.instructions[i].fields[a].startbit-architecture.instructions[i].fields[a].stopbit+1){return packCompileError("m12",token,"error","danger")}binary=generateBinary(architecture.instructions[i].separated,architecture.instructions[i].fields[a].startbit,architecture.instructions[i].fields[a].stopbit,binary,inm,fieldsLength,a)}re=RegExp("Field[0-9]+");instruction=instruction.replace(re,token)}}break;case"address":token=instructionParts[j];console_log(token);for(var a=0;afieldsLength){return packCompileError("m8",token,"error","danger")}if(isNaN(parseInt(token,16))==true){return packCompileError("m9",token,"error","danger")}addr=parseInt(token,16).toString(2);binary=generateBinary(architecture.instructions[i].separated,architecture.instructions[i].fields[a].startbit,architecture.instructions[i].fields[a].stopbit,binary,inm,fieldsLength,a);re=RegExp("Field[0-9]+");instruction=instruction.replace(re,token)}else{var validTag=false;startBit=architecture.instructions[i].fields[a].startbit;stopBit=architecture.instructions[i].fields[a].stopbit}}}break;case"offset_bytes":token=instructionParts[j];var token_user="";console_log(token);for(var a=0;afieldsLength){resultPseudo=pseudoinstruction_compiler(oriInstruction,label,line);console_log(resultPseudo);if(resultPseudo.status!="ok"){return resultPseudo}}if(isNaN(parseInt(token,16))==true){return packCompileError("m6",token,"error","danger")}inm=parseInt(token,16).toString(2)}else if(token.match(/^(\d)+\.(\d)+/)){if(float2bin(parseFloat(token)).length>fieldsLength){resultPseudo=pseudoinstruction_compiler(oriInstruction,label,line);console_log(resultPseudo);if(resultPseudo.status!="ok"){return resultPseudo}}if(isNaN(parseFloat(token))==true){return packCompileError("m6",token,"error","danger")}inm=float2bin(parseFloat(token,16))}else if(isNaN(parseInt(token))){validTagPC=false;startBit=architecture.instructions[i].fields[a].startbit;stopBit=architecture.instructions[i].fields[a].stopbit}else{var comNumPos=Math.pow(2,fieldsLength-1);var comNumNeg=comNumPos*-1;comNumPos=comNumPos-1;console_log(comNumPos);console_log(comNumNeg);if(parseInt(token,10)>comNumPos||parseInt(token,10)>>0).toString(2);inm=inm.substring(inm.length-fieldsLength,inm.length)}if(validTagPC==true){if(inm.length>architecture.instructions[i].fields[a].startbit-architecture.instructions[i].fields[a].stopbit+1){return packCompileError("m12",token,"error","danger")}binary=generateBinary(architecture.instructions[i].separated,architecture.instructions[i].fields[a].startbit,architecture.instructions[i].fields[a].stopbit,binary,inm,fieldsLength,a)}re=RegExp("Field[0-9]+");console_log(instruction);instruction=instruction.replace(re,token);console_log(instruction)}}break;case"offset_words":token=instructionParts[j];var token_user="";console_log(token);for(var a=0;afieldsLength){resultPseudo=pseudoinstruction_compiler(oriInstruction,label,line);console_log(resultPseudo);if(resultPseudo.status!="ok"){return resultPseudo}}if(isNaN(parseInt(token,16))==true){return packCompileError("m6",token,"error","danger")}inm=parseInt(token,16).toString(2)}else if(token.match(/^(\d)+\.(\d)+/)){if(float2bin(parseFloat(token)).length>fieldsLength){resultPseudo=pseudoinstruction_compiler(oriInstruction,label,line);console_log(resultPseudo);if(resultPseudo.status!="ok"){return resultPseudo}}if(isNaN(parseFloat(token))==true){return packCompileError("m6",token,"error","danger")}inm=float2bin(parseFloat(token,16))}else if(isNaN(parseInt(token))){validTagPC=false;startBit=architecture.instructions[i].fields[a].startbit;stopBit=architecture.instructions[i].fields[a].stopbit}else{var comNumPos=Math.pow(2,fieldsLength-1);var comNumNeg=comNumPos*-1;comNumPos=comNumPos-1;console_log(comNumPos);console_log(comNumNeg);if(parseInt(token,10)>comNumPos||parseInt(token,10)>>0).toString(2);inm=inm.substring(inm.length-fieldsLength,inm.length)}if(validTagPC==true){if(inm.length>architecture.instructions[i].fields[a].startbit-architecture.instructions[i].fields[a].stopbit+1){return packCompileError("m12",token,"error","danger")}binary=generateBinary(architecture.instructions[i].separated,architecture.instructions[i].fields[a].startbit,architecture.instructions[i].fields[a].stopbit,binary,inm,fieldsLength,a)}re=RegExp("Field[0-9]+");console_log(instruction);instruction=instruction.replace(re,token);console_log(instruction)}}break;default:token=instructionParts[j];console_log(token);for(var a=0;a{t=!ind?0:t;t+(cv-architecture.instructions[i].fields[a].stopbit[ind]+1)});console_log(architecture.instructions[i].co.join("").padStart(fieldsLength,"0"))}else{fieldsLength=architecture.instructions[i].fields[a].startbit-architecture.instructions[i].fields[a].stopbit+1;console_log(architecture.instructions[i].co.padStart(fieldsLength,"0"));binary=binary.substring(0,binary.length-(architecture.instructions[i].fields[a].startbit+1))+architecture.instructions[i].co.padStart(fieldsLength,"0")+binary.substring(binary.length-architecture.instructions[i].fields[a].stopbit,binary.length)}console_log(binary);re=RegExp("Field[0-9]+");console_log(instruction);instruction=instruction.replace(re,token);console_log(instruction)}if(architecture.instructions[i].fields[a].type=="cop"){fieldsLength=architecture.instructions[i].fields[a].startbit-architecture.instructions[i].fields[a].stopbit+1;binary=binary.substring(0,binary.length-(architecture.instructions[i].fields[a].startbit+1))+architecture.instructions[i].fields[a].valueField.padStart(fieldsLength,"0")+binary.substring(binary.length-architecture.instructions[i].fields[a].stopbit,binary.length)}}break}}if(validTagPC==false&&resultPseudo==-3){console_log("pendiente");var padding="";padding=padding.padStart(architecture.instructions[i].nwords*32-binary.length,"0");binary=binary+padding;var hex=bin2hex(binary);var auxAddr=address;console_log(binary);console_log(bin2hex(binary));pending_instructions.push({address:address,instruction:instruction,signature:signatureParts,signatureRaw:signatureRawParts,Label:label,binary:binary,startBit:startBit,stopBit:stopBit,visible:true,line:nEnters});if(pending==false){instructions.push({Break:null,Address:"0x"+address.toString(16),Label:label,loaded:instruction,user:userInstruction,_rowVariant:"",visible:true,hide:false});instructions_binary.push({Break:null,Address:"0x"+address.toString(16),Label:label,loaded:binary,user:null,_rowVariant:"",visible:false});address=address+4*architecture.instructions[i].nwords}else{for(var pos=0;pospendingAddress){instructions.splice(pos,0,{Break:null,Address:"0x"+pendingAddress.toString(16),Label:label,loaded:instruction,user:userInstruction,_rowVariant:"",visible:true,hide:false});instructions_binary.splice(pos,0,{Break:null,Address:"0x"+pendingAddress.toString(16),Label:label,loaded:binary,user:null,_rowVariant:"",visible:false});auxAddr=pendingAddress;break}}}console_log(address.toString(16));console_log(instructions);stopFor=true;break}else{if(resultPseudo==-3){console_log("no pendiente");var padding="";padding=padding.padStart(architecture.instructions[i].nwords*32-binary.length,"0");binary=binary+padding;var hex=bin2hex(binary);var auxAddr=address;console_log(binary);console_log(bin2hex(binary));if(pending==false){instructions.push({Break:null,Address:"0x"+address.toString(16),Label:label,loaded:instruction,user:userInstruction,_rowVariant:"",visible:true,hide:false});instructions_binary.push({Break:null,Address:"0x"+address.toString(16),Label:label,loaded:binary,user:null,_rowVariant:"",visible:false});address=address+4*architecture.instructions[i].nwords}else{for(var pos=0;pospendingAddress){instructions.splice(pos,0,{Break:null,Address:"0x"+pendingAddress.toString(16),Label:label,loaded:instruction,user:userInstruction,_rowVariant:"",visible:true,hide:false});instructions_binary.splice(pos,0,{Break:null,Address:"0x"+pendingAddress.toString(16),Label:label,loaded:binary,user:null,_rowVariant:"",visible:false});auxAddr=pendingAddress;break}}}stopFor=true;console_log(address.toString(16));console_log(instructions)}}}}return ret}function pseudoinstruction_compiler(instruction,label,line){var ret={errorcode:"",token:"",type:"",update:"",status:"ok"};var re=/\' \'/;instruction=instruction.replace(re,"'\0'");var re=/\'\\n\'/;instruction=instruction.replace(re,"10");console_log(instruction);var re=/\'\\t\'/;instruction=instruction.replace(re,"9");console_log(instruction);var instructionParts=instruction.split(" ");var found=false;var re=/\'\0\'/;instruction=instruction.replace(re,"' '");console_log(instruction);for(var i=0;i;\s]/;while(definition.search(re)!=-1){var match=re.exec(definition);console_log(match);var code;if(instructionParts[match[1]].match(/^\'(.*?)\'$/)){var re=/^\'(.*?)\'$/;console_log(re);var match2=re.exec(instructionParts[match[1]]);console_log(match2);var asciiCode=match2[1].charCodeAt(0);console_log(asciiCode);console_log("value = field('"+asciiCode+"', '("+match[2]+")', '"+match[3]+"')");code="value = field('"+asciiCode+"', '("+match[2]+")', '"+match[3]+"')"}else{console_log("value = field('"+instructionParts[match[1]]+"', '("+match[2]+")', '"+match[3]+"')");code="value = field('"+instructionParts[match[1]]+"', '("+match[2]+")', '"+match[3]+"')"}var value;try{eval(code)}catch(e){if(e instanceof SyntaxError){return packCompileError("m5",token,"error","danger")}}if(value==-1){return packCompileError("m5",token,"error","danger")}definition=definition.replace("Field."+match[1]+".("+match[2]+")."+match[3],value);re=/Field.(\d).\((.*?)\).(.*?)[;\s]/}re=/Field.(\d).SIZE[=<>;\s]/g;if(definition.search(re)!=-1){var match=re.exec(definition);console_log(match);var code;if(instructionParts[match[1]].match(/^\'(.*?)\'$/)){var re=/^\'(.*?)\'$/;console_log(re);var match2=re.exec(instructionParts[match[1]]);console_log(match2);var asciiCode=match2[1].charCodeAt(0);console_log(asciiCode);console_log("value = field('"+asciiCode+"', 'SIZE', null)");code="value = field('"+asciiCode+"', 'SIZE', null)"}else{console_log("value = field('"+instructionParts[match[1]]+"', 'SIZE', null)");code="value = field('"+instructionParts[match[1]]+"', 'SIZE', null)"}var value;try{eval(code)}catch(e){if(e instanceof SyntaxError){return packCompileError("m5",token,"error","danger")}}if(value==-1){return packCompileError("m5",token,"error","danger")}console_log(value);console_log("Field."+match[1]+".SIZE");definition=definition.replace("Field."+match[1]+".SIZE",value)}console_log(definition);re=/op\((.*)\)/;console_log(re);while(definition.search(re)!=-1){var match=re.exec(definition);var result;console_log(match[1]);eval("result="+match[1]);definition=definition.replace(re,result);console_log(definition)}while(definition.match(/\'(.*?)\'/)){var re=/\'(.*?)\'/;console_log(re);var match2=re.exec(instructionParts[match[1]]);console_log(match2);var asciiCode=match2[1].charCodeAt(0);console_log(asciiCode);definition=definition.replace(re,asciiCode)}console_log(definition);console_log(instruction);var re=new RegExp("'","g");instruction=instruction.replace(re,'"');console_log(instruction);var re=/{([^}]*)}/g;var code=re.exec(definition);if(code!=null){while(code!=null){var instructions=code[1].split(";");console_log(instructions);for(var j=0;j>>0).toString(2);binNum=binNum.padStart(32,"0");binNum=binNum.substring(31-startBit,32-endBit);var hexNum="0x"+bin2hex(binNum);return hexNum}else if(type=="float"){var binNum=float2bin(parseFloat(field));console_log(binNum);binNum=binNum.padStart(32,"0");binNum=binNum.substring(31-startBit,32-endBit);var hexNum="0x"+bin2hex(binNum);return hexNum}else if(type=="double"){var binNum=double2bin(parseFloat(field));console_log(binNum);binNum=binNum.padStart(64,"0");binNum=binNum.substring(63-startBit,64-endBit);var hexNum="0x"+bin2hex(binNum);return hexNum}}return-1}function hex2float(hexvalue){var value=hexvalue.split("x");var value_bit="";for(var i=0;i=3;i-=4){part=s.substr(i+1-4,4);accum=0;for(k=0;k<4;k+=1){if(part[k]!=="0"&&part[k]!=="1"){return{valid:false}}accum=accum*2+parseInt(part[k],10)}if(accum>=10){ret=String.fromCharCode(accum-10+"A".charCodeAt(0))+ret}else{ret=String(accum)+ret}}if(i>=0){accum=0;for(k=0;k<=i;k+=1){if(s[k]!=="0"&&s[k]!=="1"){return{valid:false}}accum=accum*2+parseInt(s[k],10)}ret=String(accum)+ret}return ret}function getFieldLength(separated,startbit,stopbit,a){let fieldsLength;if(!separated||!separated[a])fieldsLength=startbit-stopbit+1;else fieldsLength=startbit.map((b,i)=>b-stopbit[i]+1).reduce((old,newV)=>old+newV);return fieldsLength}function generateBinary(separated,startbit,stopbit,binary,inm,fieldsLenght,a){if(!separated||!separated[a])binary=binary.substring(0,binary.length-(startbit+1))+inm.padStart(fieldsLength,"0")+binary.substring(binary.length-stopbit,binary.length);else{let myInm=inm;for(let i=startbit.length-1;i>=0;i--){let sb=startbit[i],stb=stopbit[i],diff=sb-stb+1;if(myInm.length<=diff){binary=binary.substring(0,binary.length-(sb+1))+myInm.padStart(diff,"0")+binary.substring(binary.length-stb,binary.length);break}else{let tmpinm=inm.substring(myInm.length-diff,myInm.length);binary=binary.substring(0,binary.length-(sb+1))+tmpinm.padStart(diff,"0")+binary.substring(binary.length-stb,binary.length);myInm=myInm.substring(0,myInm.length-diff)}}}return binary}function checkTypeIEEE(s,e,m){let rd=0;if(!m&&!e)rd=s?1<<3:1<<4;else if(!e)rd=s?1<<2:1<<5;else if(!(e^255))if(m)rd=s?1<<8:1<<9;else rd=s?1<<0:1<<7;else rd=s?1<<1:1<<6;return rd}function binaryStringToInt(b){return parseInt(b,2)}function packExecute(error,err_msg,err_type,draw){var ret={};ret.error=error;ret.msg=err_msg;ret.type=err_type;ret.draw=draw;return ret}function executeInstruction(){var draw={space:[],info:[],success:[],danger:[],flash:[]};console_log(mutexRead);newExecution=false;do{console_log(executionIndex);console_log(architecture.components[0].elements[0].value);if(instructions.length==0){return packExecute(true,"No instructions in memory","danger",null)}if(executionIndex<-1){return packExecute(true,"The program has finished","danger",null)}if(executionIndex==-1){return packExecute(true,"The program has finished with errors","danger",null)}else if(mutexRead==true){return packExecute(false,"","info",null)}if(executionInit==1){for(var i=0;i>0)}if(architecture.instructions[auxIndex].fields[j].type=="inm-unsigned"){var value="";if(architecture.instructions[auxIndex].separated&&architecture.instructions[auxIndex].separated[j]==true){for(var sep_index=0;sep_index>0)}if(architecture.instructions[auxIndex].fields[j].type=="address"){var value="";if(architecture.instructions[auxIndex].separated&&architecture.instructions[auxIndex].separated[j]==true){for(var sep_index=0;sep_index>0)}if(architecture.instructions[auxIndex].fields[j].type=="offset_bytes"){var value="";if(architecture.instructions[auxIndex].separated&&architecture.instructions[auxIndex].separated[j]==true){for(var sep_index=0;sep_index>0)}}}console_log(auxDef);var compIndex;var elemIndex;var compIndex2;var elemIndex2;console_log(auxDef);re=/print_int\((.*?)\)/;if(auxDef.search(re)!=-1){match=re.exec(auxDef);for(var i=0;i=0;j--){var re;let myMatch,isMatch=false;re=new RegExp("(?:\\W|^)((("+architecture.components[i].elements[j].name.join("|")+") *=)[^=])","g");while((myMatch=re.exec(auxDef))!=null){auxDef=auxDef.replace(myMatch[2],"reg"+regIndex+"=");auxDef="var reg"+regIndex+"= null\n"+auxDef+"\nwriteRegister(reg"+regIndex+", "+i+", "+j+");";myMatch.index=0;isMatch=true}if(isMatch)regIndex++;if(architecture.components[i].type=="integer"){re=new RegExp("R"+regNum+" *=[^=]");if(auxDef.search(re)!=-1){re=new RegExp("R"+regNum+" *=","g");auxDef=auxDef.replace(re,"var reg"+regIndex+"=");auxDef="var reg"+regIndex+"=null\n"+auxDef;auxDef=auxDef+"\n writeRegister(reg"+regIndex+","+i+" ,"+j+");";regIndex++}}re=new RegExp("([^a-zA-Z0-9])(?:"+architecture.components[i].elements[j].name.join("|")+")(?!.name)");while(auxDef.search(re)!=-1){var match=re.exec(auxDef);auxDef=auxDef.replace(re,match[1]+"readRegister("+i+" ,"+j+")")}if(architecture.components[i].type=="integer"){re=new RegExp("R"+regNum+"[^0-9]|[\\s]","g");if(auxDef.search(re)!=-1){re=new RegExp("R"+regNum,"g");auxDef=auxDef.replace(re,"readRegister("+i+" ,"+j+")")}}if(architecture.components[i].type=="integer"){regNum--}}}re=new RegExp(".name","g");auxDef=auxDef.replace(re,"");console_log(auxDef);re=/check_stack_limit\((.*)\)/;if(auxDef.search(re)!=-1){var match=re.exec(auxDef);var args=match[1].split(";");re=new RegExp(" +","g");for(var i=0;i=instructions.length&&mutexRead==true){for(var i=0;i=instructions.length&&mutexRead==false){for(var i=0;iarchitecture.memory_layout[0].value&&parseInt(addr)architecture.memory_layout[2].value&&parseInt(addr)architecture.memory_layout[4].value&&parseInt(addr)architecture.memory_layout[0].value&&parseInt(addr)architecture.memory_layout[2].value&&parseInt(addr)architecture.memory_layout[4].value&&parseInt(addr)architecture.memory_layout[0].value&&parseInt(addr)architecture.memory_layout[2].value&&parseInt(addr)architecture.memory_layout[4].value&&parseInt(addr)architecture.memory_layout[0].value&&parseInt(addr)architecture.memory_layout[2].value&&parseInt(addr)architecture.memory_layout[4].value&&parseInt(addr)architecture.memory_layout[0].value&&addrarchitecture.memory_layout[2].value&&addrarchitecture.memory_layout[4].value&&addr>0}var charIndex=memValue.length-1;for(var z=0;z>0}if(typeof app!=="undefined")app._data.memory[index]=memory[index];return}}}for(var i=0;iaddr){var aux_addr=addr-addr%4;memory[index].splice(i,0,{Address:aux_addr,Binary:[],Value:parseInt(memValue,16)>>0,DefValue:null,reset:false});var charIndex=memValue.length-1;for(var z=0;z<4;z++){memory[index][i].Binary.push({Addr:aux_addr+z,DefBin:"00",Bin:memValue.charAt(charIndex-1).toUpperCase()+memValue.charAt(charIndex).toUpperCase(),Tag:null});charIndex=charIndex-2}if(typeof app!=="undefined")app._data.memory[index]=memory[index];return}else if(i==memory[index].length-1){var aux_addr=addr-addr%4;memory[index].push({Address:aux_addr,Binary:[],Value:parseInt(memValue,16)>>0,DefValue:null,reset:false});var charIndex=memValue.length-1;for(var z=0;z<4;z++){memory[index][i+1].Binary.push({Addr:aux_addr+z,DefBin:"00",Bin:memValue.charAt(charIndex-1).toUpperCase()+memValue.charAt(charIndex).toUpperCase(),Tag:null});charIndex=charIndex-2}if(typeof app!=="undefined")app._data.memory[index]=memory[index];return}}if(memory[index].length==0){var aux_addr=addr-addr%4;memory[index].push({Address:aux_addr,Binary:[],Value:parseInt(memValue,16)>>0,DefValue:null,reset:false});var charIndex=memValue.length-1;for(var z=0;z<4;z++){memory[index][memory[index].length-1].Binary.push({Addr:aux_addr+z,DefBin:"00",Bin:memValue.charAt(charIndex-1).toUpperCase()+memValue.charAt(charIndex).toUpperCase(),Tag:null});charIndex=charIndex-2}if(typeof app!=="undefined")app._data.memory[index]=memory[index];return}}if(type=="h"){if(addr>architecture.memory_layout[0].value&&addrarchitecture.memory_layout[2].value&&addrarchitecture.memory_layout[4].value&&addr>0)+" "}if(typeof app!=="undefined")app._data.memory[index]=memory[index];return}else{var charIndex=memValue.length-1;for(var z=2;zaddr){var aux_addr=addr-addr%4;memory[index].splice(i,0,{Address:aux_addr,Binary:[],Value:null,DefValue:null,reset:false});var charIndex=memValue.length-1;for(var z=0;z<4;z++){memory[index][i].Binary.push({Addr:aux_addr+z,DefBin:"00",Bin:"00",Tag:null})}for(var j=0;j>0);if(typeof app!=="undefined")app._data.memory[index]=memory[index];return}else{var charIndex=memValue.length-1;for(var z=2;z>0)+" 0";if(typeof app!=="undefined")app._data.memory[index]=memory[index];return}}}return}else if(i==memory[index].length-1){var aux_addr=addr-addr%4;memory[index].push({Address:aux_addr,Binary:[],Value:null,DefValue:null,reset:false});var charIndex=memValue.length-1;for(var z=0;z<4;z++){memory[index][i+1].Binary.push({Addr:aux_addr+z,DefBin:"00",Bin:"00",Tag:null})}for(var j=0;j>0);if(typeof app!=="undefined")app._data.memory[index]=memory[index];return}else{var charIndex=memValue.length-1;for(var z=2;z>0);if(typeof app!=="undefined")app._data.memory[index]=memory[index];return}else{var charIndex=memValue.length-1;for(var z=2;z>0)+" 0";if(typeof app!=="undefined")app._data.memory[index]=memory[index];return}}}return}}if(type=="b"){if(addr>architecture.memory_layout[0].value&&addrarchitecture.memory_layout[2].value&&addrarchitecture.memory_layout[4].value&&addraddr){var aux_addr=addr-addr%4;memory[index].splice(i,0,{Address:aux_addr,Binary:[],Value:null,DefValue:null,reset:false});var charIndex=memValue.length-1;for(var z=0;z<4;z++){memory[index][i].Binary.push({Addr:aux_addr+z,DefBin:"00",Bin:"00",Tag:null})}for(var j=0;j=architecture.memory_layout[2].value){draw.danger.push(executionIndex);executionIndex=-1;throw packExecute(true,"Segmentation fault. You tried to read in the text segment","danger",null)}else if(stackLimit<=architecture.memory_layout[1].value&&stackLimit>=architecture.memory_layout[0].value){draw.danger.push(executionIndex);executionIndex=-1;throw packExecute(true,"Segmentation fault. You tried to read in the text segment","danger",null)}else{var diff=memory[memory_hash[2]][0].Address-stackLimit;var auxStackLimit=stackLimit;var newRow=0;for(var i=0;i>0;if(typeof app!=="undefined")app._data.display+=val_int;else process.stdout.write(val_int+"\n");display+=val_int;break;case"print_float":var value=architecture.components[indexComp].elements[indexElem].value;if(typeof app!=="undefined")app._data.display+=value;else process.stdout.write(value+"\n");display+=value;break;case"print_double":var value=architecture.components[indexComp].elements[indexElem].value;if(typeof app!=="undefined")app._data.display+=value;else process.stdout.write(value+"\n");display+=value;break;case"print_string":var addr=architecture.components[indexComp].elements[indexElem].value;var index;if(parseInt(addr)>architecture.memory_layout[0].value&&parseInt(addr)architecture.memory_layout[2].value&&parseInt(addr)architecture.memory_layout[4].value&&parseInt(addr) ");var value=parseInt(keystroke);keyboard=keyboard+" "+value;writeRegister(value,indexComp,indexElem);return packExecute(false,"The data has been uploaded","danger",null)}if(first_time==true){document.getElementById("enter_keyboard").scrollIntoView()}mutexRead=true;app._data.enter=false;console_log(mutexRead);if(newExecution==true){app._data.keyboard="";consoleMutex=false;mutexRead=false;app._data.enter=null;show_notification("The data has been uploaded","info");if(runProgram==false){app.executeProgram()}return packExecute(false,"The data has been uploaded","danger",null)}if(consoleMutex==false){setTimeout(syscall,1e3,"read_int",indexComp,indexElem,indexComp2,indexElem2,false)}else{var value=parseInt(app._data.keyboard);console_log(value);writeRegister(value,indexComp,indexElem);app._data.keyboard="";consoleMutex=false;mutexRead=false;app._data.enter=null;show_notification("The data has been uploaded","info");if(executionIndex>=instructions.length){for(var i=0;i ");var value=parseFloat(keystroke);keyboard=keyboard+" "+value;writeRegister(value,indexComp,indexElem);return packExecute(false,"The data has been uploaded","danger",null)}if(first_time==true){document.getElementById("enter_keyboard").scrollIntoView()}mutexRead=true;app._data.enter=false;console_log(mutexRead);if(newExecution==true){app._data.keyboard="";consoleMutex=false;mutexRead=false;app._data.enter=null;show_notification("The data has been uploaded","info");if(runProgram==false){app.executeProgram()}return}if(consoleMutex==false){setTimeout(syscall,1e3,"read_float",indexComp,indexElem,indexComp2,indexElem2,false)}else{var value=parseFloat(app._data.keyboard,10);console_log(value);writeRegister(value,indexComp,indexElem);app._data.keyboard="";consoleMutex=false;mutexRead=false;app._data.enter=null;show_notification("The data has been uploaded","info");if(executionIndex>=instructions.length){for(var i=0;i ");var value=parseFloat(keystroke);keyboard=keyboard+" "+value;writeRegister(value,indexComp,indexElem);return packExecute(false,"The data has been uploaded","danger",null)}if(first_time==true){document.getElementById("enter_keyboard").scrollIntoView()}mutexRead=true;app._data.enter=false;console_log(mutexRead);if(newExecution==true){app._data.keyboard="";consoleMutex=false;mutexRead=false;app._data.enter=null;show_notification("The data has been uploaded","info");if(runProgram==false){app.executeProgram()}return}if(consoleMutex==false){setTimeout(syscall,1e3,"read_double",indexComp,indexElem,indexComp2,indexElem2,false)}else{var value=parseFloat(app._data.keyboard,10);console_log(value);writeRegister(value,indexComp,indexElem);app._data.keyboard="";consoleMutex=false;mutexRead=false;app._data.enter=null;show_notification("The data has been uploaded","info");if(executionIndex>=instructions.length){for(var i=0;i ");var value="";for(var i=0;i=instructions.length){for(var i=0;i=architecture.memory_layout[4].value){executionIndex=-1;return packExecute(true,"Not enough memory for data segment","danger",null)}for(var i=0;i ");var value=keystroke.charCodeAt(0);keyboard=keyboard+" "+value;writeRegister(value,indexComp,indexElem);return packExecute(false,"The data has been uploaded","danger",null)}if(first_time==true){document.getElementById("enter_keyboard").scrollIntoView()}mutexRead=true;app._data.enter=false;console_log(mutexRead);if(newExecution==true){app._data.keyboard="";consoleMutex=false;mutexRead=false;app._data.enter=null;show_notification("The data has been uploaded","info");if(runProgram==false){app.executeProgram()}return}if(consoleMutex==false){setTimeout(syscall,1e3,"read_char",indexComp,indexElem,indexComp2,indexElem2,false)}else{var value=app._data.keyboard.charCodeAt(0);writeRegister(value,indexComp,indexElem);app._data.keyboard="";consoleMutex=false;mutexRead=false;app._data.enter=null;show_notification("The data has been uploaded","info");console_log(mutexRead);if(executionIndex>=instructions.length){for(var i=0;iarchitecture.memory_layout[0].value&&parseInt(addr)architecture.memory_layout[2].value&&parseInt(addr)architecture.memory_layout[4].value&&parseInt(addr)0;i++){for(var j=0;j=instructions.length){for(var i=0;ivalue.length-1){memory[index][i].Binary.push({Addr:auxAddr,DefBin:"00",Bin:"00",Tag:null})}else{memory[index][i].Binary.push({Addr:auxAddr,DefBin:"00",Bin:value.charCodeAt(valueIndex).toString(16),Tag:null});memory[index][i].Value=value.charAt(valueIndex)+" "+memory[index][i].Value}auxAddr++;valueIndex++}i++}return ret}function updateDouble(comp,elem){for(var j=0;j"+'\t\t
'+'\t\t
'+'\t \t
'+'\t \t'+"\t \t
"+"\t \t
"+'\t \tLoading...'+"\t \t
"+"\t
"+"\t"};Vue.component("spinner-loading",uielto_loading);var uielto_browser={template:"\t
"+'\t You are using an unsupported browser, please use one of the following:'+"\t
"+"\t "+'\t '+"\t Google Chrome 70+"+'\t '+'\t '+"\t "+"\t "+"\t "+'\t '+"\t Mozilla Firefox 60+"+'\t '+'\t '+"\t "+"\t "+"\t "+"\t "+'\t '+"\t Apple Safari 12+"+'\t '+'\t '+"\t "+"\t "+"\t "+"\t "+"\t
"};Vue.component("supported-browser",uielto_browser);var uielto_navbar={props:{version:{type:String,required:true},architecture_name:{type:String,required:true}},template:'\t'+'\t '+'\t
'+'\t
'+'\t
'+'\t\t\t\t

Creator {{version}}

'+"\t\t\t
"+'\t
{{architecture_name}}
'+'\t
'+'\t
'+"\t didaCtic and geneRic assEmbly progrAmming simulaTOR"+"\t
"+"\t
"+"\t
"+"\t
"+"\t"+'\t '+"\t"+'\t '+'\t '+'\t '+'\t \t'+"\t "+"\t"+'\t '+'\t \t'+"\t "+"\t "+"\t "+"\t
"};Vue.component("navbar-creator",uielto_navbar);var uielto_configuration={props:{instructions_packed:{type:Number,required:true},autoscroll:{type:Boolean,required:true},notification_time:{type:Number,required:true},dark:{type:Boolean,required:true},c_debug:{type:Boolean,required:true}},methods:{change_execution_speed(value){var prevInstructionPacked=this._props.instructions_packed;if(value){this._props.instructions_packed=this._props.instructions_packed+value;if(this._props.instructions_packed<1){this._props.instructions_packed=1}if(this._props.instructions_packed>101){this._props.instructions_packed=101}}else{this._props.instructions_packed=parseInt(this._props.instructions_packed)}app._data.instructionsPacked=this._props.instructions_packed;localStorage.setItem("instructionsPacked",this._props.instructions_packed);creator_ga("send","event","configuration","configuration.execution_speed","configuration.execution_speed.less_speed_"+(prevInstructionPacked>this._props.instructionsPacked).toString())},change_autoscroll(){this._props.autoscroll=!this._props.autoscroll;localStorage.setItem("autoscroll",this._props.autoscroll);app._data.autoscroll=this._props.autoscroll;creator_ga("send","event","configuration","configuration.autoscroll","configuration.autoscroll."+this._props.autoscroll)},change_notification_time(value){var prevNotificationTime=this._props.notification_time;if(value){this._props.notification_time=this._props.notification_time+value;if(this._props.notification_time<1e3){this._props.notification_time=1e3}if(this._props.notification_time>3500){this._props.notification_time=3500}}else{this._props.notification_time=parseInt(this._props.notification_time)}app._data.notificationTime=this._props.notification_time;localStorage.setItem("notificationTime",this._props.notification_time);creator_ga("send","event","configuration","configuration.notification_time","configuration.notification_time.less_time_"+(prevNotificationTime>this._props.notificationTime).toString())},change_dark_mode(){this._props.dark=!this._props.dark;if(this._props.dark){document.getElementsByTagName("body")[0].style="filter: invert(88%) hue-rotate(160deg) !important; background-color: #111 !important;";localStorage.setItem("dark_mode","filter: invert(88%) hue-rotate(160deg) !important; background-color: #111 !important;")}else{document.getElementsByTagName("body")[0].style="";localStorage.setItem("dark_mode","")}app._data.dark=this._props.dark;creator_ga("send","event","configuration","configuration.dark_mode","configuration.dark_mode."+this._props.dark)}},template:"\t"+""+' \t '+' '+" \t\t "+" \t "+' \t -'+" \t "+' '+" "+" \t "+' \t +'+" \t "+" \t\t "+" \t "+""+' \t '+' '+' '+" "+" \t "+""+' \t '+' '+" \t\t "+" "+' -'+" "+' '+" "+" "+' +'+" "+" \t\t "+" \t "+""+' \x3c!--'+' '+" "+" "+' -'+" "+' '+" "+" "+' +'+" "+" "+" --\x3e"+""+' \t '+' '+' '+" "+" \t "+""+' \t '+' '+' '+" \t "+""+" \t "};Vue.component("form-configuration",uielto_configuration);var uielto_info={props:{target:{type:String,required:true},show_instruction_help:{type:Boolean,required:true}},methods:{closePopover(){this.$root.$emit("bv::hide::popover")}},template:'\t'+"\t "+"\t"+'\t
'+'\t "+'\t '+"\t Help"+"\t "+'\t "+'\t '+"\t Instruction Help"+"\t "+'\t "+'\t '+"\t Show Notifications"+"\t "+'\t "+'\t '+"\t About us"+"\t "+"\t
"+"\t
"};Vue.component("popover-info",uielto_info);var uielto_about={template:""+""+""+""+""+""+""+""+""};Vue.component("uielto-about",uielto_about);var uielto_author={props:{author_img:{type:String,required:true},author_alt:{type:String,required:true},author_full_name:{type:String,required:true},author_href_linked:{type:String,required:false},author_href_rgate:{type:String,required:false},author_href_github:{type:String,required:false}},template:' '+" "+'\t
{{ author_full_name }}
'+"\t
"+'\t '+'\t '+" linkedin"+"\t "+"\t
"+'\t '+'\t '+" r-gate"+"\t "+"\t
"+'\t '+'\t '+" github"+"\t "+"
"+"
"};Vue.component("card-author",uielto_author);var uielto_notifications={props:{notifications:{type:Array,required:true}},template:"
"+' '+" There's no notification at the moment"+" "+' '+' '+' '+' '+" {{item.mess}}"+" "+' {{item.time}} - {{item.date}}'+" "+"
"};Vue.component("uielto-notifications",uielto_notifications);var uielto_instruction_help={props:{architecture:{type:Object,required:true},id:{type:String,required:true}},data:function(){return{instHelpFilter:null,insHelpFields:["name"]}},template:''+'\t
'+"\t"+"\t "+"\t"+"\t
"+"\t"+'\t '+"\t"+'\t "+"\t"+"\t "+"\t"+"\t
"+""+' A backup is available'+"
"+' Date: {{date_copy}}'+'
'+'
'+' '+" Discard"+" "+"
"+'
'+' '+" Load"+" "+"
"+"
"+" "};Vue.component("uielto-backup",uielto_backup);var uielto_examples={props:{example_available:{type:Array,required:true},compile:{type:String,required:true},modal:{type:String,required:true}},methods:{load_example(url,compile){this.$root.$emit("bv::hide::modal",this._props.modal,"#closeExample");$.get(url,(function(data){code_assembly=data;if(compile=="false"){textarea_assembly_editor.setValue(code_assembly)}else{app.assembly_compiler(code_assembly)}show_notification(" The selected example has been loaded correctly","success");creator_ga("send","event","example","example.loading","example.loading."+url)}))}},template:"
"+' '+" There's no examples at the moment"+" "+" "+" '+" {{item.name}}:"+' '+" "+" "+"
"};Vue.component("examples",uielto_examples);var uielto_textarea_assembly={props:{browser:{type:String,required:true}},template:'
'+' Assembly:'+" "+' '+" "+' '+"
"};Vue.component("textarea-assembly",uielto_textarea_assembly);var uielto_library_tags={props:{instructions_tag:{type:Array,required:true}},template:'
'+' Library tags:'+" "+' '+' '+" {{item.tag}}"+" "+" "+" "+"
"};Vue.component("list-libray-tags",uielto_library_tags);var uielto_shortcuts={props:{target:{type:String,required:true},browser:{type:String,required:true}},template:'\t'+"\t\t"+'\t\t '+"\t\t Copy   "+'\t\t Ctrl + c'+'\t\t ⌘ + c'+"\t\t "+"\t"+'\t\t '+"\t\t Cut    "+'\t\t Ctrl + x'+'\t\t ⌘ + x'+"\t\t "+"\t"+'\t\t '+"\t\t Paste   "+'\t\t Ctrl + v'+'\t\t ⌘ + v'+"\t\t "+"\t"+'\t\t '+"\t\t Select all   "+'\t\t Ctrl + a'+'\t\t ⌘ + a'+"\t\t "+"\t"+'\t\t '+"\t\t Undo   "+'\t\t Ctrl + z'+'\t\t ⌘ + z'+"\t\t "+"\t"+'\t\t '+"\t\t Redo   "+'\t\t Ctrl + y'+'\t\t ⌘ + y'+"\t\t "+"\t"+'\t\t '+"\t\t Block code comment   "+'\t\t Ctrl + m'+'\t\t ⌘ + m'+"\t\t "+"\t\t"+"\t"};Vue.component("popover-shortcuts",uielto_shortcuts);var uielto_assembly_error={props:{modal_assembly_error:{type:Object,required:true}},template:"
"+' Code fragment:'+'
'+' '+" "+" "+'  '+' ...'+'  '+" "+" "+'  '+' {{modal_assembly_error.line1}}'+' {{modal_assembly_error.code1}}'+" "+" "+' *'+' {{modal_assembly_error.line2}}'+' {{modal_assembly_error.code2}}'+" "+" "+'  '+' {{modal_assembly_error.line3}}'+' {{modal_assembly_error.code3}}'+" "+" "+'  '+' ...'+'  '+" "+" "+" "+"
"+"
"+" "+' Error description:'+"
"+' {{modal_assembly_error.error}}'+"
"+"
"};Vue.component("assembly-error",uielto_assembly_error);var uielto_calculator={data:function(){return{calculator:{bits:32,hexadecimal:"",sign:"",exponent:"",mantissa:"",mantisaDec:0,exponentDec:"",decimal:"",variant32:"primary",variant64:"outline-primary",lengthHexadecimal:8,lengthSign:1,lengthExponent:8,lengthMantissa:23}}},methods:{changeBitsCalculator(index){if(index==0){this.calculator.bits=32;this.calculator.variant32="primary";this.calculator.variant64="outline-primary";this.calculator.lengthHexadecimal=8;this.calculator.lengthSign=1;this.calculator.lengthExponent=8;this.calculator.lengthMantissa=23}if(index==1){this.calculator.bits=64;this.calculator.variant64="primary";this.calculator.variant32="outline-primary";this.calculator.lengthHexadecimal=16;this.calculator.lengthSign=1;this.calculator.lengthExponent=11;this.calculator.lengthMantissa=52}this.calculator.hexadecimal="";this.calculator.sign="";this.calculator.exponent="";this.calculator.mantissa="";this.calculator.decimal="";this.calculator.sign="";this.calculator.exponentDec="";this.calculator.mantissaDec=""},calculatorFunct(index){switch(index){case 0:console_log(this.calculator.hexadecimal.padStart(this.calculator.bits/4,"0"));var hex=this.calculator.hexadecimal.padStart(this.calculator.bits/4,"0");var float;var binary;if(this.calculator.bits==32){var re=/[0-9A-Fa-f]{8}/g;if(!re.test(hex)){show_notification("Character not allowed","danger");this.calculator.sign="";this.calculator.exponent="";this.calculator.mantissa="";this.calculator.exponentDec="";this.calculator.mantissaDec=0;this.calculator.decimal="";return}float=hex2float("0x"+hex);console_log(hex2float("0x"+hex));binary=float2bin(float).padStart(this.calculator.bits,"0");this.calculator.decimal=float;this.calculator.sign=binary.substring(0,1);this.calculator.exponent=binary.substring(1,9);this.calculator.mantissa=binary.substring(9,32);this.calculator.exponentDec=parseInt(bin2hex(this.calculator.exponent),16);this.calculator.mantissaDec=0;var j=0;for(var i=0;i"+'\t
'+'\t
'+'\t
'+'\t
'+'\t
'+'\t '+"\t 32 bit"+"\t "+"\t
"+'\t
'+'\t '+"\t 64 bit"+"\t "+"\t
"+"\t
"+"\t
"+'\t
'+"\t
"+"\t"+'\t
'+'\t
'+'\t
'+'\t '+"\t "+"\t
"+'\t
'+"\t
"+"\t"+'\t
'+'\t
'+'\t
'+'\t '+"\t
"+'\t
'+"\t
"+"\t"+'\t
'+'\t
'+'\t
'+'\t
'+'\t
'+'\t '+"\t "+"\t
"+'\t
'+'\t '+"\t "+"\t
"+'\t
'+'\t '+"\t "+"\t
"+"\t
"+"\t
"+'\t
'+"\t
"+"\t"+'\t
'+'\t
'+'\t
'+'\t
'+'\t
'+'\t '+"\t
"+'\t '+"\t -1{{calculator.sign}} * "+"\t "+"\t
"+'\t
'+'\t '+"\t
"+'\t '+"\t 2{{calculator.exponentDec}}-127 * "+"\t "+'\t '+"\t 2{{calculator.exponentDec}}-1023 * "+"\t "+"\t
"+'\t
'+'\t '+"\t
"+'\t '+"\t {{calculator.mantissaDec}} = "+"\t "+"\t
"+"\t
"+"\t
"+'\t
'+'\t '+"\t "+"\t
"+"\t
"+"\t"+'\t
'+'\t Convert'+"\t
"+"\t"};Vue.component("calculator",uielto_calculator);function getDebounceTime(){if(screen.width>768){return 500}else{return 1e3}}var uielto_execution={props:{instructions:{type:Array,required:true},enter:{type:String,required:true}},data:function(){return{archInstructions:["Break","Address","Label","userInstructions","loadedInstructions","tag"]}},methods:{filter(row,filter){if(row.hide==true){return false}else{return true}},breakPoint(record,index){for(var i=0;i'+'
'+" "+' '+" "+" \x3c!-- Change the title of each column --\x3e"+' "+" "+' "+" "+' "+" "+" \x3c!-- For each instruction --\x3e"+' "+" "+' "+" "+' "+" "+' "+" "+' "+" "+' "+" "+' "+" "+"
"+" "};Vue.component("table-execution",uielto_execution);var uielto_data_view_selector={props:{name_reg:{type:String,required:true},reg_type:{type:String,required:true}},data:function(){return{}},methods:{change_data_view(e,type){app._data.data_mode=e;if(e=="registers"){if(type=="int"){app._data.register_type="integer";app._data.name_tab_Reg="Decimal";app._data.name_reg="INT Registers";app._data.reg_type="int"}else if(type=="fp"){app._data.register_type="floating point";app._data.name_tab_Reg="Real";app._data.name_reg="FP Registers";app._data.reg_type="fp"}}if(e=="memory"){app._data.data_mode=e}creator_ga("send","event","data","data.view","data.view."+app._data.data_mode)}},template:'
'+'
'+'
'+" "+" CPU-INT Registers"+" CPU-FP Registers"+" "+"
"+'
'+' "+' '+" Memory "+" "+"
"+'
'+' "+' '+" Stats"+" "+"
"+"
"+"
"};Vue.component("data-view-selector",uielto_data_view_selector);var uielto_memory_data={props:{memory:{type:Array,required:true}},data:function(){return{memFields:["Tag","Address","Binary","Value"]}},methods:{select_space_type(record,index){if(record.type=="space"&&memory[memory_hash[0]][index].Binary[0].Tag!=null||memory[memory_hash[0]][index].Binary[1].Tag!=null||memory[memory_hash[0]][index].Binary[2].Tag!=null||memory[memory_hash[0]][index].Binary[3].Tag!=null){app._data.row_index=index;app.$refs["space_modal"].show()}}},template:'\t
'+"\t '+"\t"+"\t"+'\t "+"\t"+'\t "+"\t"+'\t "+"\t"+'\t "+'\t "+"\t "+"\t
"};Vue.component("table-mem-data",uielto_memory_data);var uielto_memory_text={props:{memory:{type:Array,required:true}},data:function(){return{memFields:["Tag","Address","Binary","Value"]}},methods:{filter(row,filter){if(row.hide==true){return false}else{return true}}},template:'\t
'+"\t '+"\t"+'\t "+"\t"+'\t "+"\t"+"\t"+'\t "+"\t"+'\t "+'\t "+"\t "+"\t
"};Vue.component("table-mem-text",uielto_memory_text);var uielto_memory_stack={props:{memory:{type:Array,required:true}},data:function(){return{memFields:["Tag","Address","Binary","Value"]}},methods:{filter(row,filter){return Math.abs(row.Address-app._data.end_callee)<40},select_stack_type(record,index){app._data.row_index=index;app.$refs["stack_modal"].show()}},template:'\t
'+"\t '+"\t"+'\t "+"\t"+'\t "+"\t"+'\t "+"\t"+'\t "+'\t "+"\t "+"\t
"};Vue.component("table-mem-stack",uielto_memory_stack);var uielto_stats={props:{data_mode:{type:String,required:true},stats:{type:Array,required:true},stats_value:{type:Number,required:true}},template:'\t
'+'\t
'+"\t"+'\t '+'\t '+'\t '+"\t "+"\t"+'\t '+'\t '+"\t "+"\t "+"\t
"+"\t
"};Vue.component("stats",uielto_stats);var uielto_stats_plot={components:{apexchart:VueApexCharts},props:{stats_value:{type:Number,required:true}},data:function(){return{chartOptions:{colors:["red","blue","yellow","purple","green","orange","gray","pink","teal","black","lime","indigo","cyan"],chart:{id:"graphic",type:"donut"},labels:["Arithmetic integer","Arithmetic floating point","Logic","Transfer between registers","Memory access","Comparison","I/O","Syscall","Control","Function call","Conditional bifurcation","Unconditional bifurcation","Other"],dataLabels:{enabled:true},donut:{labels:{show:true,total:{show:true,showAlways:true,label:"Total"}}},fill:{type:"gradient",gradient:{shade:"dark",type:"horizontal",shadeIntensity:.5,gradientToColors:undefined,inverseColors:true,opacityFrom:1,opacityTo:1,stops:[0,50,100],colorStops:[]},colors:["red","blue","yellow","purple","green","orange","gray","pink","teal","black","lime","indigo","cyan"]},legend:{formatter:function(val,opts){return val+" - "+opts.w.globals.series[opts.seriesIndex]}},plotOptions:{pie:{donut:{labels:{show:true,total:{show:true,showAlways:true,color:"black",formatter:function(w){return w.globals.seriesTotals.reduce((a,b)=>a+b,0)}}}}}}}}},template:'
'+'\t\t'+"\t "+"\t
"};Vue.component("plot-stats",uielto_stats_plot);var uielto_stats_table={props:{stats:{type:Array,required:true}},data:function(){return{statsFields:{type:{label:"Type",sortable:true},number_instructions:{label:"Number of instructions",sortable:true},percentage:{label:"Percentage",sortable:true}}}},template:"\t'+"\t"};Vue.component("table-stats",uielto_stats_table);var uielto_monitor={props:{display:{type:String,required:true}},template:'\t
'+'\t
'+'\t
'+'\t '+"\t
"+'\t
'+'\t '+"\t "+"\t
"+"\t
"+"\t
"};Vue.component("monitor",uielto_monitor);var uielto_keyboard={props:{keyboard:{type:String,required:true},enter:{type:String,required:true}},methods:{consoleClear(){app._data.keyboard="";app._data.display=""},consoleEnter(){if(keyboard!=""){consoleMutex=true}},debounce:_.debounce((function(param,e){console_log(param);console_log(e);e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");var re=new RegExp("'","g");e=e.replace(re,'"');re=new RegExp("[\f]","g");e=e.replace(re,"\\f");re=new RegExp("[\n]","g");e=e.replace(re,"\\n");re=new RegExp("[\r]","g");e=e.replace(re,"\\r");re=new RegExp("[\t]","g");e=e.replace(re,"\\t");re=new RegExp("[\v]","g");e=e.replace(re,"\\v");if(e==""){this[param]=null;return}console_log("this."+param+"= '"+e+"'");eval("this."+param+"= '"+e+"'");app.$forceUpdate()}),getDebounceTime())},template:'\t
'+'\t
'+'\t
'+'\t '+"\t
"+'\t
'+'\t '+"\t "+"\t
"+"\t
"+"\t"+'\t
'+'\t
'+"\t "+"\t
"+'\t
'+'\t '+'\t '+"\t Clear"+"\t "+"\t
"+'\t
'+'\t '+'\t '+"\t Enter"+"\t "+"\t
"+"\t"+"\t
"+"\t
"};Vue.component("keyboard",uielto_keyboard);function getDebounceTime(){if(screen.width>768){return 500}else{return 1e3}}function show_notification(msg,type){app._data.alertMessage=msg;app._data.type=type;app.$bvToast.toast(app._data.alertMessage,{variant:app._data.type,solid:true,toaster:"b-toaster-top-center",autoHideDelay:app._data.notificationTime});var date=new Date;notifications.push({mess:app._data.alertMessage,color:app._data.type,time:date.getHours()+":"+date.getMinutes()+":"+date.getSeconds(),date:date.getDate()+"/"+(date.getMonth()+1)+"/"+date.getFullYear()});return true}function show_loading(){if(toHandler!=null){return}toHandler=setTimeout((function(){$("#loading").show();toHandler=null}),500)}function hide_loading(){if(toHandler!=null){clearTimeout(toHandler);toHandler=null}$("#loading").hide()}var toHandler=null;try{window.app=new Vue({el:"#app",data:{version:"",creator_mode:"load_architecture",notificationTime:1500,autoscroll:true,fontSize:15,c_debug:false,dark:false,arch_available:architecture_available,back_card:back_card,date_copy:"",showLoadArch:false,name_arch:"",description_arch:"",load_arch:"",modalDeletArch:{title:"",index:0},architecture_name:"",number_bits:32,architecture:architecture,architecture_hash:architecture_hash,name_arch_save:"",advanced_mode:true,memory_layout:["","","","","",""],modalResetMem:{title:"",element:""},align:false,archFields:["name","ID","nbits","default_value","properties","actions"],componentsTypes:componentsTypes,simple_reg:[],modalResetArch:{title:"",element:""},showNewComponent:false,showEditComponent:false,modalEditComponent:{title:"",element:""},modalDeletComp:{title:"",element:""},showNewElement:false,showEditElement:false,modalNewElement:{title:"",element:"",type:"",double_precision:"",simple1:"",simple2:""},modalEditElement:{title:"",element:"",type:"",double_precision:"",simple1:"",simple2:""},modalDeletElement:{title:"",element:""},formArchitecture:{name:"",id:"",type:"",defValue:"",properties:[],precision:""},instFields:["name","co","cop","nwords","properties","signatureRaw","fields","definition","actions"],instructionsTypes:instructionsTypes,modalViewFields:{title:"",element:"",co:"",cop:""},modalResetInst:{title:"",element:""},showNewInstruction:false,showEditInstruction:false,instructionFormPage:1,instructionFormPageLink:["#Principal","#Fields","#Syntax","#Definition","#Help"],modalEditInst:{title:"",element:"",co:"",cop:""},modalDeletInst:{title:"",element:"",index:0},formInstruction:{name:"",type:"",co:"",cop:"",nwords:1,help:"",properties:[],numfields:"1",numfieldsAux:"1",nameField:[],typeField:[],separated:[],startBitField:[],stopBitField:[],valueField:[],assignedCop:false,signature:"",signatureRaw:"",signature_definition:"",definition:""},pseudoinstFields:["name","nwords","signatureRaw","fields","definition","actions"],modalResetPseudoinst:{title:"",element:""},showNewPseudoinstruction:false,showEditPseudoinstruction:false,modalEditPseudoinst:{title:"",element:"",index:0},modalDeletPseudoinst:{title:"",element:"",index:0},formPseudoinstruction:{name:"",nwords:1,numfields:"0",numfieldsAux:"0",nameField:[],typeField:[],startBitField:[],stopBitField:[],signature:"",signatureRaw:"",signature_definition:"",definition:"",help:""},directivesFields:["name","action","size","actions"],actionTypes:actionTypes,modalResetDir:{title:"",element:""},showNewDirective:false,showEditDirective:false,modalEditDirective:{title:"",element:""},modalDeletDir:{title:"",element:""},formDirective:{name:"",action:"",size:0},fragmentData:["inm-signed","inm-unsigned","address","offset_bytes","offset_words"],example_available:example_available,example_loaded:null,load_assembly:"",save_assembly:"",modalAssemblyError:{code1:"",code2:"",code3:"",error:""},name_binary_load:"",load_binary:false,update_binary:update_binary,name_binary_save:"",assembly_code:"",alertMessage:"",type:"",notifications:notifications,browser:"",instructionsPacked:20,runExecution:false,resetBut:false,instructions:instructions,register_type:"integer",name_tab_Reg:"Decimal",name_reg:"INT Registers",reg_type:"int",register_popover:"",data_mode:"registers",newValue:"",current_subrutine:"main",row_index:null,selected_space_view:null,selected_stack_view:null,memory_hash:["data_memory","instructions_memory","stack_memory"],memory:memory,stack_pointer:0,begin_caller:0,end_caller:0,begin_callee:0,end_callee:0,totalStats:totalStats,stats:stats,stats_value:stats_value,display:"",keyboard:"",enter:null},created(){this.load_num_version();this.load_arch_available();this.detectBrowser()},mounted(){this.backupCopyModal();this.verifyBrowser();this.get_configuration();var url_hash=creator_preload_get2hash(window.location);creator_preload_fromHash(this,url_hash)},beforeUpdate(){this.get_dark_mode()},methods:{load_num_version(){$.getJSON("package.json",(function(cfg){creator_information=cfg;app._data.version=cfg.version}))},verifyBrowser(){if(navigator.userAgent.indexOf("OPR")>-1){this.$refs.browser.show()}else if(navigator.userAgent.indexOf("MIE")>-1){this.$refs.browser.show()}else if(navigator.userAgent.indexOf("Edge")>-1){this.$refs.browser.show()}else if(navigator.userAgent.indexOf("Chrome")>-1){return}else if(navigator.userAgent.indexOf("Safari")>-1){return}else if(navigator.userAgent.indexOf("Firefox")>-1){return}else{this.$refs.browser.show()}},get_configuration(){if(localStorage.getItem("instructionsPacked")!=null){this.instructionsPacked=parseInt(localStorage.getItem("instructionsPacked"))}if(localStorage.getItem("autoscroll")!=null){this.autoscroll=localStorage.getItem("autoscroll")==="true"}if(localStorage.getItem("notificationTime")!=null){this.notificationTime=parseInt(localStorage.getItem("notificationTime"))}},get_dark_mode(){if(localStorage.getItem("dark_mode")!=null){document.getElementsByTagName("body")[0].style=localStorage.getItem("dark_mode");if(localStorage.getItem("dark_mode")==""){app._data.dark=false}else{app._data.dark=true}}else{var default_style=window.matchMedia("(prefers-color-scheme: dark)").matches;if(default_style==true){document.getElementsByTagName("body")[0].style="filter: invert(88%) hue-rotate(160deg) !important; background-color: #111 !important;";app._data.dark=true}else{document.getElementsByTagName("body")[0].style="";app._data.dark=false}}},change_UI_mode(e){if(app._data.creator_mode!=e){if(app._data.creator_mode=="architecture"){app._data.advanced_mode=true}if(textarea_assembly_editor!=null&&e!="assembly"){app._data.assembly_code=textarea_assembly_editor.getValue();code_assembly=textarea_assembly_editor.getValue();codemirrorHistory=textarea_assembly_editor.getHistory();textarea_assembly_editor.toTextArea()}app._data.register_popover="";if(e=="architecture"){$(".loading").show();setTimeout((function(){app._data.creator_mode=e;app.$forceUpdate();$(".loading").hide()}),50);return}app._data.creator_mode=e;if(e=="assembly"){setTimeout((function(){codemirrorStart();if(codemirrorHistory!=null){textarea_assembly_editor.setHistory(codemirrorHistory);textarea_assembly_editor.undo()}textarea_assembly_editor.setValue(code_assembly);if(app._data.update_binary!=""){$("#divAssembly").attr("class","col-lg-10 col-sm-12");$("#divTags").attr("class","col-lg-2 col-sm-12");$("#divTags").show()}}),50)}app.$forceUpdate()}},changeToSeparateValue(val,pos){if(val){this.formInstruction.startBitField[pos]=[0];this.formInstruction.stopBitField[pos]=[0];if(this.formInstruction.typeField[pos]=="co")this.formInstruction.co=["0"]}else{this.formInstruction.startBitField[pos]=0;this.formInstruction.stopBitField[pos]=0;if(this.formInstruction.typeField[pos]=="co")this.formInstruction.co="0"}},addMoreFieldsToSeparateValues(event,pos){this.formInstruction.startBitField[pos].push(0);this.formInstruction.stopBitField[pos].push(0);if(this.formInstruction.typeField[pos]=="co")this.formInstruction.co.push("0");app.$forceUpdate()},lessFieldsToSeparateValues(event,pos){this.formInstruction.startBitField[pos].pop();this.formInstruction.stopBitField[pos].pop();if(this.formInstruction.typeField[pos]=="co")this.formInstruction.co.pop();app.$forceUpdate()},load_arch_available(){$.getJSON("architecture/available_arch.json",(function(cfg){architecture_available=cfg;if(typeof Storage!=="undefined"){if(localStorage.getItem("load_architectures_available")!=null){var auxArch=localStorage.getItem("load_architectures_available");var aux=JSON.parse(auxArch);for(var i=0;i{c.elements.forEach((e,j)=>{if(e.default_value)e.value=e.default_value;else e.value="0"})});var textToWrite=JSON.stringify(auxArchitecture,null,2);var textFileAsBlob=new Blob([textToWrite],{type:"text/json"});var fileNameToSaveAs;if(this.name_arch_save==""){fileNameToSaveAs="architecture.json"}else{fileNameToSaveAs=this.name_arch_save+".json"}var downloadLink=document.createElement("a");downloadLink.download=fileNameToSaveAs;downloadLink.innerHTML="My Hidden Link";window.URL=window.URL||window.webkitURL;downloadLink.href=window.URL.createObjectURL(textFileAsBlob);downloadLink.onclick=destroyClickedElement;downloadLink.style.display="none";document.body.appendChild(downloadLink);downloadLink.click();show_notification("Save architecture","success")},change_mode(){if(app._data.advanced_mode==false){app._data.advanced_mode=true}else{app._data.advanced_mode=false}},resetMemModal(elem,button){this.modalResetMem.title="Reset memory layout";this.modalResetMem.element=elem;this.$root.$emit("bv::show::modal","modalResetMem",button)},resetMemory(arch){show_loading();for(var i=0;iauxMemoryLayout[j].value){show_notification("The segment can not be overlap","danger");return}}}for(var i=0;i<6;i++){architecture.memory_layout[i].value=auxMemoryLayout[i].value}app._data.architecture=architecture;backup_stack_address=architecture.memory_layout[4].value;backup_data_address=architecture.memory_layout[3].value;for(var i=0;i<6;i++){app._data.memory_layout[i]=""}app.$forceUpdate()},element_id(name,type,double){var id=0;for(var i=0;ithis.formInstruction.nwords*32){this.formInstruction.numfieldsAux=this.formInstruction.nwords*32;this.formInstruction.numfields=this.formInstruction.nwords*32}else if(this.formInstruction.numfields<1){this.formInstruction.numfieldsAux=1;this.formInstruction.numfields=1}else{this.formInstruction.numfieldsAux=this.formInstruction.numfields}}if(type==1){if(this.formPseudoinstruction.numfields>this.formPseudoinstruction.nwords*32){this.formPseudoinstruction.numfieldsAux=this.formPseudoinstruction.nwords*32;this.formPseudoinstruction.numfields=this.formPseudoinstruction.nwords*32}else if(this.formPseudoinstruction.numfields<0){this.formPseudoinstruction.numfieldsAux=0;this.formPseudoinstruction.numfields=0}else{this.formPseudoinstruction.numfieldsAux=this.formPseudoinstruction.numfields}}},viewFielsInst(elem,co,cop,button){this.modalViewFields.title="Fields of "+elem;this.modalViewFields.element=elem;for(var i=0;iisNaN(val)))show_notification("The field co must be numbers","danger");else if(isNaN(this.formInstruction.cop)){show_notification("The field cop must be numbers","danger")}else if(typeof this.formInstruction.co!="object"&&this.formInstruction.co.length!=this.formInstruction.startBitField[0]-this.formInstruction.stopBitField[0]+1){show_notification("The length of co should be "+(this.formInstruction.startBitField[0]-this.formInstruction.stopBitField[0]+1)+" binary numbers","danger")}else if(typeof this.formInstruction.co==="object"&&this.formInstruction.co.some((val,ind)=>val.length!==app.formInstruction.startBitField[0][ind]-app.formInstruction.stopBitField[0][ind]+1))show_notification("The length of co don't match with the desription","danger");else{this.newInstruction()}},newInstruction(){for(var i=0;ithis.formInstruction.co instanceof Array?this.formInstrucion.co.join(""):this.formInstruction.co)()+this.formInstruction.cop;for(var i=0;ithis.formInstruction.separated[i]||false);architecture.instructions.push(newInstruction);for(var i=0;iparseInt(val)),stopbit:!this.formInstruction.separated[i]?parseInt(this.formInstruction.stopBitField[i]):this.formInstruction.stopBitField[i].map(val=>parseInt(val)),valueField:this.formInstruction.valueField[i]};architecture.instructions[architecture.instructions.length-1].fields.push(newField)}},editInstModal(elem,co,cop,button){this.modalEditInst.title="Edit Instruction";this.modalEditInst.element=elem;for(var i=0;iisNaN(val)))show_notification("The field co must be numbers","danger");else if(isNaN(this.formInstruction.cop)){show_notification("The field cop must be numbers","danger")}else if(typeof this.formInstruction.co!="object"&&this.formInstruction.co.length!=this.formInstruction.startBitField[0]-this.formInstruction.stopBitField[0]+1){show_notification("The length of co should be "+(this.formInstruction.startBitField[0]-this.formInstruction.stopBitField[0]+1)+" binary numbers","danger")}else if(typeof this.formInstruction.co==="object"&&this.formInstruction.co.some((val,ind)=>val.length!==app.formInstruction.startBitField[0][ind]-app.formInstruction.stopBitField[0][ind]+1))show_notification("The length of co don't match with the desription","danger");else{this.editInstruction(inst,co,cop)}},editInstruction(comp,co,cop){var exCop=false;for(var z=1;zthis.formInstruction.co instanceof Array?this.formInstrucion.co.join(""):this.formInstruction.co)()+this.formInstruction.cop;for(var i=0;iparseInt(val));architecture.instructions[i].fields[j].stopbit=!this.formInstruction.separated[j]?parseInt(this.formInstruction.stopBitField[j]):this.formInstruction.stopBitField[j].map(val=>parseInt(val));architecture.instructions[i].fields[j].valueField=this.formInstruction.valueField[j];architecture.instructions[i].separated[j]=this.formInstruction.separated[j]}else{var newField={name:this.formInstruction.nameField[j],type:this.formInstruction.typeField[j],startbit:this.formInstruction.startBitField[j],stopbit:this.formInstruction.stopBitField[j],valueField:this.formInstruction.valueField[j]};architecture.instructions[i].fields.push(newField)}}this.generateSignatureInst();var signature=this.formInstruction.signature;var signatureRaw=this.formInstruction.signatureRaw;if(exCop==false){architecture.instructions[i].cop=""}architecture.instructions[i].signature=signature;architecture.instructions[i].signatureRaw=signatureRaw;if(architecture.instructions[i].fields.length>this.formInstruction.numfields){architecture.instructions[i].fields.splice(this.formInstruction.numfields,architecture.instructions[i].fields.length-this.formInstruction.numfields)}break}}show_notification("The instruction has been modified, please check the definition of the pseudoinstructions","info")},delInstModal(elem,index,button){this.modalDeletInst.title="Delete Instruction";this.modalDeletInst.element=elem;this.modalDeletInst.index=index;this.$root.$emit("bv::show::modal","modalDeletInst",button)},delInstruction(index){architecture.instructions.splice(index,1)},generateSignatureInst(){var signature=this.formInstruction.signature_definition;var re=new RegExp("^ +");this.formInstruction.signature_definition=this.formInstruction.signature_definition.replace(re,"");re=new RegExp(" +","g");this.formInstruction.signature_definition=this.formInstruction.signature_definition.replace(re," ");re=new RegExp("^ +");signature=signature.replace(re,"");re=new RegExp(" +","g");signature=signature.replace(re," ");for(var z=0;zthis.formPseudoinstruction.numfields){architecture.pseudoinstructions[index].fields.splice(this.formPseudoinstruction.numfields,architecture.pseudoinstructions[i].fields.length-this.formPseudoinstruction.numfields)}},delPseudoinstModal(elem,index,button){this.modalDeletPseudoinst.title="Delete Pseudointruction";this.modalDeletPseudoinst.element=elem;this.modalDeletPseudoinst.index=index;this.$root.$emit("bv::show::modal","modalDeletPseudoinst",button)},delPseudoinstruction(index){architecture.pseudoinstructions.splice(index,1)},pseudoDefValidator(name,definition,fields){var re=new RegExp("^\n+");definition=definition.replace(re,"");re=new RegExp("\n+","g");definition=definition.replace(re,"");var newDefinition=definition;re=/{([^}]*)}/g;var code=re.exec(definition);if(code!=null){while(code!=null){console_log(code);var instructions=code[1].split(";");if(instructions.length==1){show_notification('Enter a ";" at the end of each line of code',"danger");return-1}for(var j=0;jfieldsLength){show_notification("Immediate number "+instructionParts[z]+" is too big","danger");return-1}}else if(instructionParts[z].match(/^(\d)+\.(\d)+/)){if(isNaN(parseFloat(instructionParts[z]))==true){show_notification("Immediate number "+instructionParts[z]+" is not valid","danger");return-1}if(this.float2bin(parseFloat(instructionParts[z])).length>fieldsLength){show_notification("Immediate number "+instructionParts[z]+" is too big","danger");return-1}}else if(isNaN(parseInt(instructionParts[z]))){}else{var numAux=parseInt(instructionParts[z],10);if(isNaN(parseInt(instructionParts[z]))==true){show_notification("Immediate number "+instructionParts[z]+" is not valid","danger");return-1}var comNumPos=Math.pow(2,fieldsLength-1);var comNumNeg=comNumPos*-1;comNumPos=comNumPos-1;console_log(comNumPos);console_log(comNumNeg);if(parseInt(instructionParts[z],10)>comNumPos||parseInt(instructionParts[z],10)fieldsLength){show_notification("Address "+instructionParts[z]+" is too big","danger");return-1}}}if(!found){show_notification("Register "+instructionParts[z]+" not found","danger");return-1}}}}if(!found){show_notification("Instruction "+instructions[j]+" do not exists","danger");return-1}}definition=definition.replace(code[0],"");re=/{([^}]*)}/g;code=re.exec(definition)}}else{var instructions=definition.split(";");console_log(instructions.length);if(instructions.length==1){show_notification('Enter a ";" at the end of each line of code',"danger");return-1}for(var j=0;jfieldsLength){show_notification("Immediate number "+instructionParts[z]+" is too big","danger");return-1}}else if(instructionParts[z].match(/^(\d)+\.(\d)+/)){if(isNaN(parseFloat(instructionParts[z]))==true){show_notification("Immediate number "+instructionParts[z]+" is not valid","danger");return-1}if(this.float2bin(parseFloat(instructionParts[z])).length>fieldsLength){show_notification("Immediate number "+instructionParts[z]+" is too big","danger");return-1}}else if(isNaN(parseInt(instructionParts[z]))){}else{var numAux=parseInt(instructionParts[z],10);if(isNaN(parseInt(instructionParts[z]))==true){show_notification("Immediate number "+instructionParts[z]+" is not valid","danger");return-1}var comNumPos=Math.pow(2,fieldsLength-1);var comNumNeg=comNumPos*-1;comNumPos=comNumPos-1;console_log(comNumPos);console_log(comNumNeg);if(parseInt(instructionParts[z],10)>comNumPos||parseInt(instructionParts[z],10)fieldsLength){show_notification("Address "+instructionParts[z]+" is too big","danger");return-1}}}if(!found){show_notification("Register "+instructionParts[z]+" not found","danger");return-1}}}}if(!found){show_notification("Instruction "+instructions[j]+" do not exists","danger");return-1}}}return 0},generateSignaturePseudo(){var signature=this.formPseudoinstruction.signature_definition;var re=new RegExp("^ +");this.formPseudoinstruction.signature_definition=this.formPseudoinstruction.signature_definition.replace(re,"");re=new RegExp(" +","g");this.formPseudoinstruction.signature_definition=this.formPseudoinstruction.signature_definition.replace(re," ");re=new RegExp("^ +");signature=signature.replace(re,"");re=new RegExp(" +","g");signature=signature.replace(re," ");for(var z=0;z{setTimeout((function(){if(typeof code!=="undefined"){code_assembly=code}else{code_assembly=textarea_assembly_editor.getValue()}var ret=assembly_compiler();app._data.totalStats=0;app._data.instructions=instructions;app._data.memory[memory_hash[1]]=memory[memory_hash[1]];app._data.memory[memory_hash[0]]=memory[memory_hash[0]];app._data.memory[memory_hash[2]]=memory[memory_hash[2]];tokenIndex=0;app.reset(true);if(typeof Storage!=="undefined"){var auxObject=jQuery.extend(true,{},architecture);var auxArchitecture=register_value_serialize(auxObject);var auxArch=JSON.stringify(auxArchitecture,null,2);var date=new Date;var auxDate=date.getHours()+":"+date.getMinutes()+":"+date.getSeconds()+" - "+date.getDate()+"/"+(date.getMonth()+1)+"/"+date.getFullYear();console_log(app._data.architecture_name);localStorage.setItem("arch_name",app._data.architecture_name);localStorage.setItem("architecture_copy",auxArch);localStorage.setItem("assembly_copy",code_assembly);localStorage.setItem("date_copy",auxDate)}hide_loading();switch(ret.type){case"error":app.compileError(ret.msg,ret.token,ret.line);break;case"warning":show_notification(ret.token,ret.bgcolor);break;default:show_notification("Compilation completed successfully","success");break}resolve("0")}),25)})},newAssembly(){textarea_assembly_editor.setValue("")},read_assembly(e){show_loading();var file;var reader;var files=document.getElementById("assembly_file").files;for(var i=0;i