| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
| |
In the process I had to fix a couple more bugs in support for disp16 instructions.
|
|
|
|
|
|
|
| |
I stopped handling disp16 at some point, and using instructions with such
an operand messes up segment alignment when generating ELF binaries.
I don't test my ELF generation. This is a sign that maybe I should start.
|
| |
|
|
|
|
|
|
|
|
|
| |
A debugging aid: 'subx --map translate' dumps a mapping from functions
to addresses to a file called "map", and 'subx --map run' loads the mapping
in "map", augmenting debug traces.
Let's see how much this helps. Debugging machine code has been pretty painful
lately.
|
| |
|
|
|
|
|
| |
Make segment management a little more consistent between initial segments
and add-on segments (using `mmap`).
|
| |
|
| |
|
|
|
|
|
|
|
|
|
| |
It was broken since I added support for global variables, back on Sep 1.
One other subtle thing I've improved is the name `looks_like_hex_int`.
We can now distinguish in the pack-operands transform between ignoring
'foo' because it doesn't look like a number, and immediately flagging '0xfoo'
as an error because it *should* be a number.
|
|
|
|
|
|
|
|
|
|
|
| |
Now simulated 'Memory' isn't just a single flat array. Instead it knows
about segments and VMAs.
The code segment will always be first, and the data/heap segment will always
be second. The brk() syscall knows about the data segment.
One nice side-effect is that I no longer need to mess with Memory initialization
regardless of where I place my segments.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Extract a helper from the factorial unit test: check_ints_equal.
Start of a vocabulary for unit tests.
I *could* also start thinking of supporting multi-file programs, but I'm
going to resist the temptation for now. Copy helpers as necessary, and
allow them to mutate and diverge for a while before we pummel them into
a Procrustean "standard library". Extracting a body of shared code immediately
starts to discourage innovation in the shared code.
|
|
|
|
|
| |
Neither jump nor call instructions support immediates. Drop that.
The only form of absolute addressing relies on rm32.
|
| |
|
|
|
|
|
|
|
|
| |
Attempt #3 at fixing CI.
In the process the feature gets a lot less half-baked.
Ridiculously misleading that we had `has_metadata()` was special-cased
to one specific transform. I suck.
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
I'm going to continue using them for now, but I'm fairly certain now
that they're just a temporary device to help rapidly-prototype ideas.
The reason: there's just too many ways to abuse low-level features, and
it ends up taking too much code to disallow things soon after you allow
them.
New plan: stop trying to write checks, just treat them as temporary
conventions for now. Goal is now to just get the core sequence of passes
nailed down. Then we'll start reimplementing them from the ground up.
First implication of this new plan: ripping out most existing checks.
I'm still going to eventually build type checks. But no degenerate
checks for code just being too low-level.
(This decision is the outcome of a few days of noodling over Forth and
https://mastodon.social/@akkartik/100549913519614800.)
|
|
|
|
|
| |
We want to always print numbers in hex. This should make that a little
more comprehensive.
|
| |
|
|
|
|
|
|
|
|
|
| |
Targets you can jump to and ones you can call are conceptually disjoint
sets.
I'm highlighting these in Vim, but it's a pretty complex pattern.
Arguably errors shouldn't be highlighted. Only warnings that are easy to
be accidentally deployed.
|
|
|
|
|
| |
Side effect: better error messages when the tangler does something
unexpected.
|
|
|
|
|
| |
As we climb the ladder of abstraction we'll gradually pull the ladder up
behind ourselves.
|
| |
|
| |
|
| |
|
| |
|
|
|