No me he podido resistir a constuir este pequeño ejemplo
![Smile :-)](./images/smilies/icon_smile.gif)
1. He compilado el siguiente PRG con Harbour:
test.prg
2. He copiado el array de pcode que se genera en test.c y la tabla de símbolos a javascript.
3. he construido una "mini" maquina virtual usando javascript que lo procese
![Smile :-)](./images/smilies/icon_smile.gif)
test.html
Code: Select all | Expand
<head>
</head>
<body>
<style>
.scrollable
{
overflow:auto;
}
</style>
<div class="scrollable" id="scrollable" height="480">
<canvas id="canvas" width="640" height="480" style="background-color:0"/>
</div>
<script type="text/javascript">
var context = document.getElementById( "canvas" ).getContext( "2d" );
var pcode = [ 36,3,0,176,1,0,106,12,72,101,108,108,111,32,
119,111,114,108,100,0,20,1,36,5,0,100,110,7 ];
var symbols = [ "MAIN", "QOUT" ];
// pcode tokens
var HB_P_ENDPROC = 7;
var HB_P_DOSHORT = 20;
var HB_P_LINE = 36;
var HB_P_PUSHNIL = 100;
var HB_P_PUSHSTRSHORT = 106;
var HB_P_RETVALUE = 110;
var HB_P_PUSHFUNCSYM = 176;
function hb_vmExecute( pcode, symbols )
{
var nPos = 0;
while( pcode[ nPos ] != HB_P_ENDPROC )
{
switch( pcode[ nPos ] )
{
case HB_P_LINE:
qout( "line: " + pcode[ ++nPos ] );
nPos += 2;
break;
case HB_P_DOSHORT:
qout( "Do short: " + pcode[ ++nPos ] + " parameter" );
nPos += 1;
break;
case HB_P_PUSHNIL:
qout( "Push nil" );
nPos++;
break;
case HB_P_PUSHSTRSHORT:
qout( "Push String short: " + pcode[ ++nPos ] + " bytes" );
for( n = 1; n < pcode[ nPos ]; n++ )
qout( String.fromCharCode( pcode[ nPos + n ] ) );
nPos += n;
break;
case HB_P_RETVALUE:
qout( "return the pushed value" );
nPos++;
break;
case HB_P_PUSHFUNCSYM:
qout( "Push Function symbol: " + symbols[ pcode[ ++nPos ] ] );
nPos += 2;
break;
default:
qout( pcode[ nPos ] );
nPos++;
break;
}
}
qout( "EndProc" );
}
function qout( cText )
{
if( context.row == null )
{
context.row = 30;
context.col = 10;
}
else
context.row += 20;
context.fillStyle = "green";
context.font = "bold 16px Arial";
context.fillText( cText, context.col, context.row );
}
hb_vmExecute( pcode, symbols );
</script>
</body>