Age | Commit message (Collapse) | Author |
|
This is because the previous commit actually created
a bug, rather than fixing one.
- Added JMP, and JSR to the ortho extension, and
implemented them both in the assembler, and
emulator.
|
|
- Started work on implementing the Super VIA emulation.
- Added support for disabling disassembly per
instruction, when in debug mode.
- Did some more work on rewriting the SuB Suite to
work with the new calling convention.
- Rewrote the symbol handling code in the emulator's
assembler, to make it both simpler, and to add
support for arbitrarily deep symbol scopes.
- Added support for arbitrarily deep local symbol
scopes.
For example, to declare a symbol of depth 2, you add
two '@' characters to the start of the symbol name.
In other words, the number of '@' characters before
the symbol name is what determines the scope of that
symbol.
And to use a symbol thats outside the current
scope, you would use the same syntax as using a
struct member, so you would do `global.local`.
|
|
I mainly did this to be able to display all 16 main
registers, but also to simplify the debugger.
|
|
This was done in order to save three bytes whenever
you want to immediatly do a conditional branch after
the `set` instruction.
|
|
assembler.
The main thing I had to do was implement the parsing
of the condition code token, but that wasn't hard to
do, since I had already done the lexing part already.
The next thing to do, will be to design a calling
convention for Sux.
|
|
|
|
in the emulator.
|
|
both the assembler, and the emulator.
I finally figured out how I could get support for the
Ortho extension implemented into the old assembler.
The only reason for doing this, is to buy me some
while I start work on the new assembler, and to help
me get an idea for how to do the same in the new
assembler.
|
|
This is the biggest milestone I've reached for this
project, since the base extension changes alot about
what Sux can do by default, and now makes it a viable
instruction set for modern day use, when compared
with other instruction sets.
|
|
- Made the debug print for the CPU flags more
readable.
- Started work on implementing line number support
into SuBAsm.
|
|
This is to allow for making the stack bigger for
anything that needs to change the size of it.
- Made the SuB Suite set the stack pointer to the end
of the usable RAM, and allow for changing the stack
size.
In this case, the size of the stack is currently set
to 192K, with the end of the heap being just below
the stack.
|
|
The carry flag is now set properly, and the rotation
now is set properly by the carry flag, even for
shift values greater than one.
- Added a test program for properly testing the rotate
instructions.
|
|
implementation of free(), although it's commented
out.
- Removed the sbc() function from the emulator, since
sbc can be done by just inverting the second operand
of adc.
|
|
emulator's memory.
All reads outside of the emulator's memory give back
$/0xFF bytes, while all writes outside of the
emulator's memory are ignored.
- Implemented malloc(), and free() in the SuB Suite.
In order to do this, I had to add support for a heap,
which I did by reserving the first 3 banks of the
address space (the first 192K), and by adding a
routine that finds the end of the RAM.
In this case, I set the starting address for the
routine at bank 3 (bank 4 with one indexing), but,
the routine's starting address isn't hardcoded, and
thus, any starting address can be passed as an
argument.
The routine uses the fact that we can now read/write
outside the emulator's memory, and also uses the
fact that writing outside the emulator's memory will
be ignored, and that reading outside the emulator's
memory will always read $/0xFF bytes, and uses that
to signal that it's reached the end of the RAM.
- Added a test program for getting the size of RAM
starting at address $/0x20000.
|
|
|
|
handled.
- Added a function called fix_symtree(), which when
called. will rearrange the symbol tree based on the
order they're declared in by the token stream.
The reason I wrote this, was to make sure the symbol
tree could be printed correctly.
- Optimized print_symtree() to now use tail recursion.
- Started adding all of the SuB Suite's structs.
|
|
emulator's assembler.
- Make the symbol table a doublely linked list, in
both ways.
- Optimized the memcopy() function.
- Changed the benchmark timing, to now use a timer, and
stops once the timer reaches zero.
When the timer hits zero, it sends SIGALRM to the
main function, which tells the emulator that the
benchmark is done.
|
|
- Added a memcopy() function, for later on.
|
|
- Optimized the memory read, and write functions.
- Made the emulator faster, and cleaner in general.
|
|
- Simplified the effective address functions.
- Made SuBEditor a bit faster.
- JSR, and RTS now support using the RS prefix, which
is used to specify the return address size, with an
RS prefix of 0 being a return address size of 64
bits, rather than 8 bits.
|
|
address handling.
It's now all done using several functions for each
addressing mode, with the result being the effective
address.
I did this to make the codebase cleaner, and more
readable.
|
|
It now uses a struct to store the escape sequence.
Before it handles the escape sequence, it parses it,
which includes things like getting any arguments
that are supplied, and getting the mode type.
- Moved the code that handles control codes to a
separate function.
The reason for doing this was because I wanted to make
the escape sequence handling faster, but also make the
code more readable at the same time.
I got the idea to do this from st, a terminal emulator
created by the suckless.org project.
|
|
I decided to use keypad now, and create a function to
return the actual key sequences.
The keyboard I/O is also now being handled by the io
emulation function, and not by the main function.
This should get rid of any possible deadlocks.
|
|
It now saves the characters of the typed key into a
buffer, and returns each character in the buffer one
at a time, until it reaches a null terminator, at
which point it starts getting the next key.
The reason for doing this was to make getting multi
character keys faster, by not calling getch() for
each character.
The only downside to this is that I have to set a
timeout() for getch(), making it somewhat non
blocking, although the delay is 8 milliseconds.
The next thing I'll probably be doing, is working more
on the SuB suite.
|
|
instruction formatting simpler.
- Refactored the instruction table of the emulator's
assembler, it now has two parts, the addressing mode
bits, and the base value.
The base value is what's used to generate the actual
opcode, with the addressing mode bits telling the
assembler what addressing modes this instruction
supports.
The reason for doing this was to use less space. For
comparison, the previous version used 870 bytes for
the instruction table, while the new version uses
only 222 bytes. The new version is nearly 4 times
smaller than the pervious version.
- The B register based ALU instructions now use their
own addressing mode, and are specified by using 'b'
as the operand for those instructions.
For example, to add the Accumulator with the B
register, you now use "ADC B" instead of "AAB".
|
|
- Changed the file structure of the SuB Suite, so that
all variable declarations, symbols, and constants
are in a single file.
- Moved the C library functionss into a separate
file, and made them use stack frames.
- Added support for using the emulator's assembler for
realtime debugging, to enter it, get in to stepping
mode by pressing Ctrl+s, press any other key, then
press F1,
The reason for having to press some other key before
pressing F1 is because it only allows entering the
assembler when the keyboard is not ready.
- Added the ".res" directive to the emulator's
assembler, the ".res" directive tells the assembler
to reserve however many bytes specified by the
operand.
- Fixed some bugs in the emulator's assembler.
|
|
- Fixed some bugs with the push, and pull functions
- Fixed a bug in the assembler.
|
|
- Added a new preifx called the OF prefix, which adds
the contents of a specific register to the current
operand.
- Added a table generator, which parses opcode table
csv files.
|
|
|
|
make it clear about what it does.
|
|
all the value getting, and setting into macros.
This is to make the codebase cleaner.
|
|
- Fix some bugs with strings.
- Started to refactor the instruction functions.
- Added support for using RS prefixes on the memory
based increment, and decrement instructions.
- Started work on SuBAsm's lexer.
Have fun looking at this, BieHDC. :)
|
|
support for comma separated values.
The assembler now uses a linked list of tokenized
lines, each containing a linked list of tokens for
that line.
I also moved all of the large tables into the higher
parts of memory, in order to free up the lower part of
memory for the user.
Comma sepparated values only work with directives, and
only with the byte", word, dword, and qword directives.
I also added support for getting the upper, and lower
halves of an address. The tokens for both of those are
'<', and '>' respectively.
|
|
- Moved the large enums, and large tables into separate
header files.
- Added enums for implementing the base extension
- Fixed a bug in the assembler.
- Worked more on SuBAsm.
|
|
the processor status register, a union now.
|
|
done with a union, in order to make it more readable.
|
|
functions.
I did this to make it more readable, while still
making it fast, due to inlining it.
|