As part of the conversion of SPITBOl to generate gnu assembler (gas) instead of NASM format, I learned that the GAS assembler is less powerful than that of NASM. For example, in NASM I could
use ‘define’ to map a register name to ‘eax’ in 32-bit mode, or ‘rax’ in 64-bit mode.
No problemo … SPITBOL to the rescue.
Here is the simple preprocessor I wrote in about twenty minutes:
* rename registers according to word size target = host(0) target break('_') . os "_" rem . ws prefix = (eq(ws,32) '%e', '%r') word = (eq(ws,32) 'dword','qword') defines = 'M_WORD ' word ' ' defines = defines 'D_WORD' ' ' (eq(ws,32) '.long', '.quad') ' ' define('a(ref)') :(a.end) :(next) a ident(os,"osx") :s(a.err) a = '[' ref ']' :(return) a.end define('m(ref)') :(m.end) m ident(os,"osx") :s(m.err) m = (eq(ws,32) 'd', 'q') 'word ptr ' ref ']' :(return) m.end rmap = table(20) s = 'XLsiXRdiXSspXTsiWAcxWBbxWCdxW0axIAbp' rinit s len(2) . min len(2) . reg = :f(rdone) rmap[min] = reg :(rinit) rdone rpat = 'IA' | ('X' any('LRST')) | ('W' any('ABC0')) next line = input :f(end) aloop line breakx('A') . first 'A(' bal . ref ')' rem . last = first a(ref) last :s(mloop) defs = defines dloop defs break(' ') . key ' ' break(' ') . val ' ' = :f(mloop) dloop.1 line key = val :s(dloop.1)f(dloop) mloop line breakx('M') . first 'M(' bal . ref ')' rem . last = first m(ref) last :s(mloop) rloop line rpat . reg = prefix rmap[reg] :s(rloop) output = line :(next) err output = 'error ' end