Wed Oct 31 03:43:54 CET 2007
a more traditional approach
There is a type of assembler that does exactly the same thing on
every assembly pass through the sourcecode. Pass 1 outputs to
dev>nul and is full of phase errors, pass 2 has eliminated most
(or all) phase errors (output to nowhere) and pass 3 usually does
the job in 99%+ cases whereupon code is output. On each pass
through the sourcecode (or p-code in your case) you check for
branch out of range, then substitute a long branch and add 1 to
the program counter, causing all following code to be assembled
forward+1, then make another pass and do the same thing again
until no more branch out of range and phase errors are found do to
mismatched branch-target addresses.
That doesn't require my esoteric approach and seems a lot simpler
really: just keep it running until the addresses stop changing.
So just do as before, but:
* keep a phase error log
* use a generic branch instruction which gives short or long branches
* every pass is completely new
* split 'old' and 'new' labels, make new labels mutable?
* put 'here' in a dynamic variable
* make a quick scan for labels to find out undefined ones
prepare assembly code so multiple clean passes are possible:
- get rid of 'mark' for example.
- put 'here' in a parameter
- remove all dictionary manipulations
- find a way to handle var and eeprom.. maybe separate pass/filter?
the goals is clear enough.. just some disentangling to do first..
* use the previous approach, but keep the dictionary after every
pass (clean it inbetween)
* keep a log of the name registerations to determine phase errors.