Commit graph

353 commits

Author SHA1 Message Date
nick-less 2ae1f01f36 fix compile error under macos 2021-03-17 20:01:44 +01:00
tevorbl cd36c3526b minor formatting changes
sim.c:
remove stray tracing statements
make formatting consistently leading tabs

Makefile:
restore ACK_TEMP_DIR & CC to default settings
2020-06-13 14:33:14 +01:00
tevorbl 6fe335b9e9 another fix for printf(float) on m68k platform
bug caused by this instruction:

  fmove.l fp0,d0 

problem was caused by a conflict between the fpu emulator (softfloat) and the compiler.

the emulator implemented this as a purely arithmetic move & conversion,
but the compiler assumed that the result could be interpreted as a logical (ie unsigned) conversion.
rightly or wrongly.


for example, if fp0 contained the value 2576980377.0  which is unsigned integer -1717987328
the emulator would treat this as an integer overflow and move 0x7fffffff (INT_MAX) into d0.

The complier on the other hand would assume that d0 contained 2576980377 (the unsigned value).

I don't know which is correct, but this is my fix for the time being.
2020-06-02 13:00:03 +01:00
tevorbl 04fe0aa53e fixed floats in printf in linux59k platform
problem was implementation of fint & fintrz floating point ops in m68kfpu.c
Both these ops truncated the integer to 32 bits instead of leaving it as an extended precision floating point number

Changed the implementation to use 64 bit ints instead of 32 bit ints.
2020-06-01 20:53:29 +01:00
tevorbl e5da3227d9 fpu bug fix for fgetmant op
- inserted missing break
- use temp variable instead of manipulating dest register

fgetexp changed to directly convert int to floatx80
2020-05-30 13:37:04 +01:00
tevorbl 799900f45a update platform linux68k
latest version of musashi engine
includes floating point emulation
(plus a few patches to add in missing opcodes needed by ack - see tags JFF & TBB)

added a few missing linux syscalls in sim.c

pascal now runs pretty well
quick test with modula2 passes

c gets the floating point numbers wrong, so more work needed here

other languages untested

plat/linux68k/emu/build.lua is probably not quite right - the softfloat directory is compiled in the wrong place
2020-05-28 13:06:08 +01:00
David Given 97bed6c0a5 Fix incorrect instruction in the emulator disassembler. 2020-02-05 22:43:27 +01:00
David Given 1101922563 Add the deblocking parameter to cpm_bios_write(). 2020-02-05 22:05:03 +01:00
David Given 17fa773f04 Update CP/M libsys. 2019-11-23 11:31:03 +01:00
George Koehler d6413c1a11 Enable long long in ACK C for osx386. 2019-09-25 12:35:48 -04:00
George Koehler e867861f6d Add 8-byte long long for linux68k.
Add rules for 8-byte integers to m68020 ncg.  Add 8-byte long long to
ACK C on linux68k.  Enable long-long tests for linux68k.  The tests
pass in our emulator using musahi; I don't have a real 68k processor
and haven't tried other emulators.

Still missing are conversions between 8-byte integers and any size of
floats.  The long-long tests don't cover these conversions, and our
emulator can't do floating-point.

Our build always enables TBL68020 and uses word size 4.  Without
TBL68020, 8-byte multiply and divide are missing.  With word size 2,
some conversions between 2-byte and 8-byte integers are missing.

Fix .cii in libem, which didn't work when converting from 1-byte or
2-byte integers.  Now .cii and .cuu work, but also add some rules to
skip .cii and .cuu when converting 8-byte integers.  The new rule for
loc 4 loc 8 cii `with test_set4` exposes a bug: the table may believe
that the condition codes test a 4-byte register when they only test a
word or byte, and this incorrect test may describe an unsigned word or
byte as negative.  Another rule `with exact test_set1+test_set2` works
around the bug by ignoring the negative flag, because a zero-extended
word or byte is never negative.

The old rules for comparison and logic do work with 8-byte integers
and bitsets, but add some specific 8-byte rules to skip libem calls or
loops.  There were no rules for 8-byte arithmetic, shift, or rotate;
so add some.  There is a register shortage, because the table requires
preserving d3 to d7, leaving only 3 data registers (d0, d1, d2) for
8-byte operations.  Because of the shortage, the code may move data to
an address register, or read a memory location more than once.

The multiplication and division code are translations of the i386
code.  They pass the tests, but might not give the best performance on
a real 68k processor.
2019-09-24 13:32:17 -04:00
George Koehler aeb8ed53e4 Define _EM_LLSIZE, int64_t, uint64_t for linux386.
Also change UINT32_MAX in <stdint.h> from 4294967295 to 4294967295U.
The U suffix avoids a promotion to long or unsigned long if it would
fit in unsigned int.

Define _EM_LLSIZE but not EM_LLSIZE.  The leading underscore is a
convention for such macros.  If code always uses _EM_LLSIZE, we will
never need to add EM_LLSIZE.  The flag -D_EM_LLSIZE={q} is in
plat/linux386/descr, not lib/descr/fe, so platforms without long long
don't define _EM_LLSIZE.

<stdint.h> doesn't keep the old code for _EM_LSIZE == 8, because I
change it to _EM_LLSIZE == 8.  No platform had _EM_LSIZE == 8, and the
old limits like INT64_MAX were wrong.
2019-09-12 13:40:07 -04:00
George Koehler 20a4d401d0 Add first long-long test for linux386.
Skip the long-long test set on other platforms, because they don't
have long long.  Each platform would need to implement 8-byte
operations like `adi 8` in its code generator, and set long long to
8 bytes in its descr file.

The first test is for negation, addition, and subtraction.  It also
requires comparison for equality.
2019-09-05 13:13:02 -04:00
George Koehler 007a63d529 Begin to add long long to C compiler for linux386.
Add long long type, but without literals; you can't say '123LL' yet.
You can try constant operations, like `(long long)123 + 1`, but the
compiler's `arith` type might not be wide enough.  Conversions,
shifts, and some other operations don't work in i386 ncg; I am using a
union instead of conversions:

	union q {
		long long ll;
		unsigned long long ull;
		int i[2];
	};

Hack plat/linux386/descr to enable long long (size 8, alignment 4)
only for this platform.  The default for other platforms is to disable
long long (size -1).

In lang/cem/cemcom.ansi,

 - BigPars, SmallPars: Add default size, alignment of long long.
 - align.h: Add lnglng_align.
 - arith.c: Convert arithmetic operands to long long or unsigned long
   long when necessary; avoid conversion from long long to long.
   Allow long long as an arithmetic, integral, or logical operand.
 - ch3.c: Handle long long like int and long when erroneously applying
   a selector, like `long long ll; ll.member` or `ll->member`.  Add
   long long to integral and arithmetic types.
 - code.c: Add long long to type stabs for debugging.
 - conversion.c: Add long long to integral conversions.
 - cstoper.c: Write masks up to full_mask[8].  Add FIXME comment.
 - declar.g: Parse `long long` in code.
 - decspecs.c: Understand long long in type declarations.
 - eval.c: Add long long to operations, to generate code like `adi 8`.
   Don't use `ldc` with constant over 4 bytes.
 - ival.g: Allow long long in initializations.
 - main.c: Set lnglng_type and related values.
 - options.c: Add option like `-Vq8.4` to set long long to size 8,
   alignment 4.  I chose 'q', because Perl's pack and Ruby's
   Array#pack use 'q' for 64-bit or long long values; it might be a
   reference to BSD's old quad_t alias for long long.
 - sizes.h: Add lnglng_size.
 - stab.c: Allow long long when writing the type stab for debugging.
   Switch from calculating the ranges to hardcoding them in strings;
   add 8-byte ranges as a special case.  This also hardcodes the
   unsigned 4-byte range as "0;-1".  Before it was either "0;-1" or
   "0;4294967295", depending on sizeof(long) in the compiler.
 - struct.c: Try long long bitfield, but it will probably give the
   error, "bit field type long long does not fit in a word".
 - switch.c: Update comment.
 - tokenname.c: Define LNGLNG (long long) like LNGDBL (long double).
 - type.c, type.str: Add lnglng_type and ulnglng_type.  Add function
   no_long_long() to check if long long is disabled.
2019-09-02 11:24:44 -04:00
David Given 97d22973ee Add some BIOS bindings, and a zero-terminated print string routine. 2019-06-24 23:07:17 +02:00
David Given ac8edcbfc3 Give up trying to make the B tests pass on CP/M. 2019-06-17 23:33:58 +02:00
David Given 97e6baa052 Fix register corruption when incrementing locals; attempt to solve the
alignment issue.
2019-06-17 23:31:54 +02:00
David Given c2f48772e9 Correctly emit \r\n when a \n is written to the console, instead of \n\n...
Fixes: #198
2019-06-17 23:31:16 +02:00
David Given 0ecad6c860 Warning fix. 2019-06-17 23:29:41 +02:00
David Given 94867d24b7 Ensure that procedure labels are word aligned (required by the EM spec). 2019-06-17 22:26:31 +02:00
David Given 402468f6fd Bugfix the CP/M FCB parser, and add a test for it. 2019-06-17 00:41:49 +02:00
David Given 97e6d8f66a Update README. 2019-06-16 20:10:13 +02:00
David Given 2b013c34dc Some byte shaving; lseek returns the offset. 2019-06-16 20:04:07 +02:00
David Given 50dca8b954 First at-least-slightly working version of the CP/M read/write stuff. Not as
bad as I expected, but far too big.
2019-06-16 19:04:17 +02:00
David Given 3131dc9915 Partially working port of stdio to CP/M. I'm not sure this will work; it's
getting way too complicated (stdio is horribly subtle). I think I need to
rethink things.
2019-06-15 22:22:01 +02:00
David Given 9109d7af7f First stage in modularising FILE*. Refactor so that printf/scanf don't rely on
FILE* innards; allow plats to replace the entire emulated FILE* system.
2019-06-15 13:07:10 +02:00
David Given 784fc67596 Alignment issues mean we can't access 16-bit CP/M structure elements directly. 2019-06-11 22:33:25 +02:00
David Given 0607529df2 Miscellaneous bugfixed and renamings. 2019-06-11 21:33:57 +02:00
David Given a804375560 Miscellaneous byte shaving; you can now choose whether or not you want the CCP
overwritten or not, and cpm_exit() does the right thing.
2019-06-11 20:32:00 +02:00
David Given 3feb79ad0c Simplify the .trp API to make it a bit smaller. 2019-06-11 20:02:03 +02:00
David Given 4e90de00e9 Don't pull in all the trap handlers every time. 2019-06-11 19:47:42 +02:00
David Given f58d7e7d30 Add missing file. 2019-06-11 19:40:46 +02:00
David Given 48a9c48f56 Generate traps procedurally. For some reason they always keep getting pulled
in, though...
2019-06-11 00:12:00 +02:00
David Given ec2ea1feff Add missing file. 2019-06-10 23:57:43 +02:00
David Given d0967e683b Extend the CP/M libsys with a full set of (hopefully correct) 2.2 BDOS calls. 2019-06-10 23:54:23 +02:00
David Given 3f938d651b EM requires 2-alignment in structures, sadly. 2019-06-10 18:33:04 +02:00
George Koehler bec236c108 Include more headers to declare functions.
This causes clang to give fewer warnings of implicit declarations of
functions.

In mach/pdp/cv/cv.c, rename wr_int2() to cv_int2() because it
conflicts with wr_int2() in <object.h>.

In util/ack, rename F_OK to F_TRANSFORM because it conflicts with F_OK
for access() in <unistd.h>.
2019-03-22 15:59:35 -04:00
George Koehler 84f65f7ce3 Raise _XOPEN_SOURCE from 500 to 700
In OpenBSD, _XOPEN_SOURCE 500 forces _POSIX_C_SOURCE down to 199506,
which hides the declarations of openat() and fdopendir() and causes
compiler warnings.

Don't set _POSIX_C_SOURCE, because _XOPEN_SOURCE may set
_POSIX_C_SOURCE to a different value.
2019-03-22 14:35:07 -04:00
David Given 79a38ecc08 Instead of using parameterised rsts for stack access, add a huge swathe of
automatically built helper tools. Star Trek goes up from 40243 to 40779 bytes,
but should be a lot faster.
2019-02-13 22:45:22 +01:00
David Given 073451dd44
Merge pull request #154 from ccodere/buildfix
Bugfix of compilation on gcc 4.8
2019-02-12 21:51:46 +01:00
carl 664338aa49 Fix compilation issue on C90 compilers (gcc 4.8 was failing to compile with default flags) - updated following comment. 2019-02-13 00:17:45 +08:00
carl c63f527dde Fix compilation issue on C90 compilers (gcc 4.8 was failing to compile with default flags). 2019-02-12 00:46:09 +08:00
David Given 34e9573929 Merge from default. 2019-02-10 23:40:07 +01:00
David Given 666d9a3edb Add stray header. 2019-02-10 12:57:00 +01:00
David Given aa6aefdaa0 Add missing header. 2019-02-10 00:45:09 +01:00
David Given 810afbb5b9 Don't run the floating point tests on i80. 2019-02-09 14:24:31 +01:00
David Given bcc9c16bf7 More z80ex removal. 2019-02-09 13:42:09 +01:00
David Given 343cdf7983 Remove stray z80ex reference. 2019-02-09 13:30:29 +01:00
David Given 19f5ee3399 CP/M sbrk now handles overflow correctly. 2019-02-08 21:43:52 +01:00
David Given 22032575c5 Add a 'disassemble' command to the CP/M emulator. 2019-02-08 20:54:44 +01:00
David Given b47d59aa4a Merge from default. 2019-02-07 23:45:47 +01:00
David Given 8876ddcad2 Build the CP/M tests (which got turned off accidentally). Add a disassembler to
the emulator debugger.
2019-02-07 23:36:45 +01:00
David Given 7473601172 Add the cpm emulator from Cowgol, modified to work with an 8080 emulator rather
than libz80ex; enable tests for cpm.
2019-02-07 22:39:57 +01:00
David Given 5ac280026e Experimentally use rst 1 to optimise frame variable loads. Reduces Star Trek
from 43892 to 43205 bytes.
2019-02-07 00:06:32 +01:00
David Given 365c89c9e7 Updated READMEs with the MIPS platform. 2018-09-18 23:49:31 +02:00
David Given 9333b323a5 Make the MIPS boot code produce correct code. 2018-09-18 23:39:04 +02:00
David Given ec0891469f Array descriptor ranges are inclusive; adjust aar and the tests to check for
this. All the tests except rotate build now!
2018-09-17 19:34:38 +01:00
David Given b81e060372 Add huge numbers of failing tests. 2018-09-10 23:40:03 +02:00
David Given 776e93221f Thinko fix. 2018-09-09 18:57:44 +02:00
David Given c769fbec93 Use the correct ELF processor flags; align properly. 2018-09-09 18:57:35 +02:00
David Given f3bc9ef92a Call proper Linux system calls proper-like. 2018-09-09 18:57:12 +02:00
David Given ec46643124 Allow the ELF processor flags to be set. Generate MIPS ELF executables, not
PowerPC ones.
2018-09-09 14:29:34 +02:00
David Given 26fe3f7530 Added library skeletons. 2018-09-05 00:07:07 +02:00
David Given 98afb42095 Added a boot.o based on the PowerPC one. 2018-09-05 00:00:13 +02:00
David Given 1d6ecddcf4 The MIPS backend is still full of holes, and cut-and-pasted PowerPC code, but
is beginning to look like an actual code generator.
2018-09-02 18:57:25 +02:00
David Given 4741ed8e14 Add a completely non-tested table-based MIPS assembler. 2018-09-01 19:35:31 +02:00
David Given ab7002c0ee All the Linux include directories are the same, so common them all out into a
single one, like OSX.
2018-06-24 19:57:43 +02:00
David Given f45b357740 Remove the dependency on the glibc-only byteswap.h. 2018-06-24 00:01:06 +02:00
David Given 1fc20e90c0 Remove c99-isms. 2018-06-23 23:56:34 +02:00
David Given 64ae1d7583 Move time() into sys; change the name of the variable which controls it. 2018-06-23 19:40:50 +02:00
David Given 538eefb573 Get em22 working. Remove the leading-underscore system calls from its libsys. 2018-06-23 15:57:57 +02:00
David Given 74d166ef9a Get the pdp7 plat working; remove the leading-underscore syscalls. 2018-06-23 15:18:26 +02:00
David Given 3e40374297 Made the rpi platform work with the new libc layout. 2018-06-23 13:05:27 +02:00
David Given dbb2062d03 Made pc86 work with the new libc. 2018-06-23 12:59:40 +02:00
David Given 680b4071b7 Made the two OSX platforms work with the new libc layout. 2018-06-23 12:55:59 +02:00
David Given b727b7affd Make linuxppc work. 2018-06-23 12:41:54 +02:00
David Given b267b56ad9 Made linux68k work; commoned up all the generic linux includes. 2018-06-23 12:35:17 +02:00
David Given 66815ff987 Make linux386 work with the new libc layout. 2018-06-23 12:13:33 +02:00
David Given 32c881474e Create a basic and probably wrong common unistd.h, which replaces the plat one.
Made this work with cpm (but nothing else yet).
2018-06-23 11:46:55 +02:00
David Given 94ffa3ba88 libc floating point and stdio floating point can now be turned on and off using
ACKCONF variables.
2018-06-23 00:04:14 +02:00
David Given 9bf1d548fc Rearrange the libc config files, ready for adding new options. 2018-06-22 23:43:15 +02:00
David Given 60b7d8de6e
Merge pull request #96 from kernigh/kernigh-emu-1
Fixes to build emulators, ass, int on OpenBSD
2018-06-20 22:30:01 +02:00
David Given 698613cd7d Turns out that the compiler needs access to the libpc headers too; refactor
into a separate target to avoid build loops and make it work.
2018-06-18 22:17:38 +02:00
David Given 11854f4dfe Ansify and warning fix. 2018-06-17 22:30:27 +02:00
David Given 13e195d19f Warning fixes. 2018-06-17 15:42:26 +02:00
David Given ddca7276c0
Merge pull request #102 from davidgiven/dtrg-powerpc
Add a PowerPC simulator for running the tests.
2018-06-17 11:45:26 +02:00
David Given 89e8956bb2 Fix edge case in rlwnm when the mask is 32 bits wide. All tests now pass. 2018-06-17 11:00:01 +02:00
David Given 7ec9f54679 Turns out that andi and andis only have . forms. Fixed; another test passes. 2018-06-17 10:43:39 +02:00
David Given 78eaf836be Turns out I was returning values from syscalls in the wrong register; fixed.
More tests pass.
2018-06-17 10:22:20 +02:00
David Given ab660a44e9 Lots of floating point, bugfixes, and system calls. Most of the tests pass now. 2018-06-17 09:24:01 +02:00
David Given 67efbb5f7f Do a bit of floating point stuff; added brk(); fixed a horrible bug where
stores with 16-bit displacements were storing the register number and not the
contents of the register.
2018-06-16 22:55:23 +02:00
David Given 5d7cdd2c67 Fix a setcr0 bug which was trashing the condition register; some system
calls are now implemented. A few tests more-or-less pass (but crash on
exit).
2018-06-16 08:35:36 +02:00
David Given 39a49265ce
Merge pull request #100 from kernigh/kernigh-pdp
Two fixes for ack -mpdpv7
2018-06-15 15:40:24 +09:00
George Koehler 5db312a1c0 Prevent crash in isatty()
The existing code allocated 2 bytes (char*), but gtty() needs 6 bytes
(struct sgttyb), so isatty() smashed the stack and corrupted its
return address, probably causing SIGBUS or SIGSEGV.

Fix by switching to TIOCGETD, which needs 2 bytes.  TIOCGETD isn't in
the manual for tty(4), but does appear in
https://minnie.tuhs.org//cgi-bin/utree.pl?file=V7/usr/sys/dev/tty.c

This fixes hilo_c.pdpv7 and hilo_mod.pdpv7 in simh-pdp11.
2018-06-15 00:48:29 -04:00
George Koehler 5de5611c24 Use 2-byte alignment in pdpv7 to prevent SIGBUS.
Change the alignment in C structs (wa, pa, sa, and so on) from 1 to 2
bytes.  This prevents the SIGBUS when PDP-11 Unix V7 catches the
misalignment.  This fixes hilo_p.pdpv7 in simh-pdp11.

Change ALIGN to document that sections have 2-byte alignment.  This
change should have no effect, because the sections only contain 2-byte
values.
2018-06-15 00:17:12 -04:00
David Given 5111556d14 Got the emulator to the point where we're hitting the first major emulation bug
(the calloc test hangs).
2018-06-14 05:53:39 -07:00
David Given 853af4c4dd Some code runs (up to needing setcr0). 2018-06-14 04:41:21 -07:00
David Given b71145f79d Implement a non-functional skeleton of the PowerPC emulator (with, hopefully,
most of the instruction decode done).
2018-06-14 03:07:36 -07:00
David Given 31c2ba3f94 File cleanup. 2018-06-13 21:47:08 +09:00
David Given 7eaa235fd1 Bodge the ancient em monitor library into building as a libsys for the em22
plat. It's completely untested, but it builds and makes e.out executables.
2018-06-13 21:44:25 +09:00