Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Started to split the translation process in 2 separate passes. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
d3fe8703aaf6b5ca6d530cde730c09ff |
| User & Date: | jos 2015-08-20 22:46:56.766 |
Context
|
2015-08-22
| ||
| 16:17 | Attempted improvements on handling of db, dw, dl directives. check-in: 8769e987b7 user: jos tags: trunk | |
|
2015-08-20
| ||
| 22:46 | Started to split the translation process in 2 separate passes. check-in: d3fe8703aa user: jos tags: trunk | |
| 21:20 | Properly report the (impropable) case of an empty symbol table. check-in: 78c4228b9b user: jos tags: trunk | |
Changes
Changes to asm.lua.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/usr/bin/env lua
require ('./lib');
require ('./symtab');
local Directive = require("./asm_instr");
require( './opcodes' );
LineNr = 1;
function ProcessFile( inFileName )
local inFile = Check( io.open(inFileName,"r"),
"Can't open file " .. inFileName
);
for l in inFile:lines() do
Printf("%04d : ", LineNr );
ProcessLine( Chomp(l) );
LineNr = LineNr + 1;
end
| > > > > > > > > > > > > > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#!/usr/bin/env lua
require ('./lib');
require ('./symtab');
local Directive = require("./asm_instr");
require( './opcodes' );
LineNr = 1;
AssemblerPass = 1;
function ProcessFile( inFileName )
local inFile = Check( io.open(inFileName,"r"),
"Can't open file " .. inFileName
);
-- Pass 1
for l in inFile:lines() do
Pass1_line( Chomp(l) );
LineNr = LineNr + 1;
end
inFile:seek("set",0) -- rewind input file
-- [[ Pass 2
LineNr = 1;
AssemblerPass = 2;
PC_reset();
for l in inFile:lines() do
Printf("%04d : ", LineNr );
ProcessLine( Chomp(l) );
LineNr = LineNr + 1;
end
--]]
symtab_dump();
end
function Fields( line )
if( line == "" or line:match("^%s*[;//]") ) then return 0; end;
local retVal = 0;
local n, n1, label, instr, dst, src;
|
| ︙ | ︙ | |||
37 38 39 40 41 42 43 |
end
if( dst ) then n=n1; retVal = retVal + 1; end
src,n1 = line:match("[%s,]+([^%s;]+)()",n);
if( src ) then n=n1; retVal = retVal + 1; end
return retVal, label, instr, dst, src;
end
| | > > > > > > > > > > > | > > > > > > > > > > > > | 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
end
if( dst ) then n=n1; retVal = retVal + 1; end
src,n1 = line:match("[%s,]+([^%s;]+)()",n);
if( src ) then n=n1; retVal = retVal + 1; end
return retVal, label, instr, dst, src;
end
function Pass1_line( l ) -- Processing for pass 1, gathering of all symbols and labels.
local asm_instr;
local n,label,Mnemonic,op1,op2 = Fields(l);
local b1, b2, b3;
local insLen = 0;
-- Printf( "%s:%s - %s - %s - %s - %s\n",PC_get(),label,Mnemonic,op1,op2,l);
if( not Mnemonic ) then return; end;
Mnemonic = Mnemonic:upper();
asm_instr = Directive[ Mnemonic ];
if( asm_instr ) then asm_instr(label,Mnemonic,op1,l); return; end
asm_instr = CPU_instr[ Mnemonic ];
if( asm_instr ) then
if( label ) then symtab_addLabel(label) end;
insLen = asm_instr[1];
if( type(insLen)== 'function' ) then insLen = insLen(Mnemonic,op1,op2) end;
end
PC_add(insLen);
end
function ProcessLine( l ) -- Processing for pass 2
local asm_instr;
local n,label,Mnemonic,op1,op2 = Fields(l);
local b1, b2, b3;
local insLen = 0;
if( not Mnemonic ) then Printf("%s : %s\n", PC_get(), l ); return; end
Mnemonic = Mnemonic:upper();
asm_instr = Directive[ Mnemonic ];
if( asm_instr ) then asm_instr(label,Mnemonic,op1,l); return; end
|
| ︙ | ︙ |
Changes to asm_instr.lua.
1 2 3 4 5 |
require('./symtab');
local M = {
['DB'] = function( lbl,mnem,op1,srcLine )
Printf("%s\n", srcLine);
| | | | | > | | > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
require('./symtab');
local M = {
['DB'] = function( lbl,mnem,op1,srcLine )
Printf("%s\n", srcLine);
if( lbl ~= nil and AssemblerPass==1 ) then symtab_addLabel( lbl ); end;
PC_add(1); -- TODO, count and evaluate the number of fields and PC_add that result instead.
return 'DB';
end,
['DL'] = function( lbl,mnem,op1,srcLine )
Printf("%s\n", srcLine);
return 'DL';
end,
['DM'] = function( lbl,mnem,op1,srcLine )
Printf("%s\n", srcLine);
return 'DM';
end,
['DS'] = function( lbl,mnem,op1,srcLine )
if( op1 == nil ) then Error("DS must specify a number of bytes"); end;--if
if( lbl ~= nil and AssemblerPass==1 ) then symtab_addLabel( lbl ); end;
PC_add( tonumber(op1) ); -- TODO more advanced evaluation of op1.
return 'DS';
end,
['DW'] = function( lbl,mnem,op1,srcLine )
Printf("%s\n", srcLine);
if( lbl ~= nil and AssemblerPass==1 ) then symtab_addLabel( lbl ); end;
PC_add(2);
return 'DW';
end,
['EQU'] = function( lbl,mnem,op1,srcLine )
Printf("%s\n", srcLine);
if( op1 == "$" ) then op1 = PC_get(); end;
if( lbl ~= nil and AssemblerPass==1 ) then symtab_addLabel( lbl ); end;
return 'EQU';
end,
['ORG'] = function( lbl,mnem,op1,srcLine )
Printf("%s\n", srcLine);
PC_set( tonumber(op1) ); -- TODO more advanced evaluation of op1.
if( lbl ~= nil and AssemblerPass==1 ) then symtab_addLabel( lbl ); end;
return 'ORG';
end
};
-- End module
return M;
|
Changes to lib.lua.
1 2 3 4 5 6 7 8 9 10 |
--
-- File: lib.lua
-- usage: require('lib');
-- as early as possible, preferrably before all other requires,
--
function Printf( format, ... )
io.write( string.format(format, ... ) );
end
| | > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
--
-- File: lib.lua
-- usage: require('lib');
-- as early as possible, preferrably before all other requires,
--
function Printf( format, ... )
io.write( string.format(format, ... ) );
end
function Warn( text )
Printf("Line %04d : %s\n", LineNr, text );
end
function Error( text )
Warn( text );
os.exit(-1);
end
function htob_2( s )
local hi,lo = s:byte(1,2);
local hiA,loA;
|
| ︙ | ︙ |
Changes to symtab.lua.
1 2 3 4 5 | -- -- Usage: require 'thisfile' -- -- | | | < > > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
--
-- Usage: require 'thisfile'
--
--
local symCount = 0;
local symtab = {};
function symtab_add(symbol,value)
if( symtab[symbol] ) then
Warn( "Redefining symbol " .. symbol );
end
symtab[symbol] = value;
symCount = symCount + 1;
end
function symtab_addLabel( label )
-- Printf( "Adding symbol : %s\n", label );
label = label or ( '_L' .. PC_get() );
if( label:sub(-1,-1) == ':' ) then label = label:sub(1,-2) end;
symtab_add( label, ProgramCounter );
end
function symtab_lookup(symbol)
return( symtab[symbol] )
end
function symtab_dump()
Printf( "\n-------- SYMBOLS -------\n" );
if( symCount == 0 ) then Printf("no symbols defined\n"); return; end;
for k,v in pairs(symtab) do
Printf("%32.32s : 0x%04x\n", k, v );
end
end
ProgramCounter = 0;
|
| ︙ | ︙ |