From 86d46f101e811a2c22f9d6e2424719911f2cd248 Mon Sep 17 00:00:00 2001 From: g012 Date: Wed, 20 Sep 2017 10:27:38 +0200 Subject: [PATCH] Added local label references resolver. --- 6502.lua | 9 +++++++++ asm.l65 | 13 +++++++------ asm.lua | 23 +++++++++++------------ 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/6502.lua b/6502.lua index 6f7a07c..070453e 100644 --- a/6502.lua +++ b/6502.lua @@ -131,6 +131,13 @@ M.resolve = function() elseif t == 'string' then symbols[k]=symbols[v] count=count+1 end end end stats.resolved_count = count + + -- set local label references resolver + local llresolver = { __index = function(tab,key) + if type(key) ~= 'string' or key:sub(1,1) ~= '_' then return nil end + return symbols[M.label_current .. key] + end } + setmetatable(symbols, llresolver) end M.genbin = function(filler) @@ -152,6 +159,7 @@ M.genbin = function(filler) for _,section in ipairs(sections) do assert(section.org >= #bin+of0) for i=#bin+of0,section.org-1 do ins(bin, filler) end + M.label_current = section.label for _,instruction in ipairs(section.instructions) do local b,f = instruction.bin,instruction.asbin if b then mov(b,1,#b,#bin+1,bin) @@ -253,6 +261,7 @@ M.label = function(name) name = M.label_current .. name else M.label_current = name + label.asbin = function() M.label_current = name end end if symbols[name] then error("duplicate symbol: " .. name) end symbols[name] = label diff --git a/asm.l65 b/asm.l65 index 45e4f69..e77a10f 100644 --- a/asm.l65 +++ b/asm.l65 @@ -88,11 +88,12 @@ ptr_table("ptrs", message, data, 0) -- cycles are counted without taking any branch table.insert(section_current.instructions, { asbin=function() print('kernel cycles: ', cycles-kernel_cycles, 'kernel size: ', size-kernel_size) end }) ---[[ - lda function(c) return data * c end, v - lda \c(data*c), v - local f = \c(data*c) v=5 lda !f,v v=12 lda !f,v - local g = function() return function(c) return data * c end end + + v=7 + lda function(c) return 0xffff&(data * c) end, v + lda \c((data*c)&0xffff), v + local f = \c((data*c)&0xffff) v=5 lda !f,v v=3 lda !f,v + local g = function() return function(c) return (data * c)&0xffff end end lda !g(),v #pragma encapsulate off @@ -100,7 +101,6 @@ ptr_table("ptrs", message, data, 0) lda !_toto+15,16,x lda #15 #pragma encapsulate on -]] samepage lda #0xac @@ -114,6 +114,7 @@ ptr_table("ptrs", message, data, 0) lda (VBLANK),y end + beq _toto asl asl VBLANK asl diff --git a/asm.lua b/asm.lua index d312a8f..4985e97 100644 --- a/asm.lua +++ b/asm.lua @@ -88,19 +88,17 @@ section("waitForIntim") --alt short syntax when no other option -- cycles are counted without taking any branch table.insert(section_current.instructions, { asbin=function() print('kernel cycles: ', cycles-kernel_cycles, 'kernel size: ', size-kernel_size) end }) ---[[ - lda function(c) return data * c end, v - lda \c(data*c), v - local f = \c(data*c) v=5 lda !f,v v=12 lda !f,v - local g = function() return function(c) return data * c end end - lda !g(),v -#pragma encapsulate off - lda f,v - lda !_toto+15,16,x - lda #15 -#pragma encapsulate on -]] + v=7 + ldazab( function(c) return 0xffff&(data * c) end, v) + ldazab( function(c) return (data*c)&0xffff end, v) + local f = function(c) return (data*c)&0xffff end v=5 ldazab(f,v) v=3 ldazab(f,v) + local g = function() return function(c) return (data * c)&0xffff end end + + ldazab(g(),v) + ldazab( f,v) + ldazax (function(_o) return _o+(_toto+15) end,16) + ldaimm (15) do samepage() ldaimm (function(_o) return _o+(0xac) end) @@ -114,6 +112,7 @@ section("waitForIntim") --alt short syntax when no other option ldainy (function(_o) return _o+(VBLANK) end) endpage() end + beqrel( "_toto") aslimp() aslzab(function(_o) return _o+( VBLANK) end) aslimp()