2011-07-13 00:19:05 +02:00
|
|
|
var mapping;
|
|
|
|
var timeout;
|
2011-07-08 23:25:58 +02:00
|
|
|
|
2011-07-09 22:19:17 +02:00
|
|
|
$(document).ready(function(){
|
2011-07-12 20:06:38 +02:00
|
|
|
// load default code
|
|
|
|
loadCode($('#examples option:selected').val());
|
|
|
|
|
|
|
|
// bind events
|
|
|
|
$('.popup h3').click(function() {
|
2011-07-08 23:25:58 +02:00
|
|
|
$(this).next().toggle('slow');
|
|
|
|
});
|
|
|
|
|
2011-07-09 22:19:17 +02:00
|
|
|
$('form').change(function() {
|
|
|
|
compile();
|
2011-07-08 23:25:58 +02:00
|
|
|
});
|
|
|
|
|
2011-07-09 22:19:17 +02:00
|
|
|
$('#examples select').change(function() {
|
|
|
|
loadCode($(this).val());
|
2011-07-08 23:25:58 +02:00
|
|
|
});
|
|
|
|
|
2011-07-09 22:19:17 +02:00
|
|
|
$('.editor textarea')
|
|
|
|
.scroll(function() {
|
|
|
|
$(this).prev().scrollTop($(this).scrollTop());
|
|
|
|
})
|
|
|
|
.keypress(function() {
|
|
|
|
updateEditor($(this));
|
|
|
|
})
|
|
|
|
.keyup(function () {
|
|
|
|
if (timeout) {
|
|
|
|
window.clearTimeout(timeout);
|
|
|
|
}
|
2011-07-08 23:25:58 +02:00
|
|
|
|
2011-07-09 22:19:17 +02:00
|
|
|
timeout = window.setTimeout(compile, 500);
|
|
|
|
})
|
|
|
|
.keydown(function(e) {
|
|
|
|
if (e.keyCode == 9) {
|
|
|
|
insertAtCaret(this, "\t")
|
|
|
|
return false; // prevent default action
|
|
|
|
}
|
2011-07-08 23:25:58 +02:00
|
|
|
});
|
2011-07-09 22:19:17 +02:00
|
|
|
|
2011-07-13 00:19:05 +02:00
|
|
|
$('#ansic textarea')
|
|
|
|
.mousemove(function(e) {
|
|
|
|
var hover = getHoverLine($(this), e);
|
|
|
|
if (hover) {
|
|
|
|
var line = hover.index()+1;
|
2011-07-12 20:06:38 +02:00
|
|
|
|
2011-07-13 00:19:05 +02:00
|
|
|
if (mapping.ansic[line]) {
|
|
|
|
var start = mapping.ansic[line][0];
|
|
|
|
var end = mapping.ansic[line][1];
|
2011-07-10 18:23:34 +02:00
|
|
|
|
2011-07-13 00:19:05 +02:00
|
|
|
selectLines($(this), false, line);
|
|
|
|
selectLines($('#assembler textarea'), true, start, end);
|
|
|
|
selectLines($('#byte textarea'), true, mapping.assembler[start], mapping.assembler[end]);
|
|
|
|
}
|
2011-07-10 18:23:34 +02:00
|
|
|
}
|
2011-07-13 00:19:05 +02:00
|
|
|
});
|
2011-07-10 18:23:34 +02:00
|
|
|
|
|
|
|
$('#assembler textarea').mousemove(function(e) {
|
2011-07-12 20:06:38 +02:00
|
|
|
var hover = getHoverLine($(this), e);
|
|
|
|
if (hover) {
|
|
|
|
var line = hover.index()+1;
|
|
|
|
|
|
|
|
if (mapping.assembler[line]) {
|
|
|
|
var mappedLine = mapping.assembler[line];
|
2011-07-10 18:23:34 +02:00
|
|
|
selectLines($(this), false, line);
|
|
|
|
selectLines($('#byte textarea'), true, mappedLine);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2011-07-08 23:25:58 +02:00
|
|
|
|
2011-07-12 20:06:38 +02:00
|
|
|
$('#byte textarea').mousemove(function(e) {
|
|
|
|
var hover = getHoverLine($(this), e);
|
|
|
|
if (hover) {
|
|
|
|
var line = hover.index()+1;
|
|
|
|
|
|
|
|
if (mapping.byte[line]) {
|
|
|
|
var mappedLine = mapping.byte[line];
|
|
|
|
selectLines($(this), false, line);
|
|
|
|
selectLines($('#assembler textarea'), true, mappedLine);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2011-07-09 22:19:17 +02:00
|
|
|
});
|
2011-07-09 15:00:50 +02:00
|
|
|
|
|
|
|
function compile() {
|
2011-07-09 22:19:17 +02:00
|
|
|
var code = $('#ansic textarea').val();
|
|
|
|
|
|
|
|
$.post('compile.php?' + $('form').serialize(), code, function(json) {
|
2011-07-13 00:19:05 +02:00
|
|
|
mapping = json.mapping;
|
|
|
|
timeout = null; // free timeout
|
|
|
|
|
2011-07-09 22:19:17 +02:00
|
|
|
updateEditor($('#assembler .editor textarea'), json.code.assembler);
|
|
|
|
updateEditor($('#byte .editor textarea'), json.code.byte);
|
2011-07-12 20:06:38 +02:00
|
|
|
renderStats(json.stats);
|
2011-07-13 00:19:05 +02:00
|
|
|
|
2011-07-09 22:19:17 +02:00
|
|
|
if (json.messages) {
|
2011-07-08 23:25:58 +02:00
|
|
|
$('#messages pre').text(json.messages);
|
|
|
|
$('#messages').show('slow');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$('#messages').hide('slow');
|
|
|
|
}
|
|
|
|
}, 'json');
|
|
|
|
}
|
|
|
|
|
|
|
|
function range(start, end) {
|
|
|
|
var arr = new Array;
|
|
|
|
for (var i = start; i <= end; i++) {
|
|
|
|
arr.push(i);
|
|
|
|
}
|
|
|
|
return arr;
|
|
|
|
}
|
2011-07-09 22:19:17 +02:00
|
|
|
|
|
|
|
function insertAtCaret(element, text) {
|
|
|
|
if (document.selection) {
|
|
|
|
element.focus();
|
|
|
|
var sel = document.selection.createRange();
|
|
|
|
sel.text = text;
|
|
|
|
element.focus();
|
|
|
|
} else if (element.selectionStart || element.selectionStart === 0) {
|
|
|
|
var startPos = element.selectionStart;
|
|
|
|
var endPos = element.selectionEnd;
|
|
|
|
var scrollTop = element.scrollTop;
|
|
|
|
element.value = element.value.substring(0, startPos) + text + element.value.substring(endPos, element.value.length);
|
|
|
|
element.focus();
|
|
|
|
element.selectionStart = startPos + text.length;
|
|
|
|
element.selectionEnd = startPos + text.length;
|
|
|
|
element.scrollTop = scrollTop;
|
|
|
|
} else {
|
|
|
|
element.value += text;
|
|
|
|
element.focus();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-07-10 18:23:34 +02:00
|
|
|
function selectLines(editor, scroll, start, end) {
|
2011-07-09 22:19:17 +02:00
|
|
|
var pres = editor.prev().children();
|
|
|
|
pres.removeClass('activeline'); // deselect all
|
|
|
|
|
|
|
|
if (end == undefined) {
|
|
|
|
end = start;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (var i = start; i <= end; i++) {
|
|
|
|
pres.eq(i-1).addClass('activeline');
|
|
|
|
}
|
|
|
|
|
2011-07-10 18:23:34 +02:00
|
|
|
var offset = pres.get(start-1).offsetTop;
|
|
|
|
if (scroll) {
|
|
|
|
editor.scrollTop(offset-50); // scroll to top of selection
|
|
|
|
}
|
2011-07-09 22:19:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function updateEditor(editor, value) {
|
|
|
|
if (value) {
|
|
|
|
editor.val(value);
|
|
|
|
}
|
|
|
|
|
|
|
|
var overlay = editor.prev();
|
|
|
|
var lines = editor.val().split("\n").length;
|
|
|
|
|
|
|
|
overlay.empty();
|
2011-07-13 00:19:05 +02:00
|
|
|
for (var i = 0; i < lines+2; i++) {
|
2011-07-09 22:19:17 +02:00
|
|
|
overlay.append($('<pre>').text(i+1));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function loadCode(file) {
|
2011-07-12 20:06:38 +02:00
|
|
|
$.get('examples/' + file, function(data) {
|
2011-07-09 22:19:17 +02:00
|
|
|
updateEditor($('#ansic textarea'), data);
|
|
|
|
compile();
|
|
|
|
});
|
|
|
|
}
|
2011-07-12 20:06:38 +02:00
|
|
|
|
|
|
|
function getHoverLine(editor, e) {
|
|
|
|
var pres = editor.prev().children();
|
|
|
|
var hover = undefined;
|
|
|
|
|
|
|
|
pres.each(function(index, elm) {
|
|
|
|
if (e.layerY > elm.offsetTop && e.layerY < elm.offsetTop+15) {
|
|
|
|
hover = $(elm);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return hover;
|
|
|
|
}
|
|
|
|
|
|
|
|
function renderStats(stats) {
|
2011-07-13 00:19:05 +02:00
|
|
|
var cLines = $('#ansic textarea').val().split("\n").length;
|
|
|
|
var asInstr = $('#byte textarea').val().split("\n").length;
|
2011-07-12 20:06:38 +02:00
|
|
|
var max;
|
|
|
|
|
2011-07-13 00:19:05 +02:00
|
|
|
var par = $('<p>')
|
|
|
|
.html('Dein Code besteht aus ' + cLines + ' Zeilen Code, die in '
|
|
|
|
+ asInstr + ' Assembler Instruktionen übersetzt werden. Das sind '
|
|
|
|
+ Math.round(asInstr/cLines) + ' mal mehr Instruktionen als C-Zeilen!');
|
|
|
|
var table = $('<table>');
|
|
|
|
|
2011-07-12 20:06:38 +02:00
|
|
|
for (var mnemonic in stats) {
|
|
|
|
var count = stats[mnemonic];
|
|
|
|
if (!max) max = count;
|
|
|
|
|
|
|
|
table.append(
|
|
|
|
$('<tr>').append($('<td>').text(mnemonic))
|
|
|
|
.append(
|
|
|
|
$('<td>').append(
|
|
|
|
$('<div>').text(count).width(800*count/max).addClass('bar')
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2011-07-13 00:19:05 +02:00
|
|
|
$('#stats div').empty().append(par).append(table);
|
2011-07-12 20:06:38 +02:00
|
|
|
}
|