scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | README | LICENSE

commit 137a215d6fa95f0030a02cbb3e2880ae8d19da61
parent 443838bfc5a8c6c96e32e0d9ec39a016fc636d0e
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Mon, 10 Sep 2018 08:59:40 +0200

Merge branch 'master' of ssh://simple-cc.org/var/gitrepos/scc

Diffstat:
M.gitignore | 22+++++++++++-----------
MMakefile | 27+++++++++++++++------------
MREADME | 33++++++++++++++++++++++++---------
Mar/Makefile | 24++++++++++--------------
Aar/deps.mk | 7+++++++
Mar/main.c | 11++++++++++-
Mas/Makefile | 28+++++++++++++---------------
Mas/as.h | 4++--
Aas/deps.mk | 46++++++++++++++++++++++++++++++++++++++++++++++
Das/gendep.sh | 27---------------------------
Mas/gentbl.awk | 17++++++++++-------
Mas/gentbl.sh | 2+-
Mas/ins.c | 11-----------
Mas/main.c | 7-------
Mas/parser.c | 18++++--------------
Mas/target/amd64.mk | 7+++----
Aas/target/i286.mk | 8++++++++
Mas/target/i386.mk | 7+++----
Mas/target/x80/ins.c | 14++++++++++----
Mas/target/x80/proc.h | 2+-
Mas/target/x80/x80.dat | 75+++++++++++++++++++++++++++++++++++++++++++++++----------------------------
Das/target/x80/z80-test.s | 1588-------------------------------------------------------------------------------
Mas/target/x80/z80.c | 1-
Mas/target/x86/amd64.c | 1-
Aas/target/x86/i286.c | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Mas/target/x86/i386.c | 1-
Mas/target/x86/ins.c | 280+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
Mas/target/x86/proc.h | 8++++++++
Mas/target/x86/rules.dat | 16+++++++++-------
Mas/target/x86/x86.dat | 47++++++++++++++++++++++++++---------------------
Mas/target/z80.mk | 9++++-----
Das/test.sh | 46----------------------------------------------
Mcc1/Makefile | 29++++++++++++++---------------
Acc1/deps.mk | 45+++++++++++++++++++++++++++++++++++++++++++++
Dcc1/gendep.sh | 27---------------------------
Mcc1/lex.c | 2+-
Acc1/target/amd64-sysv/arch.mk | 5+++++
Mcc1/target/arm64-sysv/arch.c | 220+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acc1/target/arm64-sysv/arch.mk | 5+++++
Acc1/target/i386-sysv/arch.mk | 5+++++
Acc1/target/z80-scc/arch.mk | 5+++++
Mcc2/Makefile | 34++++++++++++++++++----------------
Acc2/deps.mk | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dcc2/gendep.sh | 39---------------------------------------
Mcc2/target/amd64-sysv/target.mk | 4++++
Mcc2/target/i386-sysv/target.mk | 4++++
Mcc2/target/qbe_amd64-sysv/target.mk | 4++++
Mcc2/target/qbe_arm64-sysv/target.mk | 2+-
Mcc2/target/z80-scc/target.mk | 3+++
Aconfig.mk | 30++++++++++++++++++++++++++++++
Dconfig.mk.def | 32--------------------------------
Aconfig.sh | 16++++++++++++++++
Dconfigure | 15---------------
Mdriver/Makefile | 2+-
Mdriver/posix/Makefile | 44++++++++++++++++++++++----------------------
Adriver/posix/config.sh | 16++++++++++++++++
Adriver/posix/deps.mk | 8++++++++
Ddriver/posix/gendep.sh | 18------------------
Mdriver/posix/scc.c | 17++++++++++++++---
Minc/Makefile | 22+++++++++++++---------
Minc/coff32/aouthdr.h | 10+++++++++-
Ainc/coff32/coff32.h | 22++++++++++++++++++++++
Minc/coff32/filehdr.h | 20+++++++++++++-------
Ainc/incdep.mk | 7+++++++
Ainc/inclst.mk | 4++++
Minc/ldflags.def.h | 3+--
Ainc/syscrts.def.h | 5+++++
Minc/sysincludes.def.h | 2+-
Minc/syslibs.def.h | 5++++-
Mld/Makefile | 30++++++++++--------------------
Mld/coff32.c | 406+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------
Ald/deps.mk | 15+++++++++++++++
Dld/formats.c | 13-------------
Mld/ld.h | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
Mld/main.c | 245++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
Mld/obj.c | 144++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
Mlib/Makefile | 9+++++++--
Mlib/c/Makefile | 7++++++-
Mlib/c/__putc.c | 27++++++---------------------
Alib/c/_flsbuf.c | 23+++++++++++++++++++++++
Mlib/c/_fpopen.c | 12+++++++-----
Mlib/c/calloc.c | 1+
Mlib/c/ctype.c | 1-
Alib/c/errno.c | 1+
Mlib/c/fclose.c | 12++++++++----
Mlib/c/fopen.c | 10+++++++---
Mlib/c/fputs.c | 1+
Mlib/c/fread.c | 4+++-
Mlib/c/freopen.c | 3+++
Mlib/c/fseek.c | 8+++++---
Dlib/c/include/assert.h | 10----------
Dlib/c/include/bits/amd64-sysv/arch/limits.h | 17-----------------
Dlib/c/include/bits/amd64-sysv/arch/signal.h | 27---------------------------
Dlib/c/include/bits/amd64-sysv/arch/stdio.h | 13-------------
Dlib/c/include/bits/i386-sysv/arch/limits.h | 17-----------------
Dlib/c/include/bits/i386-sysv/arch/signal.h | 27---------------------------
Dlib/c/include/bits/i386-sysv/arch/stdio.h | 13-------------
Dlib/c/include/bits/z80-dos/arch/limits.h | 17-----------------
Dlib/c/include/bits/z80-dos/arch/signal.h | 31-------------------------------
Dlib/c/include/bits/z80-dos/arch/stdio.h | 13-------------
Dlib/c/include/errno.h | 14--------------
Dlib/c/include/limits.h | 9---------
Dlib/c/include/signal.h | 9---------
Dlib/c/include/stdbool.h | 9---------
Dlib/c/include/string.h | 33---------------------------------
Mlib/c/isascii.c | 1-
Mlib/c/isblank.c | 3+++
Alib/c/libc.h | 5+++++
Mlib/c/memchr.c | 2+-
Mlib/c/putc.c | 2+-
Mlib/c/putchar.c | 2+-
Mlib/c/puts.c | 3++-
Mlib/c/realloc.c | 1+
Mlib/c/setvbuf.c | 11+++++++----
Mlib/c/stdio.c | 10++++++++--
Alib/c/strnlen.c | 13+++++++++++++
Mlib/c/strpbrk.c | 2+-
Mlib/c/syscall.h | 10++--------
Alib/c/target/.gitignore | 1+
Mlib/c/target/Makefile | 10++++++++--
Dlib/c/target/amd64-sysv-linux-elf/Makefile | 9---------
Dlib/c/target/amd64-sysv-linux-elf/gendep.sh | 16----------------
Alib/c/target/amd64-sysv-linux/.gitignore | 10++++++++++
Alib/c/target/amd64-sysv-linux/Makefile | 17+++++++++++++++++
Alib/c/target/amd64-sysv-linux/sys.h | 20++++++++++++++++++++
Alib/c/target/amd64-sysv-linux/syscall.lst | 11+++++++++++
Alib/c/target/amd64-sysv-linux/syscall.mk | 1+
Alib/c/target/amd64-sysv-netbsd/.gitignore | 10++++++++++
Alib/c/target/amd64-sysv-netbsd/Makefile | 17+++++++++++++++++
Alib/c/target/amd64-sysv-netbsd/_setcontext.s | 14++++++++++++++
Alib/c/target/amd64-sysv-netbsd/_sigaction.c | 15+++++++++++++++
Alib/c/target/amd64-sysv-netbsd/_sigaction2.s | 12++++++++++++
Alib/c/target/amd64-sysv-netbsd/sys.h | 20++++++++++++++++++++
Alib/c/target/amd64-sysv-netbsd/syscall.lst | 10++++++++++
Alib/c/target/amd64-sysv-netbsd/syscall.mk | 1+
Dlib/c/target/amd64-sysv-openbsd-elf/Makefile | 7-------
Dlib/c/target/amd64-sysv-openbsd-elf/gendep.sh | 16----------------
Alib/c/target/amd64-sysv-openbsd/.gitignore | 10++++++++++
Alib/c/target/amd64-sysv-openbsd/Makefile | 17+++++++++++++++++
Alib/c/target/amd64-sysv-openbsd/sys.h | 20++++++++++++++++++++
Alib/c/target/amd64-sysv-openbsd/syscall.lst | 11+++++++++++
Alib/c/target/amd64-sysv-openbsd/syscall.mk | 1+
Alib/c/target/amd64-sysv/longjmp.s | 20++++++++++++++++++++
Alib/c/target/amd64-sysv/objlst.mk | 7+++++++
Alib/c/target/amd64-sysv/setjmp.s | 17+++++++++++++++++
Dlib/c/target/common.mk | 15---------------
Dlib/c/target/i386-sysv-linux-elf/Makefile | 7-------
Dlib/c/target/i386-sysv-linux-elf/gendep.sh | 16----------------
Alib/c/target/i386-sysv-linux/Makefile | 9+++++++++
Dlib/c/target/objlst.mk | 22----------------------
Alib/c/target/posix/geterrno.sh | 8++++++++
Alib/c/target/posix/linux.e | 131+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alib/c/target/posix/netbsd.e | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alib/c/target/posix/objlst.mk | 6++++++
Alib/c/target/posix/openbsd.e | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alib/c/target/posix/raise.c | 12++++++++++++
Alib/c/target/posix/signal.c | 21+++++++++++++++++++++
Rlib/sys/abi/amd64-sysv.sh -> lib/c/target/script/amd64-sysv.sh | 0
Alib/c/target/script/common.mk | 38++++++++++++++++++++++++++++++++++++++
Alib/c/target/script/generrno.sh | 12++++++++++++
Alib/c/target/script/generrstr.sh | 21+++++++++++++++++++++
Alib/c/target/script/objlst.mk | 319+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alib/c/target/script/objlst.sh | 20++++++++++++++++++++
Alib/c/target/script/syscall.sh | 8++++++++
Dlib/c/target/z80-scc-none-none/Makefile | 7-------
Dlib/c/target/z80-scc-none-none/gendep.sh | 16----------------
Alib/c/target/z80-scc-none/Makefile | 9+++++++++
Mlib/c/vfprintf.c | 5+++--
Mlib/c/vsnprintf.c | 6+++---
Mlib/c/vsprintf.c | 1+
Alib/c/wcsnlen.c | 10++++++++++
Alib/coff32/Makefile | 22++++++++++++++++++++++
Alib/coff32/coff32_pack_aout.c | 10++++++++++
Alib/coff32/coff32_pack_ent.c | 21+++++++++++++++++++++
Alib/coff32/coff32_pack_hdr.c | 22++++++++++++++++++++++
Alib/coff32/coff32_pack_scn.c | 25+++++++++++++++++++++++++
Alib/coff32/coff32_unpack_aout.c | 10++++++++++
Alib/coff32/coff32_unpack_ent.c | 21+++++++++++++++++++++
Alib/coff32/coff32_unpack_hdr.c | 23+++++++++++++++++++++++
Alib/coff32/coff32_unpack_scn.c | 25+++++++++++++++++++++++++
Alib/coff32/deps.mk | 17+++++++++++++++++
Alib/coff32/libdep.mk | 4++++
Alib/coff32/objlst.mk | 9+++++++++
Mlib/crt/Makefile | 14++++++--------
Alib/crt/amd64-sysv-linux/Makefile | 9+++++++++
Mlib/crt/amd64-sysv-linux/crt.s | 2+-
Alib/crt/amd64-sysv-netbsd/Makefile | 9+++++++++
Alib/crt/amd64-sysv-netbsd/crt.s | 17+++++++++++++++++
Alib/crt/amd64-sysv-openbsd/Makefile | 9+++++++++
Mlib/crt/amd64-sysv-openbsd/crt.s | 7+------
Alib/crt/common.mk | 8++++++++
Dlib/crt/gendep.sh | 25-------------------------
Mlib/scc/Makefile | 18++++++++----------
Mlib/scc/bpack.c | 15++++++++++++++-
Mlib/scc/bunpack.c | 2+-
Alib/scc/deps.mk | 18++++++++++++++++++
Mlib/scc/libdep.mk | 6+++---
Mlib/scc/lpack.c | 15++++++++++++++-
Mlib/scc/lunpack.c | 2+-
Mlib/scc/objlst.mk | 30+++++++++++++++---------------
Dlib/sys/Makefile | 14--------------
Dlib/sys/amd64-sysv-linux/Makefile | 4----
Dlib/sys/amd64-sysv-linux/syscall.lst | 11-----------
Dlib/sys/common.mk | 14--------------
Dlib/sys/i386-sysv-linux/Makefile | 3---
Dlib/sys/i386-sysv-linux/syscall.lst | 0
Dlib/sys/libsys.mk | 25-------------------------
Dlib/sys/qbe-linux/Makefile | 4----
Dlib/sys/qbe-linux/syscall.lst | 11-----------
Dlib/sys/z80-linux/Makefile | 3---
Dlib/sys/z80-linux/syscall.lst | 0
Mmkdep.sh | 18+++++++++++++-----
Mnm/Makefile | 21+++++----------------
Mnm/coff32.c | 9+++++----
Anm/deps.mk | 12++++++++++++
Mobjdump/Makefile | 14+++++++-------
Aobjdump/deps.mk | 4++++
Arootdir/bin/README | 1+
Arootdir/include/scc/assert.h | 9+++++++++
Arootdir/include/scc/bits/.gitignore | 1+
Arootdir/include/scc/bits/amd64-sysv/arch/limits.h | 18++++++++++++++++++
Arootdir/include/scc/bits/amd64-sysv/arch/setjmp.h | 1+
Rlib/c/include/bits/amd64-sysv/arch/stddef.h -> rootdir/include/scc/bits/amd64-sysv/arch/stddef.h | 0
Rlib/c/include/bits/amd64-sysv/arch/stdint.h -> rootdir/include/scc/bits/amd64-sysv/arch/stdint.h | 0
Arootdir/include/scc/bits/amd64-sysv/arch/stdio.h | 15+++++++++++++++
Rlib/c/include/bits/amd64-sysv/arch/stdlib.h -> rootdir/include/scc/bits/amd64-sysv/arch/stdlib.h | 0
Rlib/c/include/bits/amd64-sysv/arch/string.h -> rootdir/include/scc/bits/amd64-sysv/arch/string.h | 0
Rlib/c/include/bits/amd64-sysv/arch/time.h -> rootdir/include/scc/bits/amd64-sysv/arch/time.h | 0
Arootdir/include/scc/bits/i386-sysv/arch/limits.h | 18++++++++++++++++++
Rlib/c/include/bits/i386-sysv/arch/stddef.h -> rootdir/include/scc/bits/i386-sysv/arch/stddef.h | 0
Rlib/c/include/bits/i386-sysv/arch/stdint.h -> rootdir/include/scc/bits/i386-sysv/arch/stdint.h | 0
Arootdir/include/scc/bits/i386-sysv/arch/stdio.h | 15+++++++++++++++
Rlib/c/include/bits/i386-sysv/arch/stdlib.h -> rootdir/include/scc/bits/i386-sysv/arch/stdlib.h | 0
Rlib/c/include/bits/i386-sysv/arch/string.h -> rootdir/include/scc/bits/i386-sysv/arch/string.h | 0
Rlib/c/include/bits/i386-sysv/arch/time.h -> rootdir/include/scc/bits/i386-sysv/arch/time.h | 0
Arootdir/include/scc/bits/linux/sys/signal.h | 27+++++++++++++++++++++++++++
Arootdir/include/scc/bits/netbsd/sys/signal.h | 27+++++++++++++++++++++++++++
Arootdir/include/scc/bits/openbsd/sys/signal.h | 27+++++++++++++++++++++++++++
Arootdir/include/scc/bits/z80-dos/arch/limits.h | 18++++++++++++++++++
Rlib/c/include/bits/z80-dos/arch/stddef.h -> rootdir/include/scc/bits/z80-dos/arch/stddef.h | 0
Rlib/c/include/bits/z80-dos/arch/stdint.h -> rootdir/include/scc/bits/z80-dos/arch/stdint.h | 0
Arootdir/include/scc/bits/z80-dos/arch/stdio.h | 15+++++++++++++++
Rlib/c/include/bits/z80-dos/arch/stdlib.h -> rootdir/include/scc/bits/z80-dos/arch/stdlib.h | 0
Rlib/c/include/bits/z80-dos/arch/string.h -> rootdir/include/scc/bits/z80-dos/arch/string.h | 0
Rlib/c/include/bits/z80-dos/arch/time.h -> rootdir/include/scc/bits/z80-dos/arch/time.h | 0
Rlib/c/include/ctype.h -> rootdir/include/scc/ctype.h | 0
Arootdir/include/scc/errno.h | 10++++++++++
Arootdir/include/scc/float.h | 4++++
Arootdir/include/scc/limits.h | 8++++++++
Rlib/c/include/locale.h -> rootdir/include/scc/locale.h | 0
Arootdir/include/scc/math.h | 4++++
Arootdir/include/scc/setjmp.h | 11+++++++++++
Arootdir/include/scc/signal.h | 9+++++++++
Rlib/c/include/stdarg.h -> rootdir/include/scc/stdarg.h | 0
Arootdir/include/scc/stdbool.h | 9+++++++++
Rlib/c/include/stddef.h -> rootdir/include/scc/stddef.h | 0
Rlib/c/include/stdint.h -> rootdir/include/scc/stdint.h | 0
Rlib/c/include/stdio.h -> rootdir/include/scc/stdio.h | 0
Rlib/c/include/stdlib.h -> rootdir/include/scc/stdlib.h | 0
Arootdir/include/scc/string.h | 34++++++++++++++++++++++++++++++++++
Rlib/c/include/time.h -> rootdir/include/scc/time.h | 0
Arootdir/include/scc/wchar.h | 11+++++++++++
Arootdir/lib/scc/amd64-sysv-linux/README | 1+
Arootdir/lib/scc/amd64-sysv-netbsd/README | 1+
Arootdir/lib/scc/amd64-sysv-openbsd/README | 1+
Arootdir/lib/scc/i386-sysv-linux/README | 1+
Arootdir/lib/scc/i386-sysv-openbsd/README | 1+
Arootdir/lib/scc/z80-scc-none/README | 1+
Arootdir/libexec/scc/README | 1+
Mrules.mk | 34++++++++++++++++------------------
Dsystem.mk | 18------------------
Mtests/Makefile | 9+++++----
Dtests/ar/Makefile | 9---------
Dtests/ar/error/Makefile | 3---
Mtests/ar/execute/0001-append.sh | 4++--
Mtests/ar/execute/0002-append.sh | 4++--
Mtests/ar/execute/0003-append.sh | 4++--
Mtests/ar/execute/0004-append.sh | 4++--
Mtests/ar/execute/0005-append.sh | 4++--
Mtests/ar/execute/0006-append.sh | 4++--
Mtests/ar/execute/0007-delete.sh | 2+-
Mtests/ar/execute/0008-delete.sh | 2+-
Mtests/ar/execute/0009-delete.sh | 2+-
Mtests/ar/execute/0010-delete.sh | 2+-
Mtests/ar/execute/0011-delete.sh | 2+-
Mtests/ar/execute/0012-delete.sh | 2+-
Mtests/ar/execute/0013-print.sh | 5++---
Mtests/ar/execute/0014-print.sh | 5++---
Mtests/ar/execute/0015-print.sh | 4+---
Mtests/ar/execute/0016-print.sh | 5++---
Mtests/ar/execute/0017-print.sh | 4++--
Mtests/ar/execute/0018-list.sh | 2+-
Mtests/ar/execute/0019-list.sh | 2+-
Mtests/ar/execute/0020-list.sh | 3++-
Mtests/ar/execute/0021-list.sh | 3++-
Mtests/ar/execute/0022-list.sh | 2+-
Mtests/ar/execute/0023-extract.sh | 4++--
Mtests/ar/execute/0024-extract.sh | 3+--
Mtests/ar/execute/0025-extract.sh | 4++--
Mtests/ar/execute/0026-extract.sh | 4++--
Mtests/ar/execute/0027-extract.sh | 3+--
Mtests/ar/execute/0029-move.sh | 6++----
Mtests/ar/execute/0030-move.sh | 6++----
Mtests/ar/execute/0031-move.sh | 6++----
Mtests/ar/execute/0032-update.sh | 4++--
Mtests/ar/execute/0033-update.sh | 4++--
Mtests/ar/execute/0034-update.sh | 4++--
Mtests/ar/execute/0035-update.sh | 4++--
Mtests/ar/execute/0036-update.sh | 4++--
Mtests/ar/execute/0037-update.sh | 4++--
Mtests/ar/execute/0038-update.sh | 4++--
Mtests/ar/execute/Makefile | 4++--
Mtests/ar/execute/chktest.sh | 9+++------
Mtests/ar/execute/mkmaster.sh | 2+-
Atests/as/execute/Makefile | 12++++++++++++
Atests/as/execute/chktest.sh | 12++++++++++++
Atests/as/execute/i286.s | 150+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/as/execute/test.sh | 43+++++++++++++++++++++++++++++++++++++++++++
Atests/as/execute/z80.s | 1588+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/libc/execute/0001-abort.c | 27+++++++++++++++++++++++++++
Atests/libc/execute/0002-assert.c | 35+++++++++++++++++++++++++++++++++++
Atests/libc/execute/0003-assert.c | 27+++++++++++++++++++++++++++
Atests/libc/execute/0004-abort.c | 21+++++++++++++++++++++
Atests/libc/execute/0005-ctype.c | 572+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/libc/execute/0006-limits.c | 183+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/libc/execute/0007-signal.c | 168+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/libc/execute/0008-longjmp.c | 45+++++++++++++++++++++++++++++++++++++++++++++
Atests/libc/execute/0009-stdarg.c | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/libc/execute/0010-stddef.c | 43+++++++++++++++++++++++++++++++++++++++++++
Atests/libc/execute/Makefile | 13+++++++++++++
Atests/libc/execute/cc.sh | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/libc/execute/chktest.sh | 21+++++++++++++++++++++
Atests/libc/execute/libc-tests.lst | 10++++++++++
Dtests/nm/Makefile | 9---------
Mtests/nm/execute/0001-z80.sh | 2+-
Mtests/nm/execute/0002-z80-u.sh | 2+-
Mtests/nm/execute/0003-z80-g.sh | 2+-
Mtests/nm/execute/0004-z80-v.sh | 2+-
Mtests/nm/execute/0005-z80-A.sh | 2+-
Mtests/nm/execute/0006-z80-o.sh | 2+-
Mtests/nm/execute/0007-z80-d.sh | 2+-
Mtests/nm/execute/0008-z80-x.sh | 2+-
Mtests/nm/execute/0009-z80-P-o.sh | 2+-
Mtests/nm/execute/0010-z80-P-d.sh | 2+-
Mtests/nm/execute/0011-z80-P-x.sh | 2+-
Mtests/nm/execute/Makefile | 5++---
Mtests/nm/execute/chktest.sh | 12++++--------
Dtests/scc/Makefile | 7-------
Mtests/scc/error/Makefile | 5+++--
Mtests/scc/error/chktest.sh | 10+++++-----
Mtests/scc/execute/0137-int-cast.c | 134-------------------------------------------------------------------------------
Mtests/scc/execute/0141-int-iden.c | 14+++++++++++---
Dtests/scc/execute/0154-if-defined | 15---------------
Atests/scc/execute/0154-if-defined.c | 15+++++++++++++++
Mtests/scc/execute/0172-hexa.c | 15+++++++++------
Atests/scc/execute/0179-sizeof.c | 7+++++++
Atests/scc/execute/0180-incomplete.c | 14++++++++++++++
Atests/scc/execute/0181-stringize.c | 17+++++++++++++++++
Mtests/scc/execute/Makefile | 4+++-
Mtests/scc/execute/chktest.sh | 23+++++++++++++----------
Mtests/scc/execute/scc-tests.lst | 33++++++++++++++++++---------------
361 files changed, 7148 insertions(+), 3265 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,23 +1,23 @@ *.o *.a -bin/ -cc1/cc1-* +rootdir/libexec/scc/cc1-* +rootdir/libexec/scc/cc2-* +rootdir/libexec/scc/as-* +rootdir/bin/ld +rootdir/bin/scc +rootdir/bin/scpp +rootdir/bin/ar +rootdir/bin/nm +rootdir/bin/objdump test.log -cc2/cc2-* cc2/error.h -as/as-* -driver/posix/scc -makefile instbl.c config.mk inc/ldflags.h inc/sysincludes.h inc/syslibs.h +inc/syscrts.h driver/posix/config.h -driver/posix/cpp -rootdir/ -ar/ar-* -nm/nm -objdump/objdump as/target/*/*tbl.c *.out +config diff --git a/Makefile b/Makefile @@ -7,25 +7,28 @@ include rules.mk DIRS = inc cc1 cc2 driver lib as ar nm objdump ld -all: - $(FORALL) +all: $(DIRS) -clean: - $(FORALL) - rm -rf rootdir +$(DIRS): config FORCE + +@cd $@ && $(MAKE) all -distclean: - touch config.mk # we need config.mk for makes in $DIRS - find . -name makefile | xargs rm -f +clean dep: $(FORALL) - rm -rf rootdir - rm -f config.mk -dep: config.mk +distclean: unconfig $(FORALL) + rm -f config tests: all - +cd tests && $(MAKE) -e all + +@cd tests && $(MAKE) -e all + +unconfig: + (echo '/^### Systems/,$$ v/^#/ s/^/#/' ; echo w) | ed -s config.mk + rm -f config + +config: + ./config.sh + touch $@ install: all mkdir -p $(DESTDIR)$(PREFIX)/ diff --git a/README b/README @@ -1,13 +1,14 @@ -Derivations from standard C +Deviations from standard C =========================== -This compiler is aimed to be being fully compatible with the C99 standard, but +This compiler aims to be fully compatible with the C99 standard, but it will have some differences: - Type qualifiers are accepted but ignored. ----------------------------------------- -Type qualifers make the type system ugly, and their uselessness add +Type qualifiers make the type system ugly, and their uselessness adds unnecessary complexity to the compiler (and increased compilation time): + - const: The definition of const is not clear in the standard. If a const value is modified the behaviour is undefined behaviour. It seems it was defined in order to be able to @@ -22,15 +23,17 @@ unnecessary complexity to the compiler (and increased compilation time): or variables whose values are modified asynchronously. This can be achieved with special pragma values though. In the first case, it generates a lot of problems with modern - processors and multithreading, where not holding the value in a + processors and multithreading, when not holding the value in a register is not good enough (an explicit memory barrier is needed). In the second case, this is non-portable code by definition (depending on the register mapped), so it is better to deal with it using another solution (compiler extensions or direct - assembler). + assembly). Since it is needed for the correct behaviour + of portable programs that use longjmp, this specifier eventually + will be implemented. - - restrict: This qualifer can only be applied to pointers to - mark that the pointed object has no other alias. This qualifer + - restrict: This qualifier can only be applied to pointers to + mark that the pointed object has no other alias. This qualifier was introduced to be able to fix some performance problems in numerical algorithms, where FORTRAN could achieve a better performance (and in fact even with this specifier FORTRAN has a @@ -46,7 +49,7 @@ like: int f(int (int)); -Accepting function types in typenames (or abstract declarators) makes the +Accepting function types in type names (or abstract declarators) makes the grammar ambiguous because it is impossible to differentiate between: (int (f)) -> function returning int with one parameter of type f @@ -76,7 +79,7 @@ way of writing such code). C89 allows the definition of variables with incomplete type that have external linkage and file scope. The type of the variable is the composition of all the definitions find in the file. The exact -rules are a bit complex (3.7.2), and SCC ignores them at this moment +rules are a bit complex (3.7.2) so SCC ignores them at this moment and it does not allow any definition of variables with incomplete type. If you don't believe me try this code: @@ -86,3 +89,15 @@ struct foo x; struct foo { int i; }; + +- Variadic function alike macros + ------------------------------ + +The standard (C99 6.10.3 c 4) forces to pass more parameters than +the number of parameters present in the variadic argument list +(excluding ...). Scc accepts a parameter list with the same number +of arguments. + +#define P(a, ...) a + +P(1) diff --git a/ar/Makefile b/ar/Makefile @@ -2,25 +2,21 @@ PROJECTDIR = .. include $(PROJECTDIR)/rules.mk -include $(LIBDIR)/libdep.mk +include $(LIBSCC)/libdep.mk -OBJ = main.o $(DRIVER)/driver.o -MOREFLAGS = -I$(DRIVER) +OBJ = main.o $(DRIVER)/driver.o +MORECFLAGS = -I$(DRIVER) +STDCFLAGS = -all: ar-$(DRIVER) - cp ar-$(DRIVER) $(PROJECTDIR)/rootdir/bin/ar +all: $(BINDIR)/ar -ar-$(DRIVER): $(OBJ) $(LIBDIR)/libscc.a +$(BINDIR)/ar: $(OBJ) $(LIBDIR)/libscc.a $(CC) $(SCC_LDFLAGS) $(OBJ) -lscc -o $@ -main.o: $(PROJECTDIR)/inc/scc.h $(PROJECTDIR)/inc/ar.h - -$(DRIVER)/driver.o: $(DRIVER)/driver.h - -main.o: $(DRIVER)/driver.h - dep: + $(PROJECTDIR)/mkdep.sh + clean: - rm -f ar-* *.o $(DRIVER)/*.o + rm -f *.o $(DRIVER)/*.o $(BINDIR)/ar -distclean: clean +include deps.mk diff --git a/ar/deps.mk b/ar/deps.mk @@ -0,0 +1,7 @@ +main.o: $(DRIVER)/driver.h + +#deps +main.o: ../inc/ar.h +main.o: ../inc/arg.h +main.o: ../inc/scc.h +posix/driver.o: posix/driver.h diff --git a/ar/main.c b/ar/main.c @@ -50,10 +50,17 @@ cleanup(void) } } +/* + * I do know that you cannot call remove from a signal handler + * but we only can use stdio function to deal with files + * because we are C99 compliant, and it is very likely that + * remove is going to work in this case + */ static void sigfun(int signum) { - exit(1); + cleanup(); + _Exit(1); } static FILE * @@ -609,6 +616,8 @@ main(int argc, char *argv[]) lflag = 1; break; case 'u': + /* TODO */ + abort(); uflag = 1; break; default: diff --git a/as/Makefile b/as/Makefile @@ -2,30 +2,28 @@ PROJECTDIR = .. include $(PROJECTDIR)/rules.mk -include $(LIBDIR)/libdep.mk +include $(LIBSCC)/libdep.mk OBJ = main.o symbol.o ins.o parser.o expr.o myro.o -HDR = $(PROJECTDIR)/inc/scc.h as.h -MOREFLAGS = -I$(PROJECTDIR)/inc/$(STD) $(AS_CFLAGS) +MORECFLAGS = -I$(INCLUDE)/$(STD) +TARGETS = $(LIBEXEC)/as-amd64 $(LIBEXEC)/as-i386 \ + $(LIBEXEC)/as-i286 $(LIBEXEC)/as-z80 -all: +all: $(TARGETS) -$(OBJ): $(HDR) - -as: $(OBJ) - $(CC) $(SCC_LDFLAGS) $(OBJ) -lscc -o $@ - -myro.o: $(PROJECTDIR)/inc/myro.h +$(TARGETS): $(LIBDIR)/libscc.a dep: - ./gendep.sh $(TARGETS) + $(PROJECTDIR)/mkdep.sh clean: rm -f *.o target/*/*.o rm -f target/*/*tbl.c rm -f as-* - rm -f *.log - -distclean: clean - rm -f makefile + rm -f $(TARGETS) +include target/amd64.mk +include target/i386.mk +include target/i286.mk +include target/z80.mk +include deps.mk diff --git a/as/as.h b/as/as.h @@ -41,9 +41,9 @@ enum common_args { ADIRECT, AREG_OFF, ASYM, + AOPT, + AREP, AMAX, - AOPT = 64, - AREP = 128, }; enum tokens { diff --git a/as/deps.mk b/as/deps.mk @@ -0,0 +1,46 @@ +parser.o: $(PROJECTDIR)/inc/$(STD)/cstd.h + +#deps +expr.o: ../inc/scc.h +expr.o: as.h +ins.o: ../inc/scc.h +ins.o: as.h +main.o: ../inc/arg.h +main.o: ../inc/scc.h +main.o: as.h +myro.o: ../inc/myro.h +myro.o: ../inc/scc.h +myro.o: as.h +parser.o: ../inc/scc.h +parser.o: as.h +symbol.o: ../inc/scc.h +symbol.o: as.h +target/x80/ins.o: target/x80/../../../inc/scc.h +target/x80/ins.o: target/x80/../../as.h +target/x80/ins.o: target/x80/proc.h +target/x80/z80.o: target/x80/../../../inc/scc.h +target/x80/z80.o: target/x80/../../as.h +target/x80/z80.o: target/x80/../x80/proc.h +target/x80/z80tbl.o: target/x80/../../../inc/scc.h +target/x80/z80tbl.o: target/x80/../../as.h +target/x80/z80tbl.o: target/x80/../x80/proc.h +target/x86/amd64.o: target/x86/../../../inc/scc.h +target/x86/amd64.o: target/x86/../../as.h +target/x86/amd64tbl.o: target/x86/../../../inc/scc.h +target/x86/amd64tbl.o: target/x86/../../as.h +target/x86/amd64tbl.o: target/x86/../x86/proc.h +target/x86/i286.o: target/x86/../../../inc/scc.h +target/x86/i286.o: target/x86/../../as.h +target/x86/i286.o: target/x86/../x86/proc.h +target/x86/i286tbl.o: target/x86/../../../inc/scc.h +target/x86/i286tbl.o: target/x86/../../as.h +target/x86/i286tbl.o: target/x86/../x86/proc.h +target/x86/i386.o: target/x86/../../../inc/scc.h +target/x86/i386.o: target/x86/../../as.h +target/x86/i386.o: target/x86/../x86/proc.h +target/x86/i386tbl.o: target/x86/../../../inc/scc.h +target/x86/i386tbl.o: target/x86/../../as.h +target/x86/i386tbl.o: target/x86/../x86/proc.h +target/x86/ins.o: target/x86/../../../inc/scc.h +target/x86/ins.o: target/x86/../../as.h +target/x86/ins.o: target/x86/proc.h diff --git a/as/gendep.sh b/as/gendep.sh @@ -1,27 +0,0 @@ -#!/bin/sh - -set -e - -rm -f makefile -trap "rm -f $$.mk" 0 2 3 - -re='\([^-]*\)-\([^-]*\)-\([^-]*\)-\([^-]*\)' - -echo $@ | -tr ' ' '\n' | -sed "s/$re/\1/" | -sort -u | -(cat Makefile -while read i -do - cat <<EOF -include target/$i.mk - -\$(OBJ-$i): \$(HDR) -all: as-$i -OBJ-$i: \$(HDR) -as-$i: \$(OBJ-$i) \$(LIBDIR)/libscc.a - \$(CC) \$(SCC_LDFLAGS) \$(OBJ-$i) -lscc -o \$@ - -EOF -done) > $$.mk && mv $$.mk makefile diff --git a/as/gentbl.awk b/as/gentbl.awk @@ -3,14 +3,13 @@ BEGIN { printf "#include \"../../../inc/scc.h\"\n"\ "#include \"../../as.h\"\n"\ "#include \"../" family "/proc.h\"\n" - nop = 0; nvar = 0 rules = "target/" family "/rules.dat" while (getline < rules > 0) { regex[++nregs] = $1 value[nregs] = $2 } - close("target/rules.awk") + close(rules) } {sub(/#.*/,"")} @@ -77,6 +76,12 @@ function str2args(s, args, i, j, out, n, found) for (i = 1; i <= n; i++) { a = args[i] found = 0 + + if (a ~ /\?$/) + out = out "AOPT ," + else if (a ~ /\+$/) + out = out "AREP ," + for (j = 1; j <= nregs; j++) { if (match(a, "^" regex[j])) { out = out value[j] @@ -92,11 +97,9 @@ function str2args(s, args, i, j, out, n, found) } a = substr(a, RLENGTH+1) - if (a ~ /^\+$/) { - return out "|AREP" - } else if (a ~ /^\?$/) { - return out "|AOPT" - } else if (a != "") { + sub(/\?$/, "", a) + sub(/\+$/, "", a) + if (a != "") { print FILENAME ":" NR ":" \ $0 ": trailing chars: ", a > "/dev/stderr" exit 1 diff --git a/as/gentbl.sh b/as/gentbl.sh @@ -28,6 +28,6 @@ rm -f $$.c target/$family/${cpu}tbl.c trap "rm -f $$.c" 0 2 3 awk '!/^$/ {print $1,NR,$2,$3,$4,$5,$6}' target/$family/$family.dat | -sort -k1 -k2n | +LC_COLLATE=C sort -k1 -k2n | awk -v cpu=`echo $cpu | tr a-z A-Z` -v family=$family -f gentbl.awk > $$.c && mv $$.c target/$family/${cpu}tbl.c diff --git a/as/ins.c b/as/ins.c @@ -247,14 +247,3 @@ include(Op *op, Node **args) { addinput(args[0]->sym->name.buf); } - -void -att(Op *op, Node **args) -{ - Symbol *sym = args[0]->sym; - extern int left2right; - - if ((sym->flags & FABS) == 0) - error("align expression is not an absolute expression"); - left2right = sym->value; -} diff --git a/as/main.c b/as/main.c @@ -105,7 +105,6 @@ int main(int argc, char *argv[]) { char **p; - extern int left2right; outfile = "a.out"; @@ -113,12 +112,6 @@ main(int argc, char *argv[]) case 'o': outfile = EARGF(usage()); break; - case 'l': - left2right = 1; - break; - case 'r': - left2right = 0; - break; default: usage(); } ARGEND diff --git a/as/parser.c b/as/parser.c @@ -300,24 +300,14 @@ Node ** getargs(char *s) { Node **ap; - extern int left2right; - static Node *args[NARGS+1]; + static Node *args[NARGS]; if (!s) return NULL; - if (!left2right) { - ap = args; - do { - if ((*ap = operand(&s)) == NULL) - return args; - } while (++ap < &args[NARGS]); - } else { - ap = &args[NARGS]; - do { - if ((*--ap = operand(&s)) == NULL) - return ap+1; - } while (ap > args+1); + for (ap = args; ap < &args[NARGS-1]; ++ap) { + if ((*ap = operand(&s)) == NULL) + return args; } error("too many arguments in one instruction"); } diff --git a/as/target/amd64.mk b/as/target/amd64.mk @@ -1,9 +1,8 @@ -amd64_LST = target/x86/amd64tbl.o target/x86/amd64.o target/x86/ins.o - -$(amd64_LST): target/x86/proc.h +AMD64_OBJ = $(OBJ) target/x86/amd64tbl.o target/x86/amd64.o target/x86/ins.o target/x86/amd64tbl.c: gentbl.awk target/x86/x86.dat target/x86/rules.dat ./gentbl.sh -f x86 -c amd64 -OBJ-amd64 = $(OBJ) $(amd64_LST) +$(LIBEXEC)/as-amd64: $(AMD64_OBJ) + $(CC) $(SCC_LDFLAGS) $(AMD64_OBJ) -lscc -o $@ diff --git a/as/target/i286.mk b/as/target/i286.mk @@ -0,0 +1,8 @@ + +I286_OBJ = $(OBJ) target/x86/i286tbl.o target/x86/i286.o target/x86/ins.o + +target/x86/i286tbl.c: gentbl.awk target/x86/x86.dat target/x86/rules.dat + ./gentbl.sh -f x86 -c i286 + +$(LIBEXEC)/as-i286: $(I286_OBJ) + $(CC) $(SCC_LDFLAGS) $(I286_OBJ) -lscc -o $@ diff --git a/as/target/i386.mk b/as/target/i386.mk @@ -1,9 +1,8 @@ -i386_LST = target/x86/i386tbl.o target/x86/i386.o target/x86/ins.o - -$(i386_LST): target/x86/proc.h +I386_OBJ = $(OBJ) target/x86/i386tbl.o target/x86/i386.o target/x86/ins.o target/x86/i386tbl.c: gentbl.awk target/x86/x86.dat target/x86/rules.dat ./gentbl.sh -f x86 -c i386 -OBJ-i386 = $(OBJ) $(i386_LST) +$(LIBEXEC)/as-i386: $(I386_OBJ) + $(CC) $(SCC_LDFLAGS) $(I386_OBJ) -lscc -o $@ diff --git a/as/target/x80/ins.c b/as/target/x80/ins.c @@ -68,20 +68,26 @@ int match(Op *op, Node **args) { unsigned char *p; - int arg, class; + int arg, class, rep, opt; Node *np; if (!op->args) return args == NULL; + opt = rep = 0; for (p = op->args; arg = *p; ++p) { - if (arg & AREP) + if (rep) --p; if ((np = *args++) == NULL) - return (arg & (AREP|AOPT)) != 0; + return (rep|opt) != 0; - arg &= ~(AREP|AOPT); switch (arg) { + case AOPT: + opt = 1; + break; + case AREP: + rep = 1; + break; case AINDER_C: arg = AREG_C; goto indirect; diff --git a/as/target/x80/proc.h b/as/target/x80/proc.h @@ -63,7 +63,7 @@ enum args { ARST, /* 0h, 08h, 10h, 18h, 20h, 28h, 30h, 38h */ }; -enum { +enum class { RCLASS = 1 << 0, PCLASS = 1 << 1, QCLASS = 1 << 2, diff --git a/as/target/x80/x80.dat b/as/target/x80/x80.dat @@ -33,7 +33,6 @@ .STRING string+ 0 none string Z80,R800,GB80 .ASCII string+ 0 none ascii Z80,R800,GB80 .ALIGN imm16+ 0 none align Z80,R800,GB80 -.ATT imm8 0 none att Z80,R800,GB80 .END none 0 none end Z80,R800,GB80 .INCLUDE string 0 none include Z80,R800,GB80 @@ -72,11 +71,23 @@ LD (IY+n),imm8 4 0xfd,0x36 idx Z80,R800 LD A,(BC) 1 0x0a noargs Z80,R800,GB80 LD A,(DE) 1 0x1a noargs Z80,R800,GB80 -LD A,(n) 3 0x3a dir Z80,R800,GB80 +LD A,(n) 3 0x3a dir Z80,R800 LD (BC),A 1 0x2 noargs Z80,R800,GB80 LD (DE),A 1 0x12 noargs Z80,R800,GB80 -LD (n),A 3 0x32 dir Z80,R800,GB80 +LD (n),A 3 0x32 dir Z80,R800 + +LD A,(n) 3 0xfa dir GB80 +LD A,(HL+) 1 0x2a ld8 GB80 #TODO +LD A,(HL-) 1 0x3a ld8 GB80 #TODO +LD A,($FF00+n) 2 0xf0 dir GB80 #TODO +LD A,($FF00+C) 2 0xf2 dir GB80 #TODO + +LD (n),A 3 0xea dir GB80 +LD (HL+),A 1 0x22 ld8 GB80 #TODO +LD (HL-),A 1 0x32 ld8 GB80 #TODO +LD ($FF00+n),A 2 0xe0 dir GB80 #TODO +LD ($FF00+C),A 2 0xe2 dir GB80 #TODO LD A,I 2 0xed,0x57 noargs Z80,R800 LD A,R 2 0xed,0x5f noargs Z80,R800 @@ -188,6 +199,9 @@ DEC (HL) 1 0x35 alu8 Z80,R800,GB80 DEC (IX+n) 3 0xdd,0x35 alu8 Z80,R800 DEC (IY+n) 3 0xfd,0x35 alu8 Z80,R800 +ADD SP,dd 2 0xE8 alu8 GB80 +LD HL,SP+imm8 2 0xF8 alu8 GB80 + # 16 bit ALU group ADD HL,dd 1 0x09 alu16 Z80,R800,GB80 ADC HL,dd 2 0xed,0x4a alu16 Z80,R800 @@ -211,6 +225,7 @@ CCF none 1 0x3f noargs Z80,R800,GB80 SCF none 1 0x37 noargs Z80,R800,GB80 NOP none 1 0x00 noargs Z80,R800,GB80 HALT none 1 0x76 noargs Z80,R800,GB80 +STOP none 2 0x10,0x00 noargs GB80 DI none 1 0xf3 noargs Z80,R800,GB80 EI none 1 0xfb noargs Z80,R800,GB80 IM imm8 2 0xed,0x46 im Z80,R800 @@ -242,41 +257,44 @@ RRA none 1 0x1f noargs Z80,R800,GB80 RLD none 2 0xed,0x6f noargs Z80,R800 RRD none 2 0xed,0x67 noargs Z80,R800 -RLC r 2 0xcb,0x00 rot_bit Z80,R800 -RLC (HL) 2 0xcb,0x06 rot_bit Z80,R800 +RLC r 2 0xcb,0x00 rot_bit Z80,R800,GB80 +RLC (HL) 2 0xcb,0x06 rot_bit Z80,R800,GB80 RLC (IX+n) 4 0xdd,0xcb,0,0x06 rot_bit Z80,R800 RLC (IY+n) 4 0xfd,0xcb,0,0x06 rot_bit Z80,R800 RLC (IX+n),r 4 0xdd,0xcb,0,0x00 rot_bit Z80,R800 RLC (IY+n),r 4 0xfd,0xcb,0,0x00 rot_bit Z80,R800 -RL r 2 0xcb,0x10 rot_bit Z80,R800 -RL (HL) 2 0xcb,0x16 rot_bit Z80,R800 +RL r 2 0xcb,0x10 rot_bit Z80,R800,GB80 +RL (HL) 2 0xcb,0x16 rot_bit Z80,R800,GB80 RL (IX+n) 4 0xdd,0xcb,0,0x16 rot_bit Z80,R800 RL (IY+n) 4 0xfd,0xcb,0,0x16 rot_bit Z80,R800 RL (IX+n),r 4 0xdd,0xcb,0,0x10 rot_bit Z80,R800 RL (IY+n),r 4 0xfd,0xcb,0,0x10 rot_bit Z80,R800 -RRC r 2 0xcb,0x08 rot_bit Z80,R800 -RRC (HL) 2 0xcb,0x0e rot_bit Z80,R800 +RRC r 2 0xcb,0x08 rot_bit Z80,R800,GB80 +RRC (HL) 2 0xcb,0x0e rot_bit Z80,R800,GB80 RRC (IX+n) 4 0xdd,0xcb,0,0x0e rot_bit Z80,R800 RRC (IY+n) 4 0xfd,0xcb,0,0x0e rot_bit Z80,R800 RRC (IX+n),r 4 0xdd,0xcb,0,0x08 rot_bit Z80,R800 RRC (IY+n),r 4 0xfd,0xcb,0,0x08 rot_bit Z80,R800 -RR r 2 0xcb,0x18 rot_bit Z80,R800 -RR (HL) 2 0xcb,0x1e rot_bit Z80,R800 +RR r 2 0xcb,0x18 rot_bit Z80,R800,GB80 +RR (HL) 2 0xcb,0x1e rot_bit Z80,R800,GB80 RR (IX+n) 4 0xdd,0xcb,0,0x1e rot_bit Z80,R800 RR (IY+n) 4 0xfd,0xcb,0,0x1e rot_bit Z80,R800 RR (IX+n),r 4 0xdd,0xcb,0,0x18 rot_bit Z80,R800 RR (IY+n),r 4 0xfd,0xcb,0,0x18 rot_bit Z80,R800 -SLA r 2 0xcb,0x20 rot_bit Z80,R800 -SLA (HL) 2 0xcb,0x26 rot_bit Z80,R800 +SLA r 2 0xcb,0x20 rot_bit Z80,R800,GB80 +SLA (HL) 2 0xcb,0x26 rot_bit Z80,R800,GB80 SLA (IX+n) 4 0xdd,0xcb,0,0x26 rot_bit Z80,R800 SLA (IY+n) 4 0xfd,0xcb,0,0x26 rot_bit Z80,R800 SLA (IX+n),r 4 0xdd,0xcb,0,0x20 rot_bit Z80,R800 SLA (IY+n),r 4 0xfd,0xcb,0,0x20 rot_bit Z80,R800 +SWAP r 2 0xcb,0x30 rot_bit GB80 +SWAP (HL) 2 0xcb,0x36 rot_bit GB80 + SLL r 2 0xcb,0x30 rot_bit Z80 SLL (HL) 2 0xcb,0x36 rot_bit Z80 SLL (IX+n) 4 0xdd,0xcb,0,0x36 rot_bit Z80 @@ -284,35 +302,35 @@ SLL (IY+n) 4 0xfd,0xcb,0,0x36 rot_bit Z80 SLL (IX+n),r 4 0xdd,0xcb,0,0x30 rot_bit Z80 SLL (IY+n),r 4 0xfd,0xcb,0,0x30 rot_bit Z80 -SRA r 2 0xcb,0x28 rot_bit Z80,R800 -SRA (HL) 2 0xcb,0x2e rot_bit Z80,R800 +SRA r 2 0xcb,0x28 rot_bit Z80,R800,GB80 +SRA (HL) 2 0xcb,0x2e rot_bit Z80,R800,GB80 SRA (IX+n) 4 0xdd,0xcb,0,0x2e rot_bit Z80,R800 SRA (IY+n) 4 0xfd,0xcb,0,0x2e rot_bit Z80,R800 SRA (IX+n),r 4 0xdd,0xcb,0,0x28 rot_bit Z80,R800 SRA (IY+n),r 4 0xfd,0xcb,0,0x28 rot_bit Z80,R800 -SRL r 2 0xcb,0x38 rot_bit Z80,R800 -SRL (HL) 2 0xcb,0x3e rot_bit Z80,R800 +SRL r 2 0xcb,0x38 rot_bit Z80,R800,GB80 +SRL (HL) 2 0xcb,0x3e rot_bit Z80,R800,GB80 SRL (IX+n) 4 0xdd,0xcb,0,0x3e rot_bit Z80,R800 SRL (IY+n) 4 0xfd,0xcb,0,0x3e rot_bit Z80,R800 SRL (IX+n),r 4 0xdd,0xcb,0,0x38 rot_bit Z80,R800 SRL (IY+n),r 4 0xfd,0xcb,0,0x38 rot_bit Z80,R800 # Bit manipulation group -BIT imm3,r 2 0xcb,0x40 rot_bit Z80,R800 +BIT imm3,r 2 0xcb,0x40 rot_bit Z80,R800,GB80 BIT imm3,(HL) 2 0xcb,0x46 rot_bit Z80,R800 BIT imm3,(IX+n) 4 0xdd,0xcb,0,0x46 rot_bit Z80,R800 BIT imm3,(IY+n) 4 0xfd,0xcb,0,0x46 rot_bit Z80,R800 -SET imm3,r 2 0xcb,0xc0 rot_bit Z80,R800 -SET imm3,(HL) 2 0xcb,0xc6 rot_bit Z80,R800 +SET imm3,r 2 0xcb,0xc0 rot_bit Z80,R800,GB80 +SET imm3,(HL) 2 0xcb,0xc6 rot_bit Z80,R800,GB80 SET imm3,(IX+n) 4 0xdd,0xcb,0,0xc6 rot_bit Z80,R800 SET imm3,(IY+n) 4 0xfd,0xcb,0,0xc6 rot_bit Z80,R800 SET imm3,(IX+n),r 4 0xdd,0xcb,0,0xc0 rot_bit Z80,R800 SET imm3,(IY+n),r 4 0xfd,0xcb,0,0xc0 rot_bit Z80,R800 -RES imm3,r 2 0xcb,0x80 rot_bit Z80,R800 -RES imm3,(HL) 2 0xcb,0x86 rot_bit Z80,R800 +RES imm3,r 2 0xcb,0x80 rot_bit Z80,R800,GB80 +RES imm3,(HL) 2 0xcb,0x86 rot_bit Z80,R800,GB80 RES imm3,(IX+n) 4 0xdd,0xcb,0,0x86 rot_bit Z80,R800 RES imm3,(IY+n) 4 0xfd,0xcb,0,0x86 rot_bit Z80,R800 RES imm3,(IX+n),r 4 0xdd,0xcb,0,0x80 rot_bit Z80,R800 @@ -340,16 +358,17 @@ JP imm16 3 0xc3 jp Z80,R800,GB80 JP cc,imm16 3 0xc2 jp Z80,R800,GB80 JR imm16 2 0x18 jr Z80,R800,GB80 JR ss,imm16 2 0x00 jr Z80,R800,GB80 -JP (HL) 1 0xe9 jp Z80,R800,GB80 -JP (IX) 2 0xdd,0xe9 jp Z80,R800 -JP (IY) 2 0xfd,0xe9 jp Z80,R800 -DJNZ imm16 2 0x10 jr Z80,R800,GB80 +JP HL 1 0xe9 noargs Z80,R800,GB80 +JP IX 2 0xdd,0xe9 noargs Z80,R800 +JP IY 2 0xfd,0xe9 noargs Z80,R800 +DJNZ imm16 2 0x10 jr Z80,R800 # Call and return group CALL imm16 3 0xcd jp Z80,R800,GB80 -CALL cc,imm16 3 0xc4 jp Z80,R800 +CALL cc,imm16 3 0xc4 jp Z80,R800,GB80 RET none 1 0xc9 noargs Z80,R800,GB80 -RET cc 1 0xc0 jp Z80,R800 +RET cc 1 0xc0 jp Z80,R800,GB80 RETI none 2 0xed,0x4d noargs Z80,R800 +RETI none 1 0xd9 noargs GB80 RETN none 2 0xed,0x45 noargs Z80,R800 RST rst 1 0xc7 rst Z80,R800,GB80 diff --git a/as/target/x80/z80-test.s b/as/target/x80/z80-test.s @@ -1,1588 +0,0 @@ - NOP / 00 - LD BC,$64 / 01 40 00 - LD (BC),A / 02 - INC BC / 03 - INC B / 04 - DEC B / 05 - LD B,$32 / 06 20 - RLCA / 07 - EX AF,AF' / 08 - ADD HL,BC / 09 - LD A,(BC) / 0A - DEC BC / 0B - INC C / 0C - DEC C / 0D - LD C,$64 / 0E 40 - RRCA / 0F -L1: DJNZ $L1 / 10 02 - LD DE,$32 / 11 20 00 - LD (DE),A / 12 - INC DE / 13 - INC D / 14 - DEC D / 15 - LD D,$64 / 16 40 - RLA / 17 -L2: JR $L2 / 18 02 - ADD HL,DE / 19 - LD A,(DE) / 1A - DEC DE / 1B - INC E / 1C - DEC E / 1D - LD E,$64 / 1E 40 - RRA / 1F -L3: JR NZ,$L3 / 20 02 - LD HL,$32 / 21 20 00 - LD (32768),HL / 22 00 80 - INC HL / 23 - INC H / 24 - DEC H / 25 - LD H,$64 / 26 40 - DAA / 27 -L4: JR Z,$L4 / 28 02 - ADD HL,HL / 29 - LD HL,(16384) / 2A 00 40 - DEC HL / 2B - INC L / 2C - DEC L / 2D - LD L,$32 / 2E 20 - CPL / 2F -L5: JR NC,$L5 / 30 02 - LD SP,$64 / 31 40 00 - LD (32768),A / 32 00 80 - INC SP / 33 - INC (HL) / 34 - DEC (HL) / 35 - LD (HL),$32 / 36 20 - SCF / 37 -L6: JR C,$L6 / 38 02 - ADD HL,SP / 39 - LD A,(16384) / 3A 00 40 - DEC SP / 3B - INC A / 3C - DEC A / 3D - LD A,$32 / 3E 20 - CCF / 3F - LD B,B / 40 - LD B,C / 41 - LD B,D / 42 - LD B,E / 43 - LD B,H / 44 - LD B,L / 45 - LD B,(HL) / 46 - LD B,A / 47 - LD C,B / 48 - LD C,C / 49 - LD C,D / 4A - LD C,E / 4B - LD C,H / 4C - LD C,L / 4D - LD C,(HL) / 4E - LD C,A / 4F - LD D,B / 50 - LD D,C / 51 - LD D,D / 52 - LD D,E / 53 - LD D,H / 54 - LD D,L / 55 - LD D,(HL) / 56 - LD D,A / 57 - LD E,B / 58 - LD E,C / 59 - LD E,D / 5A - LD E,E / 5B - LD E,H / 5C - LD E,L / 5D - LD E,(HL) / 5E - LD E,A / 5F - LD H,B / 60 - LD H,C / 61 - LD H,D / 62 - LD H,E / 63 - LD H,H / 64 - LD H,L / 65 - LD H,(HL) / 66 - LD H,A / 67 - LD L,B / 68 - LD L,C / 69 - LD L,D / 6A - LD L,E / 6B - LD L,H / 6C - LD L,L / 6D - LD L,(HL) / 6E - LD L,A / 6F - LD (HL),B / 70 - LD (HL),C / 71 - LD (HL),D / 72 - LD (HL),E / 73 - LD (HL),H / 74 - LD (HL),L / 75 - HALT / 76 - LD (HL),A / 77 - LD A,B / 78 - LD A,C / 79 - LD A,D / 7A - LD A,E / 7B - LD A,H / 7C - LD A,L / 7D - LD A,(HL) / 7E - LD A,A / 7F - ADD A,B / 80 - ADD A,C / 81 - ADD A,D / 82 - ADD A,E / 83 - ADD A,H / 84 - ADD A,L / 85 - ADD A,(HL) / 86 - ADD A,A / 87 - ADC A,B / 88 - ADC A,C / 89 - ADC A,D / 8A - ADC A,E / 8B - ADC A,H / 8C - ADC A,L / 8D - ADC A,(HL) / 8E - ADC A,A / 8F - SUB A,B / 90 - SUB A,C / 91 - SUB A,D / 92 - SUB A,E / 93 - SUB A,H / 94 - SUB A,L / 95 - SUB A,(HL) / 96 - SUB A,A / 97 - SBC A,B / 98 - SBC A,C / 99 - SBC A,D / 9A - SBC A,E / 9B - SBC A,H / 9C - SBC A,L / 9D - SBC A,(HL) / 9E - SBC A,A / 9F - AND A,B / A0 - AND A,C / A1 - AND A,D / A2 - AND A,E / A3 - AND A,H / A4 - AND A,L / A5 - AND A,(HL) / A6 - AND A,A / A7 - XOR A,B / A8 - XOR A,C / A9 - XOR A,D / AA - XOR A,E / AB - XOR A,H / AC - XOR A,L / AD - XOR A,(HL) / AE - XOR A,A / AF - OR A,B / B0 - OR A,C / B1 - OR A,D / B2 - OR A,E / B3 - OR A,H / B4 - OR A,L / B5 - OR A,(HL) / B6 - OR A,A / B7 - CP A,B / B8 - CP A,C / B9 - CP A,D / BA - CP A,E / BB - CP A,H / BC - CP A,L / BD - CP A,(HL) / BE - CP A,A / BF - RET NZ / C0 - POP BC / C1 - JP NZ,$16384 / C2 00 40 - JP $32768 / C3 00 80 - CALL NZ,$32768 / C4 00 80 - PUSH BC / C5 - ADD A,$32 / C6 20 - RST $0 / C7 - RET Z / C8 - RET / C9 - JP Z,$32768 / CA 00 80 - RLC B / CB 00 - RLC C / CB 01 - RLC D / CB 02 - RLC E / CB 03 - RLC H / CB 04 - RLC L / CB 05 - RLC (HL) / CB 06 - RLC A / CB 07 - RRC B / CB 08 - RRC C / CB 09 - RRC D / CB 0A - RRC E / CB 0B - RRC H / CB 0C - RRC L / CB 0D - RRC (HL) / CB 0E - RRC A / CB 0F - RL B / CB 10 - RL C / CB 11 - RL D / CB 12 - RL E / CB 13 - RL H / CB 14 - RL L / CB 15 - RL (HL) / CB 16 - RL A / CB 17 - RR B / CB 18 - RR C / CB 19 - RR D / CB 1A - RR E / CB 1B - RR H / CB 1C - RR L / CB 1D - RR (HL) / CB 1E - RR A / CB 1F - SLA B / CB 20 - SLA C / CB 21 - SLA D / CB 22 - SLA E / CB 23 - SLA H / CB 24 - SLA L / CB 25 - SLA (HL) / CB 26 - SLA A / CB 27 - SRA B / CB 28 - SRA C / CB 29 - SRA D / CB 2A - SRA E / CB 2B - SRA H / CB 2C - SRA L / CB 2D - SRA (HL) / CB 2E - SRA A / CB 2F - SLL B / CB 30 - SLL C / CB 31 - SLL D / CB 32 - SLL E / CB 33 - SLL H / CB 34 - SLL L / CB 35 - SLL (HL) / CB 36 - SLL A / CB 37 - SRL B / CB 38 - SRL C / CB 39 - SRL D / CB 3A - SRL E / CB 3B - SRL H / CB 3C - SRL L / CB 3D - SRL (HL) / CB 3E - SRL A / CB 3F - BIT $0,B / CB 40 - BIT $0,C / CB 41 - BIT $0,D / CB 42 - BIT $0,E / CB 43 - BIT $0,H / CB 44 - BIT $0,L / CB 45 - BIT $0,(HL) / CB 46 - BIT $0,A / CB 47 - BIT $1,B / CB 48 - BIT $1,C / CB 49 - BIT $1,D / CB 4A - BIT $1,E / CB 4B - BIT $1,H / CB 4C - BIT $1,L / CB 4D - BIT $1,(HL) / CB 4E - BIT $1,A / CB 4F - BIT $2,B / CB 50 - BIT $2,C / CB 51 - BIT $2,D / CB 52 - BIT $2,E / CB 53 - BIT $2,H / CB 54 - BIT $2,L / CB 55 - BIT $2,(HL) / CB 56 - BIT $2,A / CB 57 - BIT $3,B / CB 58 - BIT $3,C / CB 59 - BIT $3,D / CB 5A - BIT $3,E / CB 5B - BIT $3,H / CB 5C - BIT $3,L / CB 5D - BIT $3,(HL) / CB 5E - BIT $3,A / CB 5F - BIT $4,B / CB 60 - BIT $4,C / CB 61 - BIT $4,D / CB 62 - BIT $4,E / CB 63 - BIT $4,H / CB 64 - BIT $4,L / CB 65 - BIT $4,(HL) / CB 66 - BIT $4,A / CB 67 - BIT $5,B / CB 68 - BIT $5,C / CB 69 - BIT $5,D / CB 6A - BIT $5,E / CB 6B - BIT $5,H / CB 6C - BIT $5,L / CB 6D - BIT $5,(HL) / CB 6E - BIT $5,A / CB 6F - BIT $6,B / CB 70 - BIT $6,C / CB 71 - BIT $6,D / CB 72 - BIT $6,E / CB 73 - BIT $6,H / CB 74 - BIT $6,L / CB 75 - BIT $6,(HL) / CB 76 - BIT $6,A / CB 77 - BIT $7,B / CB 78 - BIT $7,C / CB 79 - BIT $7,D / CB 7A - BIT $7,E / CB 7B - BIT $7,H / CB 7C - BIT $7,L / CB 7D - BIT $7,(HL) / CB 7E - BIT $7,A / CB 7F - RES $0,B / CB 80 - RES $0,C / CB 81 - RES $0,D / CB 82 - RES $0,E / CB 83 - RES $0,H / CB 84 - RES $0,L / CB 85 - RES $0,(HL) / CB 86 - RES $0,A / CB 87 - RES $1,B / CB 88 - RES $1,C / CB 89 - RES $1,D / CB 8A - RES $1,E / CB 8B - RES $1,H / CB 8C - RES $1,L / CB 8D - RES $1,(HL) / CB 8E - RES $1,A / CB 8F - RES $2,B / CB 90 - RES $2,C / CB 91 - RES $2,D / CB 92 - RES $2,E / CB 93 - RES $2,H / CB 94 - RES $2,L / CB 95 - RES $2,(HL) / CB 96 - RES $2,A / CB 97 - RES $3,B / CB 98 - RES $3,C / CB 99 - RES $3,D / CB 9A - RES $3,E / CB 9B - RES $3,H / CB 9C - RES $3,L / CB 9D - RES $3,(HL) / CB 9E - RES $3,A / CB 9F - RES $4,B / CB A0 - RES $4,C / CB A1 - RES $4,D / CB A2 - RES $4,E / CB A3 - RES $4,H / CB A4 - RES $4,L / CB A5 - RES $4,(HL) / CB A6 - RES $4,A / CB A7 - RES $5,B / CB A8 - RES $5,C / CB A9 - RES $5,D / CB AA - RES $5,E / CB AB - RES $5,H / CB AC - RES $5,L / CB AD - RES $5,(HL) / CB AE - RES $5,A / CB AF - RES $6,B / CB B0 - RES $6,C / CB B1 - RES $6,D / CB B2 - RES $6,E / CB B3 - RES $6,H / CB B4 - RES $6,L / CB B5 - RES $6,(HL) / CB B6 - RES $6,A / CB B7 - RES $7,B / CB B8 - RES $7,C / CB B9 - RES $7,D / CB BA - RES $7,E / CB BB - RES $7,H / CB BC - RES $7,L / CB BD - RES $7,(HL) / CB BE - RES $7,A / CB BF - SET $0,B / CB C0 - SET $0,C / CB C1 - SET $0,D / CB C2 - SET $0,E / CB C3 - SET $0,H / CB C4 - SET $0,L / CB C5 - SET $0,(HL) / CB C6 - SET $0,A / CB C7 - SET $1,B / CB C8 - SET $1,C / CB C9 - SET $1,D / CB CA - SET $1,E / CB CB - SET $1,H / CB CC - SET $1,L / CB CD - SET $1,(HL) / CB CE - SET $1,A / CB CF - SET $2,B / CB D0 - SET $2,C / CB D1 - SET $2,D / CB D2 - SET $2,E / CB D3 - SET $2,H / CB D4 - SET $2,L / CB D5 - SET $2,(HL) / CB D6 - SET $2,A / CB D7 - SET $3,B / CB D8 - SET $3,C / CB D9 - SET $3,D / CB DA - SET $3,E / CB DB - SET $3,H / CB DC - SET $3,L / CB DD - SET $3,(HL) / CB DE - SET $3,A / CB DF - SET $4,B / CB E0 - SET $4,C / CB E1 - SET $4,D / CB E2 - SET $4,E / CB E3 - SET $4,H / CB E4 - SET $4,L / CB E5 - SET $4,(HL) / CB E6 - SET $4,A / CB E7 - SET $5,B / CB E8 - SET $5,C / CB E9 - SET $5,D / CB EA - SET $5,E / CB EB - SET $5,H / CB EC - SET $5,L / CB ED - SET $5,(HL) / CB EE - SET $5,A / CB EF - SET $6,B / CB F0 - SET $6,C / CB F1 - SET $6,D / CB F2 - SET $6,E / CB F3 - SET $6,H / CB F4 - SET $6,L / CB F5 - SET $6,(HL) / CB F6 - SET $6,A / CB F7 - SET $7,B / CB F8 - SET $7,C / CB F9 - SET $7,D / CB FA - SET $7,E / CB FB - SET $7,H / CB FC - SET $7,L / CB FD - SET $7,(HL) / CB FE - SET $7,A / CB FF - CALL Z,$16384 / CC 00 40 - CALL $16384 / CD 00 40 - ADC A,$64 / CE 40 - RST $8 / CF - RET NC / D0 - POP DE / D1 - JP NC,$16384 / D2 00 40 - OUT (153),A / D3 99 - CALL NC,$32768 / D4 00 80 - PUSH DE / D5 - SUB A,$32 / D6 20 - RST $16 / D7 - RET C / D8 - EXX / D9 - JP C,$16384 / DA 00 40 - IN A,(153) / DB 99 - CALL C,$32768 / DC 00 80 - ADD IX,BC / DD 09 - ADD IX,DE / DD 19 - LD IX,$64 / DD 21 40 00 - LD (32768),IX / DD 22 00 80 - INC IX / DD 23 - INC IXH / DD 24 - DEC IXH / DD 25 - LD IXH,$32 / DD 26 20 - ADD IX,IX / DD 29 - LD IX,(16384) / DD 2A 00 40 - DEC IX / DD 2B - INC IXL / DD 2C - DEC IXL / DD 2D - LD IXL,$64 / DD 2E 40 - INC (IX + 32) / DD 34 20 - DEC (IX + 16) / DD 35 10 - LD (IX + 64),$128 / DD 36 40 80 - ADD IX,SP / DD 39 - LD B,IXH / DD 44 - LD B,IXL / DD 45 - LD B,(IX + 32) / DD 46 20 - LD C,IXH / DD 4C - LD C,IXL / DD 4D - LD C,(IX + 48) / DD 4E 30 - LD D,IXH / DD 54 - LD D,IXL / DD 55 - LD D,(IX + 32) / DD 56 20 - LD E,IXH / DD 5C - LD E,IXL / DD 5D - LD E,(IX + 64) / DD 5E 40 - LD IXH,B / DD 60 - LD IXH,C / DD 61 - LD IXH,D / DD 62 - LD IXH,E / DD 63 - LD IXH,IXH / DD 64 - LD IXH,IXL / DD 65 - LD H,(IX + 16) / DD 66 10 - LD IXH,A / DD 67 - LD IXL,B / DD 68 - LD IXL,C / DD 69 - LD IXL,D / DD 6A - LD IXL,E / DD 6B - LD IXL,IXH / DD 6C - LD IXL,IXL / DD 6D - LD L,(IX + 48) / DD 6E 30 - LD IXL,A / DD 6F - LD (IX + 64),B / DD 70 40 - LD (IX + 16),C / DD 71 10 - LD (IX + 32),D / DD 72 20 - LD (IX + 48),E / DD 73 30 - LD (IX + 16),H / DD 74 10 - LD (IX + 32),L / DD 75 20 - LD (IX + 48),A / DD 77 30 - LD A,IXH / DD 7C - LD A,IXL / DD 7D - LD A,(IX + 16) / DD 7E 10 - ADD A,IXH / DD 84 - ADD A,IXL / DD 85 - ADD A,(IX + 32) / DD 86 20 - ADC A,IXH / DD 8C - ADC A,IXL / DD 8D - ADC A,(IX + 48) / DD 8E 30 - SUB A,IXH / DD 94 - SUB A,IXL / DD 95 - SUB A,(IX + 16) / DD 96 10 - SBC A,IXH / DD 9C - SBC A,IXL / DD 9D - SBC A,(IX + 32) / DD 9E 20 - AND A,IXH / DD A4 - AND A,IXL / DD A5 - AND A,(IX + 48) / DD A6 30 - XOR A,IXH / DD AC - XOR A,IXL / DD AD - XOR A,(IX + 16) / DD AE 10 - OR A,IXH / DD B4 - OR A,IXL / DD B5 - OR A,(IX + 32) / DD B6 20 - CP A,IXH / DD BC - CP A,IXL / DD BD - CP A,(IX + 48) / DD BE 30 - RLC (IX + 16),B / DD CB 10 00 - RLC (IX + 32),C / DD CB 20 01 - RLC (IX + 48),D / DD CB 30 02 - RLC (IX + 64),E / DD CB 40 03 - RLC (IX + 16),H / DD CB 10 04 - RLC (IX + 32),L / DD CB 20 05 - RLC (IX + 64) / DD CB 40 06 - RLC (IX + 16),A / DD CB 10 07 - RRC (IX + 32),B / DD CB 20 08 - RRC (IX + 48),C / DD CB 30 09 - RRC (IX + 64),D / DD CB 40 0A - RRC (IX + 16),E / DD CB 10 0B - RRC (IX + 32),H / DD CB 20 0C - RRC (IX + 48),L / DD CB 30 0D - RRC (IX + 16) / DD CB 10 0E - RRC (IX + 16),A / DD CB 10 0F - RL (IX + 32),B / DD CB 20 10 - RL (IX + 48),C / DD CB 30 11 - RL (IX + 64),D / DD CB 40 12 - RL (IX + 16),E / DD CB 10 13 - RL (IX + 32),H / DD CB 20 14 - RL (IX + 48),L / DD CB 30 15 - RL (IX + 32) / DD CB 20 16 - RL (IX + 16),A / DD CB 10 17 - RR (IX + 32),B / DD CB 20 18 - RR (IX + 48),C / DD CB 30 19 - RR (IX + 64),D / DD CB 40 1A - RR (IX + 16),E / DD CB 10 1B - RR (IX + 32),H / DD CB 20 1C - RR (IX + 48),L / DD CB 30 1D - RR (IX + 48) / DD CB 30 1E - RR (IX + 16),A / DD CB 10 1F - SLA (IX + 32),B / DD CB 20 20 - SLA (IX + 48),C / DD CB 30 21 - SLA (IX + 64),D / DD CB 40 22 - SLA (IX + 16),E / DD CB 10 23 - SLA (IX + 32),H / DD CB 20 24 - SLA (IX + 48),L / DD CB 30 25 - SLA (IX + 64) / DD CB 40 26 - SLA (IX + 16),A / DD CB 10 27 - SRA (IX + 32),B / DD CB 20 28 - SRA (IX + 48),C / DD CB 30 29 - SRA (IX + 64),D / DD CB 40 2A - SRA (IX + 16),E / DD CB 10 2B - SRA (IX + 32),H / DD CB 20 2C - SRA (IX + 48),L / DD CB 30 2D - SRA (IX + 16) / DD CB 10 2E - SRA (IX + 16),A / DD CB 10 2F - SLL (IX + 32),B / DD CB 20 30 - SLL (IX + 48),C / DD CB 30 31 - SLL (IX + 64),D / DD CB 40 32 - SLL (IX + 16),E / DD CB 10 33 - SLL (IX + 32),H / DD CB 20 34 - SLL (IX + 48),L / DD CB 30 35 - SLL (IX + 32) / DD CB 20 36 - SLL (IX + 16),A / DD CB 10 37 - SRL (IX + 32),B / DD CB 20 38 - SRL (IX + 48),C / DD CB 30 39 - SRL (IX + 64),D / DD CB 40 3A - SRL (IX + 16),E / DD CB 10 3B - SRL (IX + 32),H / DD CB 20 3C - SRL (IX + 48),L / DD CB 30 3D - SRL (IX + 48) / DD CB 30 3E - SRL (IX + 64),A / DD CB 40 3F - BIT $0,(IX + 16) / DD CB 10 46 - BIT $1,(IX + 32) / DD CB 20 4E - BIT $2,(IX + 48) / DD CB 30 56 - BIT $3,(IX + 64) / DD CB 40 5E - BIT $4,(IX + 16) / DD CB 10 66 - BIT $5,(IX + 32) / DD CB 20 6E - BIT $6,(IX + 48) / DD CB 30 76 - BIT $7,(IX + 64) / DD CB 40 7E - RES $0,(IX + 16),B / DD CB 10 80 - RES $0,(IX + 32),C / DD CB 20 81 - RES $0,(IX + 48),D / DD CB 30 82 - RES $0,(IX + 64),E / DD CB 40 83 - RES $0,(IX + 16),H / DD CB 10 84 - RES $0,(IX + 32),L / DD CB 20 85 - RES $0,(IX + 48) / DD CB 30 86 - RES $0,(IX + 64),A / DD CB 40 87 - RES $1,(IX + 16),B / DD CB 10 88 - RES $1,(IX + 32),C / DD CB 20 89 - RES $1,(IX + 48),D / DD CB 30 8A - RES $1,(IX + 64),E / DD CB 40 8B - RES $1,(IX + 16),H / DD CB 10 8C - RES $1,(IX + 32),L / DD CB 20 8D - RES $1,(IX + 48) / DD CB 30 8E - RES $1,(IX + 64),A / DD CB 40 8F - RES $2,(IX + 16),B / DD CB 10 90 - RES $2,(IX + 32),C / DD CB 20 91 - RES $2,(IX + 48),D / DD CB 30 92 - RES $2,(IX + 64),E / DD CB 40 93 - RES $2,(IX + 16),H / DD CB 10 94 - RES $2,(IX + 32),L / DD CB 20 95 - RES $2,(IX + 48) / DD CB 30 96 - RES $2,(IX + 64),A / DD CB 40 97 - RES $3,(IX + 16),B / DD CB 10 98 - RES $3,(IX + 32),C / DD CB 20 99 - RES $3,(IX + 48),D / DD CB 30 9A - RES $3,(IX + 64),E / DD CB 40 9B - RES $3,(IX + 16),H / DD CB 10 9C - RES $3,(IX + 32),L / DD CB 20 9D - RES $3,(IX + 48) / DD CB 30 9E - RES $3,(IX + 64),A / DD CB 40 9F - RES $4,(IX + 16),B / DD CB 10 A0 - RES $4,(IX + 32),C / DD CB 20 A1 - RES $4,(IX + 48),D / DD CB 30 A2 - RES $4,(IX + 64),E / DD CB 40 A3 - RES $4,(IX + 16),H / DD CB 10 A4 - RES $4,(IX + 32),L / DD CB 20 A5 - RES $4,(IX + 48) / DD CB 30 A6 - RES $4,(IX + 64),A / DD CB 40 A7 - RES $5,(IX + 16),B / DD CB 10 A8 - RES $5,(IX + 32),C / DD CB 20 A9 - RES $5,(IX + 48),D / DD CB 30 AA - RES $5,(IX + 64),E / DD CB 40 AB - RES $5,(IX + 16),H / DD CB 10 AC - RES $5,(IX + 32),L / DD CB 20 AD - RES $5,(IX + 48) / DD CB 30 AE - RES $5,(IX + 64),A / DD CB 40 AF - RES $6,(IX + 16),B / DD CB 10 B0 - RES $6,(IX + 32),C / DD CB 20 B1 - RES $6,(IX + 48),D / DD CB 30 B2 - RES $6,(IX + 64),E / DD CB 40 B3 - RES $6,(IX + 16),H / DD CB 10 B4 - RES $6,(IX + 32),L / DD CB 20 B5 - RES $6,(IX + 48) / DD CB 30 B6 - RES $6,(IX + 64),A / DD CB 40 B7 - RES $7,(IX + 16),B / DD CB 10 B8 - RES $7,(IX + 32),C / DD CB 20 B9 - RES $7,(IX + 48),D / DD CB 30 BA - RES $7,(IX + 64),E / DD CB 40 BB - RES $7,(IX + 16),H / DD CB 10 BC - RES $7,(IX + 32),L / DD CB 20 BD - RES $7,(IX + 48) / DD CB 30 BE - RES $7,(IX + 64),A / DD CB 40 BF - SET $0,(IX + 16),B / DD CB 10 C0 - SET $0,(IX + 32),C / DD CB 20 C1 - SET $0,(IX + 48),D / DD CB 30 C2 - SET $0,(IX + 64),E / DD CB 40 C3 - SET $0,(IX + 16),H / DD CB 10 C4 - SET $0,(IX + 32),L / DD CB 20 C5 - SET $0,(IX + 48) / DD CB 30 C6 - SET $0,(IX + 64),A / DD CB 40 C7 - SET $1,(IX + 16),B / DD CB 10 C8 - SET $1,(IX + 32),C / DD CB 20 C9 - SET $1,(IX + 48),D / DD CB 30 CA - SET $1,(IX + 64),E / DD CB 40 CB - SET $1,(IX + 16),H / DD CB 10 CC - SET $1,(IX + 32),L / DD CB 20 CD - SET $1,(IX + 48) / DD CB 30 CE - SET $1,(IX + 64),A / DD CB 40 CF - SET $2,(IX + 16),B / DD CB 10 D0 - SET $2,(IX + 32),C / DD CB 20 D1 - SET $2,(IX + 48),D / DD CB 30 D2 - SET $2,(IX + 64),E / DD CB 40 D3 - SET $2,(IX + 16),H / DD CB 10 D4 - SET $2,(IX + 32),L / DD CB 20 D5 - SET $2,(IX + 48) / DD CB 30 D6 - SET $2,(IX + 64),A / DD CB 40 D7 - SET $3,(IX + 16),B / DD CB 10 D8 - SET $3,(IX + 32),C / DD CB 20 D9 - SET $3,(IX + 48),D / DD CB 30 DA - SET $3,(IX + 64),E / DD CB 40 DB - SET $3,(IX + 16),H / DD CB 10 DC - SET $3,(IX + 32),L / DD CB 20 DD - SET $3,(IX + 48) / DD CB 30 DE - SET $3,(IX + 64),A / DD CB 40 DF - SET $4,(IX + 16),B / DD CB 10 E0 - SET $4,(IX + 32),C / DD CB 20 E1 - SET $4,(IX + 48),D / DD CB 30 E2 - SET $4,(IX + 64),E / DD CB 40 E3 - SET $4,(IX + 16),H / DD CB 10 E4 - SET $4,(IX + 32),L / DD CB 20 E5 - SET $4,(IX + 48) / DD CB 30 E6 - SET $4,(IX + 64),A / DD CB 40 E7 - SET $5,(IX + 16),B / DD CB 10 E8 - SET $5,(IX + 32),C / DD CB 20 E9 - SET $5,(IX + 48),D / DD CB 30 EA - SET $5,(IX + 64),E / DD CB 40 EB - SET $5,(IX + 16),H / DD CB 10 EC - SET $5,(IX + 32),L / DD CB 20 ED - SET $5,(IX + 48) / DD CB 30 EE - SET $5,(IX + 64),A / DD CB 40 EF - SET $6,(IX + 16),B / DD CB 10 F0 - SET $6,(IX + 32),C / DD CB 20 F1 - SET $6,(IX + 48),D / DD CB 30 F2 - SET $6,(IX + 64),E / DD CB 40 F3 - SET $6,(IX + 16),H / DD CB 10 F4 - SET $6,(IX + 32),L / DD CB 20 F5 - SET $6,(IX + 48) / DD CB 30 F6 - SET $6,(IX + 64),A / DD CB 40 F7 - SET $7,(IX + 16),B / DD CB 10 F8 - SET $7,(IX + 32),C / DD CB 20 F9 - SET $7,(IX + 48),D / DD CB 30 FA - SET $7,(IX + 64),E / DD CB 40 FB - SET $7,(IX + 16),H / DD CB 10 FC - SET $7,(IX + 32),L / DD CB 20 FD - SET $7,(IX + 48) / DD CB 30 FE - SET $7,(IX + 64),A / DD CB 40 FF - POP IX / DD E1 - EX (SP),IX / DD E3 - PUSH IX / DD E5 - JP (IX) / DD E9 - LD SP,IX / DD F9 - SBC A,$64 / DE 40 - RST $24 / DF - RET PO / E0 - POP HL / E1 - JP PO,$32768 / E2 00 80 - EX (SP),HL / E3 - CALL PO,$16384 / E4 00 40 - PUSH HL / E5 - AND A,$16 / E6 10 - RST $32 / E7 - RET PE / E8 - JP (HL) / E9 - JP PE,$16384 / EA 00 40 - EX DE,HL / EB - CALL PE,$16384 / EC 00 40 - IN B,(C) / ED 40 - OUT (C),B / ED 41 - SBC HL,BC / ED 42 - LD (32768),BC / ED 43 00 80 - NEG / ED 44 - RETN / ED 45 - IM $0 / ED 46 - LD I,A / ED 47 - IN C,(C) / ED 48 - OUT (C),C / ED 49 - ADC HL,BC / ED 4A - LD BC,(16384) / ED 4B 00 40 - RETI / ED 4D - LD R,A / ED 4F - IN D,(C) / ED 50 - OUT (C),D / ED 51 - SBC HL,DE / ED 52 - LD (32768),DE / ED 53 00 80 - IM $1 / ED 56 - LD A,I / ED 57 - IN E,(C) / ED 58 - OUT (C),E / ED 59 - ADC HL,DE / ED 5A - LD DE,(16384) / ED 5B 00 40 - IM $2 / ED 5E - LD A,R / ED 5F - IN H,(C) / ED 60 - OUT (C),H / ED 61 - SBC HL,HL / ED 62 - RRD / ED 67 - IN L,(C) / ED 68 - OUT (C),L / ED 69 - ADC HL,HL / ED 6A - RLD / ED 6F - IN F,(C) / ED 70 - OUT (C),$0 / ED 71 - SBC HL,SP / ED 72 - LD (16384),SP / ED 73 00 40 - IN A,(C) / ED 78 - OUT (C),A / ED 79 - ADC HL,SP / ED 7A - LD SP,(32768) / ED 7B 00 80 - LDI / ED A0 - CPI / ED A1 - INI / ED A2 - OUTI / ED A3 - LDD / ED A8 - CPD / ED A9 - IND / ED AA - OUTD / ED AB - LDIR / ED B0 - CPIR / ED B1 - INIR / ED B2 - OTIR / ED B3 - LDDR / ED B8 - CPDR / ED B9 - INDR / ED BA - OTDR / ED BB - XOR A,$32 / EE 20 - RST $40 / EF - RET P / F0 - POP AF / F1 - JP P,$32768 / F2 00 80 - DI / F3 - CALL P,$16384 / F4 00 40 - PUSH AF / F5 - OR A,$32 / F6 20 - RST $48 / F7 - RET M / F8 - LD SP,HL / F9 - JP M,$32768 / FA 00 80 - EI / FB - CALL M,$16384 / FC 00 40 - ADD IY,BC / FD 09 - ADD IY,DE / FD 19 - LD IY,$32768 / FD 21 00 80 - LD (16384),IY / FD 22 00 40 - INC IY / FD 23 - INC IYH / FD 24 - DEC IYH / FD 25 - LD IYH,$32 / FD 26 20 - ADD IY,IY / FD 29 - LD IY,(32768) / FD 2A 00 80 - DEC IY / FD 2B - INC IYL / FD 2C - DEC IYL / FD 2D - LD IYL,$16 / FD 2E 10 - INC (IY + 32) / FD 34 20 - DEC (IY + 48) / FD 35 30 - LD (IY + 64),$16 / FD 36 40 10 - ADD IY,SP / FD 39 - LD B,IYH / FD 44 - LD B,IYL / FD 45 - LD B,(IY + 32) / FD 46 20 - LD C,IYH / FD 4C - LD C,IYL / FD 4D - LD C,(IY + 48) / FD 4E 30 - LD D,IYH / FD 54 - LD D,IYL / FD 55 - LD D,(IY + 64) / FD 56 40 - LD E,IYH / FD 5C - LD E,IYL / FD 5D - LD E,(IY + 16) / FD 5E 10 - LD IYH,B / FD 60 - LD IYH,C / FD 61 - LD IYH,D / FD 62 - LD IYH,E / FD 63 - LD IYH,IYH / FD 64 - LD IYH,IYL / FD 65 - LD H,(IY + 32) / FD 66 20 - LD IYH,A / FD 67 - LD IYL,B / FD 68 - LD IYL,C / FD 69 - LD IYL,D / FD 6A - LD IYL,E / FD 6B - LD IYL,IYH / FD 6C - LD IYL,IYL / FD 6D - LD L,(IY + 48) / FD 6E 30 - LD IYL,A / FD 6F - LD (IY + 64),B / FD 70 40 - LD (IY + 16),C / FD 71 10 - LD (IY + 32),D / FD 72 20 - LD (IY + 48),E / FD 73 30 - LD (IY + 64),H / FD 74 40 - LD (IY + 16),L / FD 75 10 - LD (IY + 32),A / FD 77 20 - LD A,IYH / FD 7C - LD A,IYL / FD 7D - LD A,(IY + 48) / FD 7E 30 - ADD A,IYH / FD 84 - ADD A,IYL / FD 85 - ADD A,(IY + 64) / FD 86 40 - ADC A,IYH / FD 8C - ADC A,IYL / FD 8D - ADC A,(IY + 16) / FD 8E 10 - SUB A,IYH / FD 94 - SUB A,IYL / FD 95 - SUB A,(IY + 32) / FD 96 20 - SBC A,IYH / FD 9C - SBC A,IYL / FD 9D - SBC A,(IY + 48) / FD 9E 30 - AND A,IYH / FD A4 - AND A,IYL / FD A5 - AND A,(IY + 64) / FD A6 40 - XOR A,IYH / FD AC - XOR A,IYL / FD AD - XOR A,(IY + 16) / FD AE 10 - OR A,IYH / FD B4 - OR A,IYL / FD B5 - OR A,(IY + 32) / FD B6 20 - CP A,IYH / FD BC - CP A,IYL / FD BD - CP A,(IY + 48) / FD BE 30 - RLC (IY + 16),B / FD CB 10 00 - RLC (IY + 32),C / FD CB 20 01 - RLC (IY + 48),D / FD CB 30 02 - RLC (IY + 64),E / FD CB 40 03 - RLC (IY + 16),H / FD CB 10 04 - RLC (IY + 32),L / FD CB 20 05 - RLC (IY + 16) / FD CB 10 06 - RLC (IY + 32),A / FD CB 20 07 - RRC (IY + 48),B / FD CB 30 08 - RRC (IY + 64),C / FD CB 40 09 - RRC (IY + 16),D / FD CB 10 0A - RRC (IY + 32),E / FD CB 20 0B - RRC (IY + 48),H / FD CB 30 0C - RRC (IY + 64),L / FD CB 40 0D - RRC (IY + 32) / FD CB 20 0E - RRC (IY + 16),A / FD CB 10 0F - RL (IY + 32),B / FD CB 20 10 - RL (IY + 48),C / FD CB 30 11 - RL (IY + 64),D / FD CB 40 12 - RL (IY + 16),E / FD CB 10 13 - RL (IY + 32),H / FD CB 20 14 - RL (IY + 48),L / FD CB 30 15 - RL (IY + 48) / FD CB 30 16 - RL (IY + 16),A / FD CB 10 17 - RR (IY + 32),B / FD CB 20 18 - RR (IY + 48),C / FD CB 30 19 - RR (IY + 64),D / FD CB 40 1A - RR (IY + 16),E / FD CB 10 1B - RR (IY + 32),H / FD CB 20 1C - RR (IY + 48),L / FD CB 30 1D - RR (IY + 64) / FD CB 40 1E - RR (IY + 16),A / FD CB 10 1F - SLA (IY + 32),B / FD CB 20 20 - SLA (IY + 48),C / FD CB 30 21 - SLA (IY + 64),D / FD CB 40 22 - SLA (IY + 16),E / FD CB 10 23 - SLA (IY + 32),H / FD CB 20 24 - SLA (IY + 48),L / FD CB 30 25 - SLA (IY + 16) / FD CB 10 26 - SLA (IY + 16),A / FD CB 10 27 - SRA (IY + 32),B / FD CB 20 28 - SRA (IY + 48),C / FD CB 30 29 - SRA (IY + 64),D / FD CB 40 2A - SRA (IY + 16),E / FD CB 10 2B - SRA (IY + 32),H / FD CB 20 2C - SRA (IY + 48),L / FD CB 30 2D - SRA (IY + 32) / FD CB 20 2E - SRA (IY + 48),A / FD CB 30 2F - SLL (IY + 16),B / FD CB 10 30 - SLL (IY + 32),C / FD CB 20 31 - SLL (IY + 48),D / FD CB 30 32 - SLL (IY + 64),E / FD CB 40 33 - SLL (IY + 16),H / FD CB 10 34 - SLL (IY + 32),L / FD CB 20 35 - SLL (IY + 48) / FD CB 30 36 - SLL (IY + 16),A / FD CB 10 37 - SRL (IY + 32),B / FD CB 20 38 - SRL (IY + 48),C / FD CB 30 39 - SRL (IY + 64),D / FD CB 40 3A - SRL (IY + 16),E / FD CB 10 3B - SRL (IY + 32),H / FD CB 20 3C - SRL (IY + 48),L / FD CB 30 3D - SRL (IY + 64) / FD CB 40 3E - SRL (IY + 16),A / FD CB 10 3F - BIT $0,(IY + 16) / FD CB 10 46 - BIT $1,(IY + 32) / FD CB 20 4E - BIT $2,(IY + 48) / FD CB 30 56 - BIT $3,(IY + 64) / FD CB 40 5E - BIT $4,(IY + 16) / FD CB 10 66 - BIT $5,(IY + 32) / FD CB 20 6E - BIT $6,(IY + 48) / FD CB 30 76 - BIT $7,(IY + 64) / FD CB 40 7E - RES $0,(IY + 16),B / FD CB 10 80 - RES $0,(IY + 32),C / FD CB 20 81 - RES $0,(IY + 48),D / FD CB 30 82 - RES $0,(IY + 64),E / FD CB 40 83 - RES $0,(IY + 16),H / FD CB 10 84 - RES $0,(IY + 32),L / FD CB 20 85 - RES $0,(IY + 48) / FD CB 30 86 - RES $0,(IY + 64),A / FD CB 40 87 - RES $1,(IY + 16),B / FD CB 10 88 - RES $1,(IY + 32),C / FD CB 20 89 - RES $1,(IY + 48),D / FD CB 30 8A - RES $1,(IY + 64),E / FD CB 40 8B - RES $1,(IY + 16),H / FD CB 10 8C - RES $1,(IY + 32),L / FD CB 20 8D - RES $1,(IY + 48) / FD CB 30 8E - RES $1,(IY + 64),A / FD CB 40 8F - RES $2,(IY + 16),B / FD CB 10 90 - RES $2,(IY + 32),C / FD CB 20 91 - RES $2,(IY + 48),D / FD CB 30 92 - RES $2,(IY + 64),E / FD CB 40 93 - RES $2,(IY + 16),H / FD CB 10 94 - RES $2,(IY + 32),L / FD CB 20 95 - RES $2,(IY + 48) / FD CB 30 96 - RES $2,(IY + 64),A / FD CB 40 97 - RES $3,(IY + 16),B / FD CB 10 98 - RES $3,(IY + 32),C / FD CB 20 99 - RES $3,(IY + 48),D / FD CB 30 9A - RES $3,(IY + 64),E / FD CB 40 9B - RES $3,(IY + 16),H / FD CB 10 9C - RES $3,(IY + 32),L / FD CB 20 9D - RES $3,(IY + 48) / FD CB 30 9E - RES $3,(IY + 64),A / FD CB 40 9F - RES $4,(IY + 16),B / FD CB 10 A0 - RES $4,(IY + 32),C / FD CB 20 A1 - RES $4,(IY + 48),D / FD CB 30 A2 - RES $4,(IY + 64),E / FD CB 40 A3 - RES $4,(IY + 16),H / FD CB 10 A4 - RES $4,(IY + 32),L / FD CB 20 A5 - RES $4,(IY + 48) / FD CB 30 A6 - RES $4,(IY + 64),A / FD CB 40 A7 - RES $5,(IY + 16),B / FD CB 10 A8 - RES $5,(IY + 32),C / FD CB 20 A9 - RES $5,(IY + 48),D / FD CB 30 AA - RES $5,(IY + 64),E / FD CB 40 AB - RES $5,(IY + 16),H / FD CB 10 AC - RES $5,(IY + 32),L / FD CB 20 AD - RES $5,(IY + 48) / FD CB 30 AE - RES $5,(IY + 64),A / FD CB 40 AF - RES $6,(IY + 16),B / FD CB 10 B0 - RES $6,(IY + 32),C / FD CB 20 B1 - RES $6,(IY + 48),D / FD CB 30 B2 - RES $6,(IY + 64),E / FD CB 40 B3 - RES $6,(IY + 16),H / FD CB 10 B4 - RES $6,(IY + 32),L / FD CB 20 B5 - RES $6,(IY + 48) / FD CB 30 B6 - RES $6,(IY + 64),A / FD CB 40 B7 - RES $7,(IY + 16),B / FD CB 10 B8 - RES $7,(IY + 32),C / FD CB 20 B9 - RES $7,(IY + 48),D / FD CB 30 BA - RES $7,(IY + 64),E / FD CB 40 BB - RES $7,(IY + 16),H / FD CB 10 BC - RES $7,(IY + 32),L / FD CB 20 BD - RES $7,(IY + 48) / FD CB 30 BE - RES $7,(IY + 64),A / FD CB 40 BF - SET $0,(IY + 16),B / FD CB 10 C0 - SET $0,(IY + 32),C / FD CB 20 C1 - SET $0,(IY + 48),D / FD CB 30 C2 - SET $0,(IY + 64),E / FD CB 40 C3 - SET $0,(IY + 16),H / FD CB 10 C4 - SET $0,(IY + 32),L / FD CB 20 C5 - SET $0,(IY + 48) / FD CB 30 C6 - SET $0,(IY + 64),A / FD CB 40 C7 - SET $1,(IY + 16),B / FD CB 10 C8 - SET $1,(IY + 32),C / FD CB 20 C9 - SET $1,(IY + 48),D / FD CB 30 CA - SET $1,(IY + 64),E / FD CB 40 CB - SET $1,(IY + 16),H / FD CB 10 CC - SET $1,(IY + 32),L / FD CB 20 CD - SET $1,(IY + 48) / FD CB 30 CE - SET $1,(IY + 64),A / FD CB 40 CF - SET $2,(IY + 16),B / FD CB 10 D0 - SET $2,(IY + 32),C / FD CB 20 D1 - SET $2,(IY + 48),D / FD CB 30 D2 - SET $2,(IY + 64),E / FD CB 40 D3 - SET $2,(IY + 16),H / FD CB 10 D4 - SET $2,(IY + 32),L / FD CB 20 D5 - SET $2,(IY + 48) / FD CB 30 D6 - SET $2,(IY + 64),A / FD CB 40 D7 - SET $3,(IY + 16),B / FD CB 10 D8 - SET $3,(IY + 32),C / FD CB 20 D9 - SET $3,(IY + 48),D / FD CB 30 DA - SET $3,(IY + 64),E / FD CB 40 DB - SET $3,(IY + 16),H / FD CB 10 DC - SET $3,(IY + 32),L / FD CB 20 DD - SET $3,(IY + 48) / FD CB 30 DE - SET $3,(IY + 64),A / FD CB 40 DF - SET $4,(IY + 16),B / FD CB 10 E0 - SET $4,(IY + 32),C / FD CB 20 E1 - SET $4,(IY + 48),D / FD CB 30 E2 - SET $4,(IY + 64),E / FD CB 40 E3 - SET $4,(IY + 16),H / FD CB 10 E4 - SET $4,(IY + 32),L / FD CB 20 E5 - SET $4,(IY + 48) / FD CB 30 E6 - SET $4,(IY + 64),A / FD CB 40 E7 - SET $5,(IY + 16),B / FD CB 10 E8 - SET $5,(IY + 32),C / FD CB 20 E9 - SET $5,(IY + 48),D / FD CB 30 EA - SET $5,(IY + 64),E / FD CB 40 EB - SET $5,(IY + 16),H / FD CB 10 EC - SET $5,(IY + 32),L / FD CB 20 ED - SET $5,(IY + 48) / FD CB 30 EE - SET $5,(IY + 64),A / FD CB 40 EF - SET $6,(IY + 16),B / FD CB 10 F0 - SET $6,(IY + 32),C / FD CB 20 F1 - SET $6,(IY + 48),D / FD CB 30 F2 - SET $6,(IY + 64),E / FD CB 40 F3 - SET $6,(IY + 16),H / FD CB 10 F4 - SET $6,(IY + 32),L / FD CB 20 F5 - SET $6,(IY + 48) / FD CB 30 F6 - SET $6,(IY + 64),A / FD CB 40 F7 - SET $7,(IY + 16),B / FD CB 10 F8 - SET $7,(IY + 32),C / FD CB 20 F9 - SET $7,(IY + 48),D / FD CB 30 FA - SET $7,(IY + 64),E / FD CB 40 FB - SET $7,(IY + 16),H / FD CB 10 FC - SET $7,(IY + 32),L / FD CB 20 FD - SET $7,(IY + 48) / FD CB 30 FE - SET $7,(IY + 64),A / FD CB 40 FF - POP IY / FD E1 - EX (SP),IY / FD E3 - PUSH IY / FD E5 - JP (IY) / FD E9 - LD SP,IY / FD F9 - CP A,$32 / FE 20 - RST $56 / FF - -/ and now, we are going to test at&t syntax in z80 - INC 32(IX) / DD 34 20 - DEC 16(IX) / DD 35 10 - LD 64(IX),$128 / DD 36 40 80 - LD B,32(IX) / DD 46 20 - LD C,48(IX) / DD 4E 30 - LD D,32(IX) / DD 56 20 - LD E,64(IX) / DD 5E 40 - LD H,16(IX) / DD 66 10 - LD L,48(IX) / DD 6E 30 - LD 64(IX),B / DD 70 40 - LD 16(IX),C / DD 71 10 - LD 32(IX),D / DD 72 20 - LD 48(IX),E / DD 73 30 - LD 16(IX),H / DD 74 10 - LD 32(IX),L / DD 75 20 - LD 48(IX),A / DD 77 30 - LD A,16(IX) / DD 7E 10 - ADD A,32(IX) / DD 86 20 - ADC A,48(IX) / DD 8E 30 - SUB A,16(IX) / DD 96 10 - SBC A,32(IX) / DD 9E 20 - AND A,48(IX) / DD A6 30 - XOR A,16(IX) / DD AE 10 - OR A,32(IX) / DD B6 20 - CP A,48(IX) / DD BE 30 - RLC 16(IX),B / DD CB 10 00 - RLC 32(IX),C / DD CB 20 01 - RLC 48(IX),D / DD CB 30 02 - RLC 64(IX),E / DD CB 40 03 - RLC 16(IX),H / DD CB 10 04 - RLC 32(IX),L / DD CB 20 05 - RLC 64(IX) / DD CB 40 06 - RLC 16(IX),A / DD CB 10 07 - RRC 32(IX),B / DD CB 20 08 - RRC 48(IX),C / DD CB 30 09 - RRC 64(IX),D / DD CB 40 0A - RRC 16(IX),E / DD CB 10 0B - RRC 32(IX),H / DD CB 20 0C - RRC 48(IX),L / DD CB 30 0D - RRC 16(IX) / DD CB 10 0E - RRC 16(IX),A / DD CB 10 0F - RL 32(IX),B / DD CB 20 10 - RL 48(IX),C / DD CB 30 11 - RL 64(IX),D / DD CB 40 12 - RL 16(IX),E / DD CB 10 13 - RL 32(IX),H / DD CB 20 14 - RL 48(IX),L / DD CB 30 15 - RL 32(IX) / DD CB 20 16 - RL 16(IX),A / DD CB 10 17 - RR 32(IX),B / DD CB 20 18 - RR 48(IX),C / DD CB 30 19 - RR 64(IX),D / DD CB 40 1A - RR 16(IX),E / DD CB 10 1B - RR 32(IX),H / DD CB 20 1C - RR 48(IX),L / DD CB 30 1D - RR 48(IX) / DD CB 30 1E - RR 16(IX),A / DD CB 10 1F - SLA 32(IX),B / DD CB 20 20 - SLA 48(IX),C / DD CB 30 21 - SLA 64(IX),D / DD CB 40 22 - SLA 16(IX),E / DD CB 10 23 - SLA 32(IX),H / DD CB 20 24 - SLA 48(IX),L / DD CB 30 25 - SLA 64(IX) / DD CB 40 26 - SLA 16(IX),A / DD CB 10 27 - SRA 32(IX),B / DD CB 20 28 - SRA 48(IX),C / DD CB 30 29 - SRA 64(IX),D / DD CB 40 2A - SRA 16(IX),E / DD CB 10 2B - SRA 32(IX),H / DD CB 20 2C - SRA 48(IX),L / DD CB 30 2D - SRA 16(IX) / DD CB 10 2E - SRA 16(IX),A / DD CB 10 2F - SLL 32(IX),B / DD CB 20 30 - SLL 48(IX),C / DD CB 30 31 - SLL 64(IX),D / DD CB 40 32 - SLL 16(IX),E / DD CB 10 33 - SLL 32(IX),H / DD CB 20 34 - SLL 48(IX),L / DD CB 30 35 - SLL 32(IX) / DD CB 20 36 - SLL 16(IX),A / DD CB 10 37 - SRL 32(IX),B / DD CB 20 38 - SRL 48(IX),C / DD CB 30 39 - SRL 64(IX),D / DD CB 40 3A - SRL 16(IX),E / DD CB 10 3B - SRL 32(IX),H / DD CB 20 3C - SRL 48(IX),L / DD CB 30 3D - SRL 48(IX) / DD CB 30 3E - SRL 64(IX),A / DD CB 40 3F - BIT $0,16(IX) / DD CB 10 46 - BIT $1,32(IX) / DD CB 20 4E - BIT $2,48(IX) / DD CB 30 56 - BIT $3,64(IX) / DD CB 40 5E - BIT $4,16(IX) / DD CB 10 66 - BIT $5,32(IX) / DD CB 20 6E - BIT $6,48(IX) / DD CB 30 76 - BIT $7,64(IX) / DD CB 40 7E - RES $0,16(IX),B / DD CB 10 80 - RES $0,32(IX),C / DD CB 20 81 - RES $0,48(IX),D / DD CB 30 82 - RES $0,64(IX),E / DD CB 40 83 - RES $0,16(IX),H / DD CB 10 84 - RES $0,32(IX),L / DD CB 20 85 - RES $0,48(IX) / DD CB 30 86 - RES $0,64(IX),A / DD CB 40 87 - RES $1,16(IX),B / DD CB 10 88 - RES $1,32(IX),C / DD CB 20 89 - RES $1,48(IX),D / DD CB 30 8A - RES $1,64(IX),E / DD CB 40 8B - RES $1,16(IX),H / DD CB 10 8C - RES $1,32(IX),L / DD CB 20 8D - RES $1,48(IX) / DD CB 30 8E - RES $1,64(IX),A / DD CB 40 8F - RES $2,16(IX),B / DD CB 10 90 - RES $2,32(IX),C / DD CB 20 91 - RES $2,48(IX),D / DD CB 30 92 - RES $2,64(IX),E / DD CB 40 93 - RES $2,16(IX),H / DD CB 10 94 - RES $2,32(IX),L / DD CB 20 95 - RES $2,48(IX) / DD CB 30 96 - RES $2,64(IX),A / DD CB 40 97 - RES $3,16(IX),B / DD CB 10 98 - RES $3,32(IX),C / DD CB 20 99 - RES $3,48(IX),D / DD CB 30 9A - RES $3,64(IX),E / DD CB 40 9B - RES $3,16(IX),H / DD CB 10 9C - RES $3,32(IX),L / DD CB 20 9D - RES $3,48(IX) / DD CB 30 9E - RES $3,64(IX),A / DD CB 40 9F - RES $4,16(IX),B / DD CB 10 A0 - RES $4,32(IX),C / DD CB 20 A1 - RES $4,48(IX),D / DD CB 30 A2 - RES $4,64(IX),E / DD CB 40 A3 - RES $4,16(IX),H / DD CB 10 A4 - RES $4,32(IX),L / DD CB 20 A5 - RES $4,48(IX) / DD CB 30 A6 - RES $4,64(IX),A / DD CB 40 A7 - RES $5,16(IX),B / DD CB 10 A8 - RES $5,32(IX),C / DD CB 20 A9 - RES $5,48(IX),D / DD CB 30 AA - RES $5,64(IX),E / DD CB 40 AB - RES $5,16(IX),H / DD CB 10 AC - RES $5,32(IX),L / DD CB 20 AD - RES $5,48(IX) / DD CB 30 AE - RES $5,64(IX),A / DD CB 40 AF - RES $6,16(IX),B / DD CB 10 B0 - RES $6,32(IX),C / DD CB 20 B1 - RES $6,48(IX),D / DD CB 30 B2 - RES $6,64(IX),E / DD CB 40 B3 - RES $6,16(IX),H / DD CB 10 B4 - RES $6,32(IX),L / DD CB 20 B5 - RES $6,48(IX) / DD CB 30 B6 - RES $6,64(IX),A / DD CB 40 B7 - RES $7,16(IX),B / DD CB 10 B8 - RES $7,32(IX),C / DD CB 20 B9 - RES $7,48(IX),D / DD CB 30 BA - RES $7,64(IX),E / DD CB 40 BB - RES $7,16(IX),H / DD CB 10 BC - RES $7,32(IX),L / DD CB 20 BD - RES $7,48(IX) / DD CB 30 BE - RES $7,64(IX),A / DD CB 40 BF - SET $0,16(IX),B / DD CB 10 C0 - SET $0,32(IX),C / DD CB 20 C1 - SET $0,48(IX),D / DD CB 30 C2 - SET $0,64(IX),E / DD CB 40 C3 - SET $0,16(IX),H / DD CB 10 C4 - SET $0,32(IX),L / DD CB 20 C5 - SET $0,48(IX) / DD CB 30 C6 - SET $0,64(IX),A / DD CB 40 C7 - SET $1,16(IX),B / DD CB 10 C8 - SET $1,32(IX),C / DD CB 20 C9 - SET $1,48(IX),D / DD CB 30 CA - SET $1,64(IX),E / DD CB 40 CB - SET $1,16(IX),H / DD CB 10 CC - SET $1,32(IX),L / DD CB 20 CD - SET $1,48(IX) / DD CB 30 CE - SET $1,64(IX),A / DD CB 40 CF - SET $2,16(IX),B / DD CB 10 D0 - SET $2,32(IX),C / DD CB 20 D1 - SET $2,48(IX),D / DD CB 30 D2 - SET $2,64(IX),E / DD CB 40 D3 - SET $2,16(IX),H / DD CB 10 D4 - SET $2,32(IX),L / DD CB 20 D5 - SET $2,48(IX) / DD CB 30 D6 - SET $2,64(IX),A / DD CB 40 D7 - SET $3,16(IX),B / DD CB 10 D8 - SET $3,32(IX),C / DD CB 20 D9 - SET $3,48(IX),D / DD CB 30 DA - SET $3,64(IX),E / DD CB 40 DB - SET $3,16(IX),H / DD CB 10 DC - SET $3,32(IX),L / DD CB 20 DD - SET $3,48(IX) / DD CB 30 DE - SET $3,64(IX),A / DD CB 40 DF - SET $4,16(IX),B / DD CB 10 E0 - SET $4,32(IX),C / DD CB 20 E1 - SET $4,48(IX),D / DD CB 30 E2 - SET $4,64(IX),E / DD CB 40 E3 - SET $4,16(IX),H / DD CB 10 E4 - SET $4,32(IX),L / DD CB 20 E5 - SET $4,48(IX) / DD CB 30 E6 - SET $4,64(IX),A / DD CB 40 E7 - SET $5,16(IX),B / DD CB 10 E8 - SET $5,32(IX),C / DD CB 20 E9 - SET $5,48(IX),D / DD CB 30 EA - SET $5,64(IX),E / DD CB 40 EB - SET $5,16(IX),H / DD CB 10 EC - SET $5,32(IX),L / DD CB 20 ED - SET $5,48(IX) / DD CB 30 EE - SET $5,64(IX),A / DD CB 40 EF - SET $6,16(IX),B / DD CB 10 F0 - SET $6,32(IX),C / DD CB 20 F1 - SET $6,48(IX),D / DD CB 30 F2 - SET $6,64(IX),E / DD CB 40 F3 - SET $6,16(IX),H / DD CB 10 F4 - SET $6,32(IX),L / DD CB 20 F5 - SET $6,48(IX) / DD CB 30 F6 - SET $6,64(IX),A / DD CB 40 F7 - SET $7,16(IX),B / DD CB 10 F8 - SET $7,32(IX),C / DD CB 20 F9 - SET $7,48(IX),D / DD CB 30 FA - SET $7,64(IX),E / DD CB 40 FB - SET $7,16(IX),H / DD CB 10 FC - SET $7,32(IX),L / DD CB 20 FD - SET $7,48(IX) / DD CB 30 FE - SET $7,64(IX),A / DD CB 40 FF - INC 32(IY) / FD 34 20 - DEC 48(IY) / FD 35 30 - LD 64(IY),$16 / FD 36 40 10 - LD B,32(IY) / FD 46 20 - LD C,48(IY) / FD 4E 30 - LD D,64(IY) / FD 56 40 - LD E,16(IY) / FD 5E 10 - LD H,32(IY) / FD 66 20 - LD L,48(IY) / FD 6E 30 - LD 64(IY),B / FD 70 40 - LD 16(IY),C / FD 71 10 - LD 32(IY),D / FD 72 20 - LD 48(IY),E / FD 73 30 - LD 64(IY),H / FD 74 40 - LD 16(IY),L / FD 75 10 - LD 32(IY),A / FD 77 20 - LD A,48(IY) / FD 7E 30 - ADD A,64(IY) / FD 86 40 - ADC A,16(IY) / FD 8E 10 - SUB A,32(IY) / FD 96 20 - SBC A,48(IY) / FD 9E 30 - AND A,64(IY) / FD A6 40 - XOR A,16(IY) / FD AE 10 - OR A,32(IY) / FD B6 20 - CP A,48(IY) / FD BE 30 - RLC 16(IY),B / FD CB 10 00 - RLC 32(IY),C / FD CB 20 01 - RLC 48(IY),D / FD CB 30 02 - RLC 64(IY),E / FD CB 40 03 - RLC 16(IY),H / FD CB 10 04 - RLC 32(IY),L / FD CB 20 05 - RLC 16(IY) / FD CB 10 06 - RLC 32(IY),A / FD CB 20 07 - RRC 48(IY),B / FD CB 30 08 - RRC 64(IY),C / FD CB 40 09 - RRC 16(IY),D / FD CB 10 0A - RRC 32(IY),E / FD CB 20 0B - RRC 48(IY),H / FD CB 30 0C - RRC 64(IY),L / FD CB 40 0D - RRC 32(IY) / FD CB 20 0E - RRC 16(IY),A / FD CB 10 0F - RL 32(IY),B / FD CB 20 10 - RL 48(IY),C / FD CB 30 11 - RL 64(IY),D / FD CB 40 12 - RL 16(IY),E / FD CB 10 13 - RL 32(IY),H / FD CB 20 14 - RL 48(IY),L / FD CB 30 15 - RL 48(IY) / FD CB 30 16 - RL 16(IY),A / FD CB 10 17 - RR 32(IY),B / FD CB 20 18 - RR 48(IY),C / FD CB 30 19 - RR 64(IY),D / FD CB 40 1A - RR 16(IY),E / FD CB 10 1B - RR 32(IY),H / FD CB 20 1C - RR 48(IY),L / FD CB 30 1D - RR 64(IY) / FD CB 40 1E - RR 16(IY),A / FD CB 10 1F - SLA 32(IY),B / FD CB 20 20 - SLA 48(IY),C / FD CB 30 21 - SLA 64(IY),D / FD CB 40 22 - SLA 16(IY),E / FD CB 10 23 - SLA 32(IY),H / FD CB 20 24 - SLA 48(IY),L / FD CB 30 25 - SLA 16(IY) / FD CB 10 26 - SLA 16(IY),A / FD CB 10 27 - SRA 32(IY),B / FD CB 20 28 - SRA 48(IY),C / FD CB 30 29 - SRA 64(IY),D / FD CB 40 2A - SRA 16(IY),E / FD CB 10 2B - SRA 32(IY),H / FD CB 20 2C - SRA 48(IY),L / FD CB 30 2D - SRA 32(IY) / FD CB 20 2E - SRA 48(IY),A / FD CB 30 2F - SLL 16(IY),B / FD CB 10 30 - SLL 32(IY),C / FD CB 20 31 - SLL 48(IY),D / FD CB 30 32 - SLL 64(IY),E / FD CB 40 33 - SLL 16(IY),H / FD CB 10 34 - SLL 32(IY),L / FD CB 20 35 - SLL 48(IY) / FD CB 30 36 - SLL 16(IY),A / FD CB 10 37 - SRL 32(IY),B / FD CB 20 38 - SRL 48(IY),C / FD CB 30 39 - SRL 64(IY),D / FD CB 40 3A - SRL 16(IY),E / FD CB 10 3B - SRL 32(IY),H / FD CB 20 3C - SRL 48(IY),L / FD CB 30 3D - SRL 64(IY) / FD CB 40 3E - SRL 16(IY),A / FD CB 10 3F - BIT $0,16(IY) / FD CB 10 46 - BIT $1,32(IY) / FD CB 20 4E - BIT $2,48(IY) / FD CB 30 56 - BIT $3,64(IY) / FD CB 40 5E - BIT $4,16(IY) / FD CB 10 66 - BIT $5,32(IY) / FD CB 20 6E - BIT $6,48(IY) / FD CB 30 76 - BIT $7,64(IY) / FD CB 40 7E - RES $0,16(IY),B / FD CB 10 80 - RES $0,32(IY),C / FD CB 20 81 - RES $0,48(IY),D / FD CB 30 82 - RES $0,64(IY),E / FD CB 40 83 - RES $0,16(IY),H / FD CB 10 84 - RES $0,32(IY),L / FD CB 20 85 - RES $0,48(IY) / FD CB 30 86 - RES $0,64(IY),A / FD CB 40 87 - RES $1,16(IY),B / FD CB 10 88 - RES $1,32(IY),C / FD CB 20 89 - RES $1,48(IY),D / FD CB 30 8A - RES $1,64(IY),E / FD CB 40 8B - RES $1,16(IY),H / FD CB 10 8C - RES $1,32(IY),L / FD CB 20 8D - RES $1,48(IY) / FD CB 30 8E - RES $1,64(IY),A / FD CB 40 8F - RES $2,16(IY),B / FD CB 10 90 - RES $2,32(IY),C / FD CB 20 91 - RES $2,48(IY),D / FD CB 30 92 - RES $2,64(IY),E / FD CB 40 93 - RES $2,16(IY),H / FD CB 10 94 - RES $2,32(IY),L / FD CB 20 95 - RES $2,48(IY) / FD CB 30 96 - RES $2,64(IY),A / FD CB 40 97 - RES $3,16(IY),B / FD CB 10 98 - RES $3,32(IY),C / FD CB 20 99 - RES $3,48(IY),D / FD CB 30 9A - RES $3,64(IY),E / FD CB 40 9B - RES $3,16(IY),H / FD CB 10 9C - RES $3,32(IY),L / FD CB 20 9D - RES $3,48(IY) / FD CB 30 9E - RES $3,64(IY),A / FD CB 40 9F - RES $4,16(IY),B / FD CB 10 A0 - RES $4,32(IY),C / FD CB 20 A1 - RES $4,48(IY),D / FD CB 30 A2 - RES $4,64(IY),E / FD CB 40 A3 - RES $4,16(IY),H / FD CB 10 A4 - RES $4,32(IY),L / FD CB 20 A5 - RES $4,48(IY) / FD CB 30 A6 - RES $4,64(IY),A / FD CB 40 A7 - RES $5,16(IY),B / FD CB 10 A8 - RES $5,32(IY),C / FD CB 20 A9 - RES $5,48(IY),D / FD CB 30 AA - RES $5,64(IY),E / FD CB 40 AB - RES $5,16(IY),H / FD CB 10 AC - RES $5,32(IY),L / FD CB 20 AD - RES $5,48(IY) / FD CB 30 AE - RES $5,64(IY),A / FD CB 40 AF - RES $6,16(IY),B / FD CB 10 B0 - RES $6,32(IY),C / FD CB 20 B1 - RES $6,48(IY),D / FD CB 30 B2 - RES $6,64(IY),E / FD CB 40 B3 - RES $6,16(IY),H / FD CB 10 B4 - RES $6,32(IY),L / FD CB 20 B5 - RES $6,48(IY) / FD CB 30 B6 - RES $6,64(IY),A / FD CB 40 B7 - RES $7,16(IY),B / FD CB 10 B8 - RES $7,32(IY),C / FD CB 20 B9 - RES $7,48(IY),D / FD CB 30 BA - RES $7,64(IY),E / FD CB 40 BB - RES $7,16(IY),H / FD CB 10 BC - RES $7,32(IY),L / FD CB 20 BD - RES $7,48(IY) / FD CB 30 BE - RES $7,64(IY),A / FD CB 40 BF - SET $0,16(IY),B / FD CB 10 C0 - SET $0,32(IY),C / FD CB 20 C1 - SET $0,48(IY),D / FD CB 30 C2 - SET $0,64(IY),E / FD CB 40 C3 - SET $0,16(IY),H / FD CB 10 C4 - SET $0,32(IY),L / FD CB 20 C5 - SET $0,48(IY) / FD CB 30 C6 - SET $0,64(IY),A / FD CB 40 C7 - SET $1,16(IY),B / FD CB 10 C8 - SET $1,32(IY),C / FD CB 20 C9 - SET $1,48(IY),D / FD CB 30 CA - SET $1,64(IY),E / FD CB 40 CB - SET $1,16(IY),H / FD CB 10 CC - SET $1,32(IY),L / FD CB 20 CD - SET $1,48(IY) / FD CB 30 CE - SET $1,64(IY),A / FD CB 40 CF - SET $2,16(IY),B / FD CB 10 D0 - SET $2,32(IY),C / FD CB 20 D1 - SET $2,48(IY),D / FD CB 30 D2 - SET $2,64(IY),E / FD CB 40 D3 - SET $2,16(IY),H / FD CB 10 D4 - SET $2,32(IY),L / FD CB 20 D5 - SET $2,48(IY) / FD CB 30 D6 - SET $2,64(IY),A / FD CB 40 D7 - SET $3,16(IY),B / FD CB 10 D8 - SET $3,32(IY),C / FD CB 20 D9 - SET $3,48(IY),D / FD CB 30 DA - SET $3,64(IY),E / FD CB 40 DB - SET $3,16(IY),H / FD CB 10 DC - SET $3,32(IY),L / FD CB 20 DD - SET $3,48(IY) / FD CB 30 DE - SET $3,64(IY),A / FD CB 40 DF - SET $4,16(IY),B / FD CB 10 E0 - SET $4,32(IY),C / FD CB 20 E1 - SET $4,48(IY),D / FD CB 30 E2 - SET $4,64(IY),E / FD CB 40 E3 - SET $4,16(IY),H / FD CB 10 E4 - SET $4,32(IY),L / FD CB 20 E5 - SET $4,48(IY) / FD CB 30 E6 - SET $4,64(IY),A / FD CB 40 E7 - SET $5,16(IY),B / FD CB 10 E8 - SET $5,32(IY),C / FD CB 20 E9 - SET $5,48(IY),D / FD CB 30 EA - SET $5,64(IY),E / FD CB 40 EB - SET $5,16(IY),H / FD CB 10 EC - SET $5,32(IY),L / FD CB 20 ED - SET $5,48(IY) / FD CB 30 EE - SET $5,64(IY),A / FD CB 40 EF - SET $6,16(IY),B / FD CB 10 F0 - SET $6,32(IY),C / FD CB 20 F1 - SET $6,48(IY),D / FD CB 30 F2 - SET $6,64(IY),E / FD CB 40 F3 - SET $6,16(IY),H / FD CB 10 F4 - SET $6,32(IY),L / FD CB 20 F5 - SET $6,48(IY) / FD CB 30 F6 - SET $6,64(IY),A / FD CB 40 F7 - SET $7,16(IY),B / FD CB 10 F8 - SET $7,32(IY),C / FD CB 20 F9 - SET $7,48(IY),D / FD CB 30 FA - SET $7,64(IY),E / FD CB 40 FB - SET $7,16(IY),H / FD CB 10 FC - SET $7,32(IY),L / FD CB 20 FD - SET $7,48(IY) / FD CB 30 FE - SET $7,64(IY),A / FD CB 40 FF diff --git a/as/target/x80/z80.c b/as/target/x80/z80.c @@ -8,7 +8,6 @@ static char sccsid[] = "@(#) ./as/target/x80/z80.c"; TUINT maxaddr = 0xFFFFFFFF; int endian = LITTLE_ENDIAN; -int left2right = 0; void iarch(void) diff --git a/as/target/x86/amd64.c b/as/target/x86/amd64.c @@ -5,7 +5,6 @@ static char sccsid[] = "@(#) ./as/target/x86/amd64.c"; TUINT maxaddr = 0xFFFFFFFFFFFFFFFF; int endian = LITTLE_ENDIAN; -int left2right = 0; void iarch(void) diff --git a/as/target/x86/i286.c b/as/target/x86/i286.c @@ -0,0 +1,53 @@ +static char sccsid[] = "@(#) ./as/target/x86/i286.c"; + +#include "../../../inc/scc.h" +#include "../../as.h" +#include "../x86/proc.h" + +TUINT maxaddr = 0xFFFF; +int endian = LITTLE_ENDIAN; +int left2right = 0; + +void +iarch(void) +{ + static struct { + char *name; + char type; + } regs[] = { + "CS", AREG_CS, + "DS", AREG_DS, + "SS", AREG_SS, + "ES", AREG_ES, + + "AX", AREG_AX, + "AL", AREG_AL, + "AH", AREG_AH, + + "BX", AREG_BX, + "BL", AREG_BL, + "BH", AREG_BH, + + "CX", AREG_CX, + "CL", AREG_CL, + "CH", AREG_CH, + + "DX", AREG_DX, + "DL", AREG_DL, + "DH", AREG_DH, + + "SI", AREG_SI, + "DI", AREG_DI, + + "SP", AREG_SP, + "BP", AREG_BP, + + NULL + }, *bp; + + for (bp = regs; bp->name; ++bp) { + Symbol *sym = lookup(bp->name); + sym->flags = FREG; + sym->value = bp->type; + } +} diff --git a/as/target/x86/i386.c b/as/target/x86/i386.c @@ -6,7 +6,6 @@ static char sccsid[] = "@(#) ./as/target/x86/i386.c"; TUINT maxaddr = 0xFFFFFFFF; int endian = LITTLE_ENDIAN; -int left2right = 0; void iarch(void) diff --git a/as/target/x86/ins.c b/as/target/x86/ins.c @@ -6,38 +6,296 @@ static char sccsid[] = "@(#) ./as/target/x86/ins.c"; #include "../../as.h" #include "proc.h" +#define addrbyte(mod, reg, rm) ((mod) << 6 | (reg) << 3 | (rm)) + +enum addr_mode { + MEM_MODE = 0, + MEM8_MODE = 1, + MEM16_MODE = 2, + REG_MODE = 3, +}; + +static int +getclass(Node *np) +{ + if (np->addr != AREG) + return 0; + + switch (np->sym->value) { + case AREG_AL: + case AREG_AH: + case AREG_BL: + case AREG_BH: + case AREG_CL: + case AREG_CH: + case AREG_DL: + case AREG_DH: + return R8CLASS; + + case AREG_AX: + case AREG_BX: + case AREG_CX: + case AREG_DX: + case AREG_DI: + case AREG_SI: + case AREG_SP: + case AREG_BP: + return R16CLASS; + + case AREG_CS: + case AREG_DS: + case AREG_SS: + case AREG_ES: + case AREG_FS: + case AREG_GS: + + case AREG_EFLAGS: + case AREG_CF: + case AREG_PF: + case AREG_AF: + case AREG_ZF: + case AREG_SF: + case AREG_TF: + case AREG_IF: + case AREG_DF: + case AREG_OF: + case AREG_IOPL: + case AREG_NT: + case AREG_RF: + case AREG_VM: + case AREG_AC: + case AREG_VIF: + case AREG_VIP: + case AREG_ID: + + case AREG_EAX: + case AREG_RAX: + + case AREG_EBX: + case AREG_RBX: + + case AREG_ECX: + case AREG_RCX: + + case AREG_EDX: + case AREG_RDX: + + case AREG_SIL: + case AREG_ESI: + case AREG_RSI: + case AREG_DIL: + case AREG_EDI: + case AREG_RDI: + + case AREG_SPL: + case AREG_ESP: + case AREG_RSP: + + case AREG_BPL: + case AREG_EBP: + case AREG_RBP: + + case AREG_R0: + case AREG_MM0: + case AREG_R1: + case AREG_MM1: + case AREG_R2: + case AREG_MM2: + case AREG_R3: + case AREG_MM3: + case AREG_R4: + case AREG_MM4: + case AREG_R5: + case AREG_MM5: + case AREG_R6: + case AREG_MM6: + case AREG_R7: + case AREG_MM7: + + case AREG_R8: + case AREG_R8L: + case AREG_R8W: + case AREG_R9: + case AREG_R9L: + case AREG_R9W: + case AREG_R10: + case AREG_R10L: + case AREG_R10W: + case AREG_R11: + case AREG_R11L: + case AREG_R11W: + case AREG_R12: + case AREG_R12L: + case AREG_R12W: + case AREG_R13: + case AREG_R13L: + case AREG_R13W: + case AREG_R14: + case AREG_R14L: + case AREG_R14W: + case AREG_R15: + case AREG_R15L: + case AREG_R15W: + + case AREG_XMM0: + case AREG_XMM1: + case AREG_XMM2: + case AREG_XMM3: + case AREG_XMM4: + case AREG_XMM5: + case AREG_XMM6: + case AREG_XMM7: + case AREG_XMM8: + case AREG_XMM9: + case AREG_XMM10: + case AREG_XMM11: + case AREG_XMM12: + case AREG_XMM13: + case AREG_XMM14: + case AREG_XMM15: + + case AREG_YMM0: + case AREG_YMM1: + case AREG_YMM2: + case AREG_YMM3: + case AREG_YMM4: + case AREG_YMM5: + case AREG_YMM6: + case AREG_YMM7: + case AREG_YMM8: + case AREG_YMM9: + case AREG_YMM10: + case AREG_YMM11: + case AREG_YMM12: + case AREG_YMM13: + case AREG_YMM14: + case AREG_YMM15: + + case AREG_MXCSR: + return 0; + default: + abort(); + } +} + int match(Op *op, Node **args) { unsigned char *p; - int a, olda; + int arg, class, rep, opt; + Node *np; if (!op->args) return args == NULL; - for (p = op->args; *p; ++p) { - if (*p != AREP) - a = *p; - else + opt = rep = 0; + for (p = op->args; arg = *p; ++p) { + if (rep) --p; + if ((np = *args++) == NULL) + return (rep|opt) != 0; - switch (a) { + switch (arg) { + case AOPT: + opt = 1; + break; + case AREP: + rep = 1; + break; + case AREG_R8CLASS: + class = R8CLASS; + goto check_class; + case AREG_R16CLASS: + class = R16CLASS; + check_class: + if ((getclass(np) & class) == 0) + return 0; + break; case AIMM8: case AIMM16: case AIMM32: case AIMM64: - case AREG_AL: - case AREG_AH: - case AREG_AX: - case AREG_EAX: + if (np->addr != AIMM) + return 0; + if (toobig(np, arg)) + error("overflow in immediate operand"); + break; + case ASYM: + if (np->addr != AIMM || np->op != IDEN) + return 0; + break; + case ADIRECT: + case ASTR: + if (np->addr != arg) + return 0; + break; default: abort(); } } - return 1; + + return *args == NULL; } Node * moperand(void) { } + +static int +reg8toint(Node *np) +{ + switch (np->sym->value) { + case AREG_AL: return 0; + case AREG_CL: return 1; + case AREG_DL: return 2; + case AREG_BL: return 3; + case AREG_AH: return 4; + case AREG_CH: return 5; + case AREG_DH: return 6; + case AREG_BH: return 7; + default: abort(); + } +} + +void +reg8_reg8(Op *op, Node **args) +{ + int src, dst; + char buf[2]; + + src = reg8toint(args[0]); + dst = reg8toint(args[1]); + buf[0] = op->bytes[0]; + buf[1] = addrbyte(REG_MODE, src, dst); + emit(buf, 2); +} + +static int +reg16toint(Node *np) +{ + switch (np->sym->value) { + case AREG_AX: return 0; + case AREG_CX: return 1; + case AREG_DX: return 2; + case AREG_BX: return 3; + case AREG_SP: return 4; + case AREG_BP: return 5; + case AREG_SI: return 6; + case AREG_DI: return 7; + default: abort(); + } +} + +void +reg16_reg16(Op *op, Node **args) +{ + int src, dst; + char buf[2]; + + src = reg16toint(args[0]); + dst = reg16toint(args[1]); + buf[0] = op->bytes[0]; + buf[1] = addrbyte(REG_MODE, src, dst); + emit(buf, 2); +} diff --git a/as/target/x86/proc.h b/as/target/x86/proc.h @@ -146,4 +146,12 @@ enum args { AREG_YMM15, AREG_MXCSR, + + AREG_R8CLASS, /* register class for 8 bit registers in i286 */ + AREG_R16CLASS, /* register class for 16 bit registers in i286 */ +}; + +enum class { + R8CLASS = 1 << 0, + R16CLASS = 1 << 1, }; diff --git a/as/target/x86/rules.dat b/as/target/x86/rules.dat @@ -1,7 +1,9 @@ -^imm8 AIMM8 -^imm16 AIMM16 -^imm32 AIMM32 -^imm64 AIMM64 -^\(n\) ADIRECT -^sym ASYM -^string ASTR +reg8 AREG_R8CLASS +reg16 AREG_R16CLASS +imm8 AIMM8 +imm16 AIMM16 +imm32 AIMM32 +imm64 AIMM64 +\(n\) ADIRECT +sym ASYM +string ASTR diff --git a/as/target/x86/x86.dat b/as/target/x86/x86.dat @@ -1,23 +1,28 @@ # Tab 16, tabs 16, :set ts=16 # op args size bytes format cpu -.DB imm8+ 0 none defb BITS16,BITS32,BITS64 -.DEFB imm8+ 0 none defb BITS16,BITS32,BITS64 -.BYTE imm8+ 0 none defb BITS16,BITS32,BITS64 -.DW imm16+ 0 none defw BITS16,BITS32,BITS64 -.DEFW imm16+ 0 none defw BITS16,BITS32,BITS64 -.SHORT imm16+ 0 none defw BITS16,BITS32,BITS64 -.WORD imm16+ 0 none defw BITS16 -.WORD imm32+ 0 none defd BITS32,BITS64 -.DD imm32+ 0 none defd BITS16,BITS32,BITS64 -.DEFD imm32+ 0 none defd BITS16,BITS32,BITS64 -.LONG imm32+ 0 none defd BITS16,BITS32 -.LONG imm64+ 0 none defq BITS64 -.INT imm32+ 0 none defd BITS32,BITS64 -.INT imm16+ 0 none defd BITS16 -.DQ imm64+ 0 none defq BITS16,BITS32,BITS64 -.DEFQ imm64+ 0 none defq BITS16,BITS32,BITS64 -.EQU imm16 0 none equ BITS16 -.EQU imm32 0 none equ BITS32 -.EQU imm64 0 none equ BITS64 -NOP none 1 0x90 noargs BITS16,BITS32,BITS64 -RET none 1 0xc3 noargs BITS16,BITS32,BITS64 +.DB imm8+ 0 none defb I286,I386,AMD64 +.DEFB imm8+ 0 none defb I286,I386,AMD64 +.BYTE imm8+ 0 none defb I286,I386,AMD64 +.DW imm16+ 0 none defw I286,I386,AMD64 +.DEFW imm16+ 0 none defw I286,I386,AMD64 +.SHORT imm16+ 0 none defw I286,I386,AMD64 +.WORD imm16+ 0 none defw I286 +.WORD imm32+ 0 none defd I386,AMD64 +.DD imm32+ 0 none defd I286,I386,AMD64 +.DEFD imm32+ 0 none defd I286,I386,AMD64 +.LONG imm32+ 0 none defd I286,I386 +.LONG imm64+ 0 none defq AMD64 +.INT imm32+ 0 none defd I386,AMD64 +.INT imm16+ 0 none defd I286 +.DQ imm64+ 0 none defq I286,I386,AMD64 +.DEFQ imm64+ 0 none defq I286,I386,AMD64 +.EQU imm16 0 none equ I286 +.EQU imm32 0 none equ I386 +.EQU imm64 0 none equ AMD64 +NOP none 1 0x90 noargs I286,I386,AMD64 +RET none 1 0xc3 noargs I286,I386,AMD64 + + +# 8 bit arithmetic operations +ADDB reg8,reg8 2 0x00 reg8_reg8 I286,I386,AMD64 +ADDW reg16,reg16 2 0x01 reg16_reg16 I286,I386,AMD64 diff --git a/as/target/z80.mk b/as/target/z80.mk @@ -1,9 +1,8 @@ -Z80_LST = target/x80/z80tbl.o target/x80/z80.o target/x80/ins.o - -$(Z80_LST): target/x80/proc.h +Z80_OBJ = $(OBJ) target/x80/z80tbl.o target/x80/z80.o target/x80/ins.o target/x80/z80tbl.c: gentbl.awk target/x80/x80.dat target/x80/rules.dat - LC_ALL=C ./gentbl.sh -f x80 -c z80 + ./gentbl.sh -f x80 -c z80 -OBJ-z80 = $(OBJ) $(Z80_LST) +$(LIBEXEC)/as-z80: $(OBJ) $(Z80_OBJ) + $(CC) $(SCC_LDFLAGS) $(Z80_OBJ) -lscc -o $@ diff --git a/as/test.sh b/as/test.sh @@ -1,46 +0,0 @@ -#!/bin/sh - -set -e -file=${1?} -exec >test.log -exec 2>&1 - -tmp1=`mktemp` -tmp2=`mktemp` - -trap "rm -f a.out $tmp1 $tmp2" 0 2 3 - -./as-$cpu $file - -sed -n '/^\// ! { - s%.*/%% - s%^[ ]*%% - s%[ ]*$%% - /^$/d - s%[ ][ ]*%\ -%g - p -}' $file | -nl -b a > $tmp1 - - -../objdump/objdump | -sed -n '/^data:/,$ { - /^data:/ ! { - s%.*:%% - s%^[ ]*%% - s%[ ]*$%% - /^$/d - s%[ ][ ]*%\ -%g - p - } -}' | -nl -b a > $tmp2 - -printf "test.s\n" -cat $tmp1 -printf "\nobjdump\n" -cat $tmp2 -printf "\ndiff\n" -diff -u $tmp1 $tmp2 diff --git a/cc1/Makefile b/cc1/Makefile @@ -1,33 +1,32 @@ .POSIX: -# Makefile is only used as a template for makefile. -# If you modify Makefile remember to run make dep - PROJECTDIR = .. include $(PROJECTDIR)/rules.mk -include $(LIBDIR)/libdep.mk +include $(LIBSCC)/libdep.mk -MOREFLAGS = -I$(PROJECTDIR)/inc/$(STD) $(CC1_CFLAGS) +MORECFLAGS = -I$(INCLUDE)/$(STD) OBJ = types.o decl.o lex.o error.o symbol.o main.o expr.o \ code.o stmt.o cpp.o fold.o init.o builtin.o -HDR = cc1.h \ - $(PROJECTDIR)/inc/scc.h \ - $(PROJECTDIR)/inc/$(STD)/cstd.h \ - $(PROJECTDIR)/inc/sysincludes.h +TARGETS = $(LIBEXEC)/cc1-amd64-sysv $(LIBEXEC)/cc1-arm64-sysv \ + $(LIBEXEC)/cc1-i386-sysv $(LIBEXEC)/cc1-z80-scc + +all: $(TARGETS) -all: - cp cc1-* $(PROJECTDIR)/rootdir/libexec/scc/ +$(TARGETS): $(LIBDIR)/libscc.a dep: - ./gendep.sh $(TARGETS) + $(PROJECTDIR)/mkdep.sh clean: rm -f *.o rm -f target/*/*.o - rm -f cc1-* + rm -f $(TARGETS) -distclean: clean - rm -f makefile +include target/amd64-sysv/arch.mk +include target/arm64-sysv/arch.mk +include target/i386-sysv/arch.mk +include target/z80-scc/arch.mk +include deps.mk diff --git a/cc1/deps.mk b/cc1/deps.mk @@ -0,0 +1,45 @@ +cpp.c: $(PROJECTDIR)/inc/$(STD)/cstd.h +decl.c: $(PROJECTDIR)/inc/$(STD)/cstd.h +expr.c: $(PROJECTDIR)/inc/$(STD)/cstd.h +init.c: $(PROJECTDIR)/inc/$(STD)/cstd.h +lex.c: $(PROJECTDIR)/inc/$(STD)/cstd.h +stmt.c: $(PROJECTDIR)/inc/$(STD)/cstd.h +symbol.c: $(PROJECTDIR)/inc/$(STD)/cstd.h +types.c: $(PROJECTDIR)/inc/$(STD)/cstd.h + +#deps +builtin.o: ../inc/scc.h +builtin.o: cc1.h +code.o: ../inc/scc.h +code.o: cc1.h +cpp.o: ../inc/scc.h +cpp.o: cc1.h +decl.o: ../inc/scc.h +decl.o: cc1.h +error.o: ../inc/scc.h +error.o: cc1.h +expr.o: ../inc/scc.h +expr.o: cc1.h +fold.o: ../inc/scc.h +fold.o: cc1.h +init.o: ../inc/scc.h +init.o: cc1.h +lex.o: ../inc/scc.h +lex.o: cc1.h +main.o: ../inc/arg.h +main.o: ../inc/scc.h +main.o: cc1.h +stmt.o: ../inc/scc.h +stmt.o: cc1.h +symbol.o: ../inc/scc.h +symbol.o: cc1.h +target/amd64-sysv/arch.o: target/amd64-sysv/../../../inc/scc.h +target/amd64-sysv/arch.o: target/amd64-sysv/../../cc1.h +target/arm64-sysv/arch.o: target/arm64-sysv/../../../inc/scc.h +target/arm64-sysv/arch.o: target/arm64-sysv/../../cc1.h +target/i386-sysv/arch.o: target/i386-sysv/../../../inc/scc.h +target/i386-sysv/arch.o: target/i386-sysv/../../cc1.h +target/z80-scc/arch.o: target/z80-scc/../../../inc/scc.h +target/z80-scc/arch.o: target/z80-scc/../../cc1.h +types.o: ../inc/scc.h +types.o: cc1.h diff --git a/cc1/gendep.sh b/cc1/gendep.sh @@ -1,27 +0,0 @@ -#!/bin/sh - -set -e - -rm -f makefile -trap "rm -f $$.mk" 0 2 3 - -re='\([^-]*\)-\([^-]*\)-\([^-]*\)-\([^-]*\)' - -echo $@ | -tr ' ' '\n' | -sed "s/$re/\1-\2/" | -sort -u | -(cat Makefile -echo -while read i -do - cat <<EOF -all: cc1-$i -OBJ-$i= \$(OBJ) target/$i/arch.o -\$(OBJ-$i): \$(HDR) -cc1-$i: \$(OBJ-$i) \$(LIBDIR)/libscc.a - \$(CC) \$(SCC_LDFLAGS) \$(OBJ-$i) -lscc -o \$@ - -EOF - echo -done) > $$.mk && mv $$.mk makefile diff --git a/cc1/lex.c b/cc1/lex.c @@ -197,7 +197,7 @@ repeat: newline(); break; default: - if (!isprint(c) && !ispunct(c)) + if (!isprint(c) && !ispunct(c) && !isspace(c)) warn("invalid input character. The shame of UB is yours"); break; } diff --git a/cc1/target/amd64-sysv/arch.mk b/cc1/target/amd64-sysv/arch.mk @@ -0,0 +1,5 @@ + +OBJ-amd64-sysv= $(OBJ) target/amd64-sysv/arch.o + +$(LIBEXEC)/cc1-amd64-sysv: $(OBJ-amd64-sysv) + $(CC) $(SCC_LDFLAGS) $(OBJ-amd64-sysv) -lscc -o $@ diff --git a/cc1/target/arm64-sysv/arch.c b/cc1/target/arm64-sysv/arch.c @@ -0,0 +1,220 @@ +static char sccsid[] = "@(#) ./cc1/arch/arm64-sysv/arch.c"; + +#include "../../../inc/scc.h" +#include "../../cc1.h" + +#define RANK_BOOL 0 +#define RANK_SCHAR 1 +#define RANK_UCHAR 1 +#define RANK_CHAR 1 +#define RANK_SHORT 2 +#define RANK_USHORT 2 +#define RANK_INT 3 +#define RANK_UINT 3 +#define RANK_LONG 4 +#define RANK_ULONG 4 +#define RANK_LLONG 5 +#define RANK_ULLONG 5 +#define RANK_FLOAT 6 +#define RANK_DOUBLE 7 +#define RANK_LDOUBLE 8 + +/* + * Initializaion of type pointers were done with + * a C99 initilizator '... = &(Type) {...', but + * c compiler in Plan9 gives error with this + * syntax, so I have switched it to this ugly form + * I hope I will change it again in the future + */ + +static Type types[] = { + { /* 0 = voidtype */ + .op = VOID, + .letter = L_VOID, + }, + { /* 1 = pvoidtype */ + .op = PTR, + .letter = L_POINTER, + .prop = TDEFINED, + .type = &types[5], /* chartype */ + .size = 8, + .align = 8, + }, + { /* 2 = booltype */ + .op = INT, + .letter = L_BOOL, + .prop = TDEFINED | TINTEGER | TARITH, + .size = 1, + .align = 1, + .n.rank = RANK_BOOL, + }, + { /* 3 = schartype */ + .op = INT, + .letter = L_INT8, + .prop = TDEFINED | TINTEGER | TARITH | TSIGNED, + .size = 1, + .align = 1, + .n.rank = RANK_SCHAR, + }, + { /* 4 = uchartype */ + .op = INT, + .letter = L_UINT8, + .prop = TDEFINED | TINTEGER | TARITH, + .size = 1, + .align = 1, + .n.rank = RANK_UCHAR, + }, + { /* 5 = chartype */ + .op = INT, + .letter = L_INT8, + .prop = TDEFINED | TINTEGER | TARITH | TSIGNED, + .size = 1, + .align = 1, + .n.rank = RANK_CHAR, + }, + { /* 6 = ushortype */ + .op = INT, + .letter = L_UINT16, + .prop = TDEFINED | TINTEGER | TARITH, + .size = 2, + .align = 2, + .n.rank = RANK_USHORT, + }, + { /* 7 = shortype */ + .op = INT, + .letter = L_INT16, + .prop = TDEFINED | TINTEGER | TARITH | TSIGNED, + .size = 2, + .align = 2, + .n.rank = RANK_SHORT, + }, + { /* 8 = uinttype */ + .op = INT, + .letter = L_UINT32, + .prop = TDEFINED | TINTEGER | TARITH, + .size = 4, + .align = 4, + .n.rank = RANK_UINT, + }, + { /* 9 = inttype */ + .op = INT, + .letter = L_INT32, + .prop = TDEFINED | TINTEGER | TARITH | TSIGNED, + .size = 4, + .align = 4, + .n.rank = RANK_INT, + }, + { /* 10 = longtype */ + .op = INT, + .letter = L_INT64, + .prop = TDEFINED | TINTEGER | TARITH | TSIGNED, + .size = 8, + .align = 8, + .n.rank = RANK_LONG, + }, + { /* 11 = ulongtype */ + .op = INT, + .letter = L_UINT64, + .prop = TDEFINED | TINTEGER | TARITH, + .size = 8, + .align = 8, + .n.rank = RANK_ULONG, + }, + { /* 12 = ullongtype */ + .op = INT, + .letter = L_UINT64, + .prop = TDEFINED | TINTEGER | TARITH, + .size = 8, + .align = 8, + .n.rank = RANK_ULLONG, + }, + { /* 13 = llongtype */ + .op = INT, + .letter = L_INT64, + .prop = TDEFINED | TINTEGER | TARITH | TSIGNED, + .size = 8, + .align = 8, + .n.rank = RANK_LLONG, + }, + { /* 14 = floattype */ + .op = FLOAT, + .letter = L_FLOAT, + .prop = TDEFINED | TARITH, + .size = 4, + .align = 4, + .n.rank = RANK_FLOAT, + }, + { /* 15 = doubletype */ + .op = FLOAT, + .letter = L_DOUBLE, + .prop = TDEFINED | TARITH, + .size = 8, + .align = 8, + .n.rank = RANK_DOUBLE, + }, + { /* 16 = ldoubletype */ + .op = FLOAT, + .letter = L_LDOUBLE, + .prop = TDEFINED | TARITH, + .size = 16, + .align = 16, + .n.rank = RANK_LDOUBLE, + }, + { /* 17 = sizettype */ + .op = INT, + .letter = L_UINT64, + .prop = TDEFINED | TINTEGER | TARITH, + .size = 8, + .align = 8, + .n.rank = RANK_UINT, + }, + { /* 18 = ellipsis */ + .op = ELLIPSIS, + .letter = L_ELLIPSIS, + .prop = TDEFINED, + }, + { /* 19 = pdifftype */ + .op = INT, + .letter = L_INT64, + .prop = TDEFINED | TINTEGER | TARITH | TSIGNED, + .size = 8, + .align = 8, + .n.rank = RANK_LONG, + }, + { /* 20 = va_type */ + .op = STRUCT, + .letter = L_VA_ARG, + .prop = TDEFINED, + .size = 24, + .align = 8, + }, +}; + +Type *voidtype = &types[0], *pvoidtype = &types[1], + *booltype = &types[2], *schartype = &types[3], + *uchartype = &types[4], *chartype = &types[5], + *ushortype = &types[6], *shortype = &types[7], + *uinttype = &types[8], *inttype = &types[9], + *longtype = &types[10], *ulongtype = &types[11], + *ullongtype = &types[12], *llongtype = &types[13], + *floattype = &types[14], *doubletype = &types[15], + *ldoubletype = &types[16], + *sizettype = &types[17], *pdifftype = &types[19], + *ellipsistype = &types[18], *va_type = &types[20], + *va_list_type; + +static Symbol dummy0 = {.u.i = 0, .type = &types[9]}, + dummy1 = {.u.i = 1, .type = &types[9]}; +Symbol *zero = &dummy0, *one = &dummy1; + +void +iarch(void) +{ + va_list_type = mktype(va_type, ARY, 1, NULL); +} + +int +valid_va_list(Type *tp) +{ + return tp->op == PTR && eqtype(tp->type, va_type, 1); +} diff --git a/cc1/target/arm64-sysv/arch.mk b/cc1/target/arm64-sysv/arch.mk @@ -0,0 +1,5 @@ + +OBJ-arm64-sysv= $(OBJ) target/arm64-sysv/arch.o + +$(LIBEXEC)/cc1-arm64-sysv: $(OBJ-arm64-sysv) + $(CC) $(SCC_LDFLAGS) $(OBJ-arm64-sysv) -lscc -o $@ diff --git a/cc1/target/i386-sysv/arch.mk b/cc1/target/i386-sysv/arch.mk @@ -0,0 +1,5 @@ + +OBJ-i386-sysv= $(OBJ) target/i386-sysv/arch.o + +$(LIBEXEC)/cc1-i386-sysv: $(OBJ-i386-sysv) + $(CC) $(SCC_LDFLAGS) $(OBJ-i386-sysv) -lscc -o $@ diff --git a/cc1/target/z80-scc/arch.mk b/cc1/target/z80-scc/arch.mk @@ -0,0 +1,5 @@ + +OBJ-z80-scc= $(OBJ) target/z80-scc/arch.o + +$(LIBEXEC)/cc1-z80-scc: $(OBJ-z80-scc) + $(CC) $(SCC_LDFLAGS) $(OBJ-z80-scc) -lscc -o $@ diff --git a/cc2/Makefile b/cc2/Makefile @@ -1,33 +1,35 @@ .POSIX: -# Makefile is only used as a template for makefile. -# If you modify Makefile remember to run make dep - PROJECTDIR = .. include $(PROJECTDIR)/rules.mk -include $(LIBDIR)/libdep.mk +include $(LIBSCC)/libdep.mk -MOREFLAGS = -I$(PROJECTDIR)/inc/$(STD) $(CC2_CFLAGS) +MORECFLAGS = -I$(PROJECTDIR)/inc/$(STD) OBJ = main.o parser.o peep.o symbol.o node.o code.o optm.o -HDR = cc2.h $(PROJECTDIR)/inc/$(STD)/cstd.h $(PROJECTDIR)/inc/scc.h -all: - cp cc2-* $(PROJECTDIR)/rootdir/libexec/scc/ +TARGETS = $(LIBEXEC)/cc2-amd64-sysv $(LIBEXEC)/cc2-i386-sysv \ + $(LIBEXEC)/cc2-qbe_amd64-sysv $(LIBEXEC)/cc2-z80-scc -dep: - MKQBE=${MKQBE} ./gendep.sh $(TARGETS) +all: $(TARGETS) -main.o: error.h +$(TARGETS): $(LIBDIR)/libscc.a + +dep: + $(PROJECTDIR)/mkdep.sh error.h: cc2.h rm -f $@; trap 'rm -f $$$$.h' EXIT INT QUIT ;\ awk -f generror.awk cc2.h > $$$$.h && mv $$$$.h $@ clean: - rm -f *.o + rm -f *.o error.h rm -f target/*/*.o - rm -f cc2-* error.h - -distclean: clean - rm -f makefile + rm -f $(TARGETS) + +include target/amd64-sysv/target.mk +include target/i386-sysv/target.mk +include target/qbe_amd64-sysv/target.mk +include target/qbe_arm64-sysv/target.mk +include target/z80-scc/target.mk +include deps.mk diff --git a/cc2/deps.mk b/cc2/deps.mk @@ -0,0 +1,61 @@ +parser.c: $(PROJECTDIR)/inc/$(STD)/cstd.h +target/amd64-sysv/code.o: $(INCLUDE)/$(STD)/cstd.h +target/i386-sysv/code.o: $(INCLUDE)/$(STD)/cstd.h +target/qbe/cgen.o: $(INCLUDE)/$(STD)/cstd.h +target/z80-scc/code.o: $(INCLUDE)/$(STD)/cstd.h + +#deps +code.o: ../inc/scc.h +code.o: cc2.h +main.o: ../inc/arg.h +main.o: ../inc/scc.h +main.o: cc2.h +main.o: error.h +node.o: ../inc/scc.h +node.o: cc2.h +optm.o: ../inc/scc.h +optm.o: cc2.h +parser.o: ../inc/scc.h +parser.o: cc2.h +peep.o: ../inc/scc.h +peep.o: cc2.h +symbol.o: ../inc/scc.h +symbol.o: cc2.h +target/amd64-sysv/cgen.o: target/amd64-sysv/../../../inc/scc.h +target/amd64-sysv/cgen.o: target/amd64-sysv/../../cc2.h +target/amd64-sysv/cgen.o: target/amd64-sysv/arch.h +target/amd64-sysv/code.o: target/amd64-sysv/../../../inc/scc.h +target/amd64-sysv/code.o: target/amd64-sysv/../../cc2.h +target/amd64-sysv/code.o: target/amd64-sysv/arch.h +target/amd64-sysv/optm.o: target/amd64-sysv/../../../inc/scc.h +target/amd64-sysv/optm.o: target/amd64-sysv/../../cc2.h +target/amd64-sysv/types.o: target/amd64-sysv/../../../inc/scc.h +target/amd64-sysv/types.o: target/amd64-sysv/../../cc2.h +target/i386-sysv/cgen.o: target/i386-sysv/../../../inc/scc.h +target/i386-sysv/cgen.o: target/i386-sysv/../../cc2.h +target/i386-sysv/cgen.o: target/i386-sysv/arch.h +target/i386-sysv/code.o: target/i386-sysv/../../../inc/scc.h +target/i386-sysv/code.o: target/i386-sysv/../../cc2.h +target/i386-sysv/code.o: target/i386-sysv/arch.h +target/i386-sysv/optm.o: target/i386-sysv/../../../inc/scc.h +target/i386-sysv/optm.o: target/i386-sysv/../../cc2.h +target/i386-sysv/types.o: target/i386-sysv/../../../inc/scc.h +target/i386-sysv/types.o: target/i386-sysv/../../cc2.h +target/qbe/cgen.o: target/qbe/../../../inc/scc.h +target/qbe/cgen.o: target/qbe/../../cc2.h +target/qbe/cgen.o: target/qbe/arch.h +target/qbe/code.o: target/qbe/../../../inc/scc.h +target/qbe/code.o: target/qbe/../../cc2.h +target/qbe/code.o: target/qbe/arch.h +target/qbe/optm.o: target/qbe/../../../inc/scc.h +target/qbe/optm.o: target/qbe/../../cc2.h +target/z80-scc/cgen.o: target/z80-scc/../../../inc/scc.h +target/z80-scc/cgen.o: target/z80-scc/../../cc2.h +target/z80-scc/cgen.o: target/z80-scc/arch.h +target/z80-scc/code.o: target/z80-scc/../../../inc/scc.h +target/z80-scc/code.o: target/z80-scc/../../cc2.h +target/z80-scc/code.o: target/z80-scc/arch.h +target/z80-scc/optm.o: target/z80-scc/../../../inc/scc.h +target/z80-scc/optm.o: target/z80-scc/../../cc2.h +target/z80-scc/types.o: target/z80-scc/../../../inc/scc.h +target/z80-scc/types.o: target/z80-scc/../../cc2.h diff --git a/cc2/gendep.sh b/cc2/gendep.sh @@ -1,39 +0,0 @@ -#!/bin/sh - -gentarget() -{ - - cat <<EOF -include target/$1/target.mk -\$(OBJ-$1): \$(HDR) -all: cc2-$1 -cc2-$1: \$(OBJ-$1) \$(LIBDIR)/libscc.a - \$(CC) \$(SCC_LDFLAGS) \$(OBJ-$1) -lscc -o \$@ - -EOF -} - -set -e - -rm -f makefile -trap "rm -f $$.mk" 0 2 3 - -re='\([^-]*\)-\([^-]*\)-\([^-]*\)-\([^-]*\)' - -echo $@ | -tr ' ' '\n' | -sed "s/$re/\1-\2/" | -sort -u | -(cat Makefile -while read i -do - if test ${MKQBE:-0} -eq 1 - then - case $i in - amd64-sysv) - gentarget qbe_$i - ;; - esac - fi - gentarget $i -done) > $$.mk && mv $$.mk makefile diff --git a/cc2/target/amd64-sysv/target.mk b/cc2/target/amd64-sysv/target.mk @@ -1,5 +1,9 @@ + OBJ-amd64-sysv = $(OBJ) \ target/amd64-sysv/cgen.o \ target/amd64-sysv/optm.o \ target/amd64-sysv/code.o \ target/amd64-sysv/types.o + +$(LIBEXEC)/cc2-amd64-sysv: $(OBJ-amd64-sysv) + $(CC) $(SCC_LDFLAGS) $(OBJ-amd64-sysv) -lscc -o $@ diff --git a/cc2/target/i386-sysv/target.mk b/cc2/target/i386-sysv/target.mk @@ -1,5 +1,9 @@ + OBJ-i386-sysv = $(OBJ) \ target/i386-sysv/cgen.o \ target/i386-sysv/optm.o \ target/i386-sysv/code.o \ target/i386-sysv/types.o + +$(LIBEXEC)/cc2-i386-sysv: $(OBJ-i386-sysv) + $(CC) $(SCC_LDFLAGS) $(OBJ-i386-sysv) -lscc -o $@ diff --git a/cc2/target/qbe_amd64-sysv/target.mk b/cc2/target/qbe_amd64-sysv/target.mk @@ -1,5 +1,9 @@ + OBJ-qbe_amd64-sysv = $(OBJ) \ target/qbe/cgen.o \ target/qbe/optm.o \ target/qbe/code.o \ target/amd64-sysv/types.o + +$(LIBEXEC)/cc2-qbe_amd64-sysv: $(OBJ-qbe_amd64-sysv) + $(CC) $(SCC_LDFLAGS) $(OBJ-qbe_amd64-sysv) -lscc -o $@ diff --git a/cc2/target/qbe_arm64-sysv/target.mk b/cc2/target/qbe_arm64-sysv/target.mk @@ -1,4 +1,4 @@ -OBJ-qbe_amd64-sysv = $(OBJ) \ +OBJ-qbe_arm64-sysv = $(OBJ) \ target/qbe/cgen.o \ target/qbe/optm.o \ target/qbe/code.o \ diff --git a/cc2/target/z80-scc/target.mk b/cc2/target/z80-scc/target.mk @@ -1,6 +1,9 @@ + OBJ-z80-scc = $(OBJ) \ target/z80-scc/cgen.o \ target/z80-scc/optm.o \ target/z80-scc/code.o \ target/z80-scc/types.o +$(LIBEXEC)/cc2-z80-scc: $(OBJ-z80-scc) + $(CC) $(SCC_LDFLAGS) $(OBJ-z80-scc) -lscc -o $@ diff --git a/config.mk b/config.mk @@ -0,0 +1,30 @@ +# scc version +VERSION = 0.1 + +## Customize below to fit your system +DRIVER = posix + +# Can be c89 or c99 +STD = c99 + +# paths +PREFIX = $(PWD)/$(PROJECTDIR)/rootdir +MANPREFIX = $(PREFIX)/share/man + +# scc expects to be built by a C99 compiler +# if your system is not at least POSIX 2004 compatible, adjust CC +# CC = c99 +# AR = ar +AS = as + +### Systems +# Plan9 +#SYSCFLAGS = -D_SUSV2_SOURCE +#SYSLDCFLAGS = +#STDCFLAGS = +### +# BSD +#SYSCFLAGS = +#SYSLDCFLAGS = +#STDCFLAGS = -D_ISOC99_SOURCE -D_ANSI_SOURCE +### diff --git a/config.mk.def b/config.mk.def @@ -1,32 +0,0 @@ -# scc version -VERSION = 0.1 - -## Customize below to fit your system -# TARGETS is defined by a list of backend-arch-abi-sys. First -# element of the list becomes the default target - -TARGETS = amd64-sysv-linux-elf \ - z80-scc-none-none \ - i386-sysv-linux-elf \ - amd64-sysv-openbsd-elf - -# USEQBE selects QBE by default in the targets that support it -USEQBE = 1 - -#MKQBE enable build of qbe backends -MKQBE = 1 - -DRIVER = posix - -# Can be c89 or c99 -STD = c99 - -# paths -PREFIX = $(HOME) -MANPREFIX = $(PREFIX)/share/man - -# scc expects to be built by a C99 compiler -# if your system is not at least POSIX 2004 compatible, adjust CC -# CC = c99 -# AR = ar -AS = as diff --git a/config.sh b/config.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +case `uname` in +*BSD) + sys=BSD + ;; +*Plan9) + sys=Plan9 + ;; +*) + exit + ;; +esac + + +(echo '/^# '$sys'/+;/^###$/- s/^#//'; echo w) | ed -s config.mk diff --git a/configure b/configure @@ -1,15 +0,0 @@ -#!/bin/sh - -if [ ! -e config.mk ] -then - printf '%s\n' 'Generating config.mk from defaults...' \ - '(edit it for customization and then re-run this script)' - trap "rm -f $$.mk" 0 2 3; \ - (cat config.mk.def ;\ - sed -n '/^# '`uname`'/,/^$$/p' system.mk) > $$.mk && \ - mv $$.mk config.mk -fi - -printf 'Generating arch-dependant build files...\n' -make dep > /dev/null && \ -printf 'You can now install scc with “make install”\n' diff --git a/driver/Makefile b/driver/Makefile @@ -7,4 +7,4 @@ DRIVER = posix include $(PROJECTDIR)/rules.mk all dep clean distclean: - +cd $(DRIVER) && $(MAKE) $@ + +@cd $(DRIVER) && $(MAKE) $@ diff --git a/driver/posix/Makefile b/driver/posix/Makefile @@ -1,30 +1,26 @@ .POSIX: PROJECTDIR = ../.. -LIBDIR = $(PROJECTDIR)/lib/scc include $(PROJECTDIR)/rules.mk -include $(LIBDIR)/libdep.mk +include $(LIBSCC)/libdep.mk +include $(INCLUDE)/incdep.mk -OBJ = scc.o -HDR = config.h \ - $(PROJECTDIR)/inc/scc.h \ - $(PROJECTDIR)/inc/arg.h \ - $(PROJECTDIR)/inc/syslibs.h \ - $(PROJECTDIR)/inc/ldflags.h +# SYSLST is a list of backend-arch-abi-sys. First +# element of the list becomes the default target -all: scc cpp - mkdir -p $(PROJECTDIR)/rootdir/bin - cp scc cpp $(PROJECTDIR)/rootdir/bin/ +SYSLST = amd64-sysv-linux-elf z80-scc-none-none \ + i386-sysv-linux-elf amd64-sysv-openbsd-elf -dep: - PREFIX=$(PREFIX) USEQBE=$(USEQBE) ./gendep.sh $(TARGETS) +STDCFLAGS = + +TARGETS = $(BINDIR)/scc $(BINDIR)/scpp -$(OBJ): $(HDR) +all: $(TARGETS) -scc: $(OBJ) $(LIBDIR)/libscc.a - $(CC) $(SCC_LDFLAGS) $(OBJ) -lscc -o $@ +$(BINDIR)/scc: scc.o $(LIBDIR)/libscc.a + $(CC) $(SCC_LDFLAGS) scc.o -lscc -o $@ -cpp: cpp.sh config.h +$(BINDIR)/scpp: cpp.sh config.h set -x ;\ trap "rm -f $$$$.sh" 0 2 3;\ rm -f $@ ;\ @@ -32,11 +28,15 @@ cpp: cpp.sh config.h chmod +x $$$$.sh && \ mv $$$$.sh $@ -clean: - rm -f $(OBJ) - rm -f scc - rm -f scpp +config.h: + PREFIX=$(PREFIX) ./config.sh $(SYSLST) -distclean: clean +dep: + $(PROJECTDIR)/mkdep.sh + +clean: + rm -f scc scpp *.o + rm -f $(TARGETS) rm -f config.h +include deps.mk diff --git a/driver/posix/config.sh b/driver/posix/config.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +set -e + +rm -f config.h +trap "rm -f $$.h" 0 2 3 + +PREFIX=${PREFIX-$HOME} + +echo $@ | +(IFS='- ' read arch abi sys format r +echo \#define PREFIX \"$PREFIX\" +echo \#define ARCH \"$arch\" +echo \#define SYS \"$sys\" +echo \#define ABI \"$abi\" +echo \#define FORMAT \"$format\") > $$.h && mv $$.h config.h diff --git a/driver/posix/deps.mk b/driver/posix/deps.mk @@ -0,0 +1,8 @@ +#deps +scc.o: ../../inc/arg.h +scc.o: ../../inc/ldflags.h +scc.o: ../../inc/scc.h +scc.o: ../../inc/syscrts.h +scc.o: ../../inc/sysincludes.h +scc.o: ../../inc/syslibs.h +scc.o: config.h diff --git a/driver/posix/gendep.sh b/driver/posix/gendep.sh @@ -1,18 +0,0 @@ -#!/bin/sh - -set -e - -rm -f config.h -trap "rm -f $$.h" 0 2 3 - -PREFIX=${PREFIX-$HOME} -USEQBE=${USEQBE:-1} - -echo $@ | -(IFS='- ' read arch abi sys format r -echo \#define PREFIX \"$PREFIX\" -echo \#define USEQBE $USEQBE -echo \#define ARCH \"$arch\" -echo \#define SYS \"$sys\" -echo \#define ABI \"$abi\" -echo \#define FORMAT \"$format\") > $$.h && mv $$.h config.h diff --git a/driver/posix/scc.c b/driver/posix/scc.c @@ -16,6 +16,8 @@ static char sccsid[] = "@(#) ./driver/posix/scc.c"; #include "config.h" #include "../../inc/arg.h" #include "../../inc/scc.h" +#include "../../inc/syscrts.h" +#include "../../inc/sysincludes.h" #include "../../inc/syslibs.h" #include "../../inc/ldflags.h" @@ -58,7 +60,7 @@ static char *prefix, *objfile, *outfile; static char *tmpdir; static size_t tmpdirln; static struct items objtmp, objout; -static int Mflag, Eflag, Sflag, cflag, dflag, kflag, sflag, Qflag = USEQBE; +static int Mflag, Eflag, Sflag, cflag, dflag, kflag, sflag, Qflag = 1; /* TODO: Remove Qflag */ static int devnullfd = -1; extern int failure; @@ -118,6 +120,10 @@ inittool(int tool) switch (tool) { case CC1: + for (n = 0; sysincludes[n]; ++n) { + addarg(tool, "-I"); + addarg(tool, sysincludes[n]); + } case CC2: fmt = (qbe(tool)) ? "%s-qbe_%s-%s" : "%s-%s-%s"; n = snprintf(t->bin, sizeof(t->bin), fmt, t->cmd, arch, abi); @@ -139,14 +145,19 @@ inittool(int tool) addarg(tool, "-L"); addarg(tool, syslibs[n]); } + if (syscrts[0]) { + for (n = 0; syscrts[n]; ++n) + addarg(tool, syscrts[n]); + break; + } n = snprintf(NULL, 0, - "%s/lib/scc/crt/%s-%s-%s/crt.o", + "%s/lib/scc/%s-%s-%s/crt.o", prefix, arch, abi, sys); if (n < 0) die("scc: wrong crt file name"); crt = xmalloc(++n); sprintf(crt, - "%s/lib/scc/crt/%s-%s-%s/crt.o", + "%s/lib/scc/%s-%s-%s/crt.o", prefix, arch, abi, sys); addarg(tool, crt); break; diff --git a/inc/Makefile b/inc/Makefile @@ -3,31 +3,35 @@ PROJECTDIR = .. include $(PROJECTDIR)/rules.mk +include inclst.mk -HDR = ldflags.h sysincludes.h syslibs.h +all: config -all: +config: $(SYSHDR) -dep: $(HDR) - -ldflags.h: +$(INCLUDE)/ldflags.h: rm -f $@ ; \ trap "rm -f $$$$.h" 0 2 3; \ cat < ldflags.def.h > $$$$.h; \ mv $$$$.h $@ -sysincludes.h: +$(INCLUDE)/syscrts.h: + rm -f $@ ; \ + trap "rm -f $$$$.h" 0 2 3; \ + sed 's,PREFIX,"$(PREFIX)",g' < syscrts.def.h > $$$$.h && \ + mv $$$$.h $@ + +$(INCLUDE)/sysincludes.h: rm -f $@ ; \ trap "rm -f $$$$.h" 0 2 3; \ sed 's,PREFIX,"$(PREFIX)",g' < sysincludes.def.h > $$$$.h && \ mv $$$$.h $@ -syslibs.h: +$(INCLUDE)/syslibs.h: rm -f $@ ; \ trap "rm -f $$$$.h" 0 2 3; \ sed 's,PREFIX,"$(PREFIX)",g' < syslibs.def.h > $$$$.h && \ mv $$$$.h $@ -clean: distclean: - rm -f $(HDR) + rm -f $(SYSHDR) diff --git a/inc/coff32/aouthdr.h b/inc/coff32/aouthdr.h @@ -12,4 +12,12 @@ struct aouthdr { long data_start; /* base of data segment */ }; -typedef struct aouthdr AOUTHDR; +#define AOUTHDR struct aouthdr +#define AOUTSZ sizeof(AOUTHDR) + +#define QMAGIC 0314 +#define STMAGIC 0401 +#define OMAGIC 0404 +#define JMAGIC 0407 +#define DMAGIC 0410 +#define ZMAGIC 0413 diff --git a/inc/coff32/coff32.h b/inc/coff32/coff32.h @@ -0,0 +1,22 @@ + +typedef int (*packfun)(unsigned char *, char *, ...); + +#ifdef AOUTHDR +extern void coff32_pack_aout(packfun fun, unsigned char *buff, AOUTHDR *aout); +extern void coff32_unpack_aout(packfun fun, unsigned char *buff, AOUTHDR *ent); +#endif + +#ifdef SYMENT +extern void coff32_pack_ent(packfun fun, unsigned char *buff, SYMENT *ent); +extern void coff32_unpack_ent(packfun fun, unsigned char *buff, SYMENT *ent); +#endif + +#ifdef FILHDR +extern void coff32_pack_hdr(packfun fun, unsigned char *buff, FILHDR *hdr); +extern void coff32_unpack_hdr(packfun fun, unsigned char *buff, FILHDR *hdr); +#endif + +#ifdef SCNHDR +extern void coff32_pack_scn(packfun fun, unsigned char *buff, SCNHDR *scn); +extern void coff32_unpack_scn(packfun fun, unsigned char *buff, SCNHDR *scn); +#endif diff --git a/inc/coff32/filehdr.h b/inc/coff32/filehdr.h @@ -14,12 +14,18 @@ struct filehdr { #define FILHDR struct filehdr #define FILHSZ 20 -#define F_RELFLG (1 << 0) -#define F_EXEC (1 << 1) -#define F_LMNO (1 << 2) -#define F_SYMS (1 << 3) -#define F_AR16WR (1 << 4) -#define F_AR32WR (1 << 5) -#define F_A32WR (1 << 6) +#define F_RELFLG 0000001 +#define F_EXEC 0000002 +#define F_LMNO 0000004 +#define F_SYMS 0000010 +#define F_MINMAL 0000020 +#define F_UPDATE 0000040 +#define F_SWADB 0000100 +#define F_AR16WR 0000200 +#define F_AR32WR 0000400 +#define F_A32WR 0001000 +#define F_PATCH 0002000 +#define F_NODF 0002000 +#define COFF_I386MAGIC 0x014c #define COFF_Z80MAGIC 0x805a diff --git a/inc/incdep.mk b/inc/incdep.mk @@ -0,0 +1,7 @@ +include $(INCLUDE)/inclst.mk + +debug: + echo $(SYSHDR) + +$(SYSHDR): + +@cd $(INCLUDE) && $(MAKE) diff --git a/inc/inclst.mk b/inc/inclst.mk @@ -0,0 +1,4 @@ +SYSHDR = $(INCLUDE)/ldflags.h\ + $(INCLUDE)/syscrts.h\ + $(INCLUDE)/sysincludes.h\ + $(INCLUDE)/syslibs.h diff --git a/inc/ldflags.def.h b/inc/ldflags.def.h @@ -1,6 +1,5 @@ char *ldflags[] = { "-static", - /* on OpenBSD, disable pie */ - /* "-nopie", */ + "-z","nodefaultlib", NULL }; diff --git a/inc/syscrts.def.h b/inc/syscrts.def.h @@ -0,0 +1,5 @@ +char *syscrts[] = { + /* configure below your system crts */ + /* PREFIX "/lib/scc/crt.o", */ + NULL +}; diff --git a/inc/sysincludes.def.h b/inc/sysincludes.def.h @@ -1,6 +1,6 @@ char *sysincludes[] = { PREFIX "/include/scc/" , - PREFIX "/include/scc/bits/" TARGET "/", + PREFIX "/include/scc/bits/" ARCH "-" ABI "/", /* configure below your standard sys include paths */ PREFIX "/include/", PREFIX "/local/include/", diff --git a/inc/syslibs.def.h b/inc/syslibs.def.h @@ -1,4 +1,7 @@ -char *syslibs[] = { + +#define MAX_LIB_PATHS 32 + +char *syslibs[MAX_LIB_PATHS + 1] = { PREFIX "/lib/scc/" , /* configure below your standard sys include paths */ PREFIX "/lib/", diff --git a/ld/Makefile b/ld/Makefile @@ -2,32 +2,22 @@ PROJECTDIR = .. include $(PROJECTDIR)/rules.mk -include $(LIBDIR)/libdep.mk +include $(LIBSCC)/libdep.mk +include $(LIBCOFF32)/libdep.mk -OBJ = main.o formats.o coff32.o obj.o +OBJ = main.o coff32.o obj.o +LIB = $(LIBDIR)/libscc.a $(LIBDIR)/libcoff32.a +TARGET = ld -all: ld - cp ld $(PROJECTDIR)/rootdir/bin +all: $(TARGET) -ld: $(OBJ) $(LIBDIR)/libscc.a - $(CC) $(SCC_LDFLAGS) $(OBJ) -lscc -o $@ +$(TARGET): $(OBJ) $(LIB) + $(CC) $(SCC_LDFLAGS) $(OBJ) -lcoff32 -lscc -o $@ dep: $(PROJECTDIR)/mkdep.sh clean: - rm -f ld *.o + rm -f $(BINDIR)/ld *.o -distclean: clean - -#deps -coff32.c: ../inc/coff32/filehdr.h -coff32.c: ../inc/coff32/scnhdr.h -coff32.c: ../inc/coff32/syms.h -coff32.c: ../inc/scc.h -coff32.c: ld.h -formats.c: ld.h -main.c: ../inc/arg.h -main.c: ../inc/ar.h -main.c: ../inc/scc.h -main.c: ld.h +include deps.mk diff --git a/ld/coff32.c b/ld/coff32.c @@ -1,103 +1,271 @@ static char sccsid[] = "@(#) ./ld/coff32.c"; #include <assert.h> +#include <ctype.h> #include <errno.h> +#include <limits.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include "../inc/coff32/aouthdr.h" #include "../inc/coff32/filehdr.h" #include "../inc/coff32/scnhdr.h" #include "../inc/coff32/syms.h" +#include "../inc/coff32/coff32.h" #include "../inc/scc.h" #include "ld.h" -static int (*unpack)(unsigned char *, char *, ...); -static long strtbl, symtbl, sectbl; +#define NUMSCN_MAX 65536 +#define NUMENT_MAX 2147483648 -static FILHDR * -getfhdr(unsigned char *buff, FILHDR *hdr) -{ - int n; - - n = (*unpack)(buff, - "sslllss", - &hdr->f_magic, - &hdr->f_nscns, - &hdr->f_timdat, - &hdr->f_symptr, - &hdr->f_nsyms, - &hdr->f_opthdr, - &hdr->f_flags); - assert(n == FILHSZ); - return hdr; -} +static long textpc = 0x1000; -static void -pass1(char *fname, char *member, FILE *fp) +/* + * check overflow in: off + ptr + nitem*size + */ +static char * +symname(Obj *obj, SYMENT *ent) { - unsigned char buff[FILHSZ]; - FILHDR *hdr; - Obj *obj; - long siz, pos = ftell(fp); - char *str; + long off; - if (fread(buff, FILHSZ, 1, fp) != 1) - goto bad_file; + if (ent->n_zeroes != 0) + return ent->n_name; - if ((hdr = malloc(sizeof(*hdr))) == NULL) - goto out_of_memory; + off = ent->n_offset; + if (off >= obj->strsiz) { + fprintf(stderr, + "ld: invalid offset in symbol table: %zd\n", off); + return ""; + } - obj = newobj(fname); - obj->hdr = getfhdr(buff, hdr); + return &obj->strtbl[off]; +} - /* TODO: Check overflow */ - strtbl = pos + hdr->f_symptr + hdr->f_nsyms* SYMESZ; - symtbl = pos + hdr->f_symptr; - sectbl = pos + FILHSZ + hdr->f_opthdr; +static int +readstr(Obj *obj, long off) +{ + unsigned char buff[4]; + char *str; + size_t siz; - if (fseek(fp, strtbl, SEEK_SET) == EOF) - goto bad_file; + if (fseek(obj->fp, off, SEEK_SET) == EOF) + return -1; - if (fread(buff, 4, 1, fp) != 1) - goto bad_file; + if (fread(buff, 4, 1, obj->fp) != 1) + return -1; - (*unpack)(buff, "l", &siz); + (*obj->unpack)(buff, "l", &siz); + + siz -= 4; + if (siz == 0) { + obj->strtbl = NULL; + obj->strsiz = 0; + return 0; + } if (siz > SIZE_MAX || (str = malloc(siz)) == NULL) - goto out_of_memory; + outmem(); - if (fread(str, siz, 1, fp) != 1) - goto bad_file; + if (fread(str, siz, 1, obj->fp) != 1) + return -1; obj->strtbl = str; + obj->strsiz = siz; -out_of_memory: - die("ld: out of memory"); -bad_file: - if (ferror(fp)) - die("ld: %s: %s", fname, strerror(errno)); - die("ld: %s: corrupted file", fname); + return 0; } -static void -pass2(char *fname, char *member, FILE *fp) +static int +readsects(Obj *obj, long off) { + unsigned a, nsec, i; + unsigned char buff[SCNHSZ]; + SCNHDR *scns, *p; + FILHDR *hdr; + Symbol *sym; + Section *sp; + + hdr = obj->filhdr; + nsec = hdr->f_nscns; + + scns = NULL; + if (nsec <= SIZE_MAX / sizeof(*scns)) + scns = malloc(nsec * sizeof(*scns)); + if (!scns) + outmem(); + obj->scnhdr = scns; + + if (fseek(obj->fp, off, SEEK_SET) == EOF) + return -1; + + a = obj->align - 1; + for (i = 0; i < nsec; ++i) { + p = &scns[i]; + if (fread(buff, SCNHSZ, 1, obj->fp) != 1) + return -1; + coff32_unpack_scn(obj->unpack, buff, p); + sp = slookup(p->s_name); + p->s_vaddr = sp->base + sp->size; + sp->size += p->s_size; + } + + return 0; } static int +readents(Obj *obj, long off) +{ + SYMENT *ent, *ents; + SCNHDR *scn, *scns = obj->scnhdr; + FILHDR *hdr = obj->filhdr;; + long nsyms = hdr->f_nsyms; + unsigned nsect; + unsigned char buff[SYMESZ]; + char *s; + int aux; + Symbol *sym; + + + if (fseek(obj->fp, off, SEEK_SET) == EOF) + return -1; + + ents = NULL; + if (nsyms <= SIZE_MAX/sizeof(SYMENT)) + ents = malloc((nsyms * sizeof(SYMENT))); + if (!ents) + outmem(); + obj->enthdr = ents; + + aux = 0; + for (ent = ents; ent < &ents[nsyms]; ++ent) { + if (fread(buff, SYMESZ, 1, obj->fp) != 1) + return -1; + coff32_unpack_ent(obj->unpack, buff, ent); + s = ent->n_name; + if (!s[0] && !s[1] && !s[2] && !s[3]) + (*obj->unpack)(buff, "ll", &ent->n_zeroes, &ent->n_offset); + + if (aux > 0) { + aux--; + continue; + } + aux = ent->n_numaux; + + scn = NULL; + switch (ent->n_scnum) { + case N_DEBUG: + continue; + case N_ABS: + break; + case N_UNDEF: + /* TODO: deal wth common blocks */ + break; + default: + nsect = ent->n_scnum-1; + if (nsect >= hdr->f_nscns) + corrupted(obj->fname, obj->member); + scn = &scns[nsect]; + ent->n_value += scn->s_vaddr; + } + + if (ent->n_sclass == C_EXT && ent->n_scnum != N_UNDEF) { + Symbol *sym = lookup(symname(obj, ent), INSTALL); + + if (sym->flags & SDEFINED) { + redefined(obj, sym); + } else { + sym->flags |= SDEFINED; + sym->where = obj; + if (scn) + sym->section = slookup(scn->s_name); + } + } + } + + return 0; +} + +static long +fileptr(long off, long ptr, long nitem, long size) +{ + if (off < 0 || ptr < 0 || nitem < 0 || size < 0) + return -1; + + if (off > LONG_MAX - ptr) + return -1; + off += ptr; + + if (size > 0) { + if (nitem > LONG_MAX / size) + return -1; + size *= nitem; + } + + if (off > LONG_MAX - size) + return -1; + off += size; + + return off; +} + +Obj * +load(Obj *obj) +{ + unsigned char buff[FILHSZ]; + FILHDR *hdr; + char *strtbl; + long symoff, secoff, stroff, pos; + + pos = ftell(obj->fp); + if (fread(buff, FILHSZ, 1, obj->fp) != 1) + goto bad_file; + + if ((hdr = malloc(sizeof(*hdr))) == NULL) + outmem(); + coff32_unpack_hdr(obj->unpack, buff, hdr); + obj->filhdr = hdr; + + stroff = fileptr(pos, hdr->f_symptr, hdr->f_nsyms, SYMESZ); + symoff = fileptr(pos, hdr->f_symptr, 0, 0); + secoff = fileptr(pos, hdr->f_opthdr, 1, FILHSZ); + + if (stroff < 0 || symoff < 0 || secoff < 0) + goto bad_file; + + if (readstr(obj, stroff) < 0) + goto bad_file; + if (readsects(obj, secoff) < 0) + goto bad_file; + if (readents(obj, symoff) < 0) + goto bad_file; + return add(obj); + +bad_file: + fprintf(stderr, + "ld: %s: %s\n", + obj->fname, + (ferror(obj->fp)) ? strerror(errno) : "corrupted file"); + exit(EXIT_FAILURE); +} + +Obj * probe(char *fname, char *member, FILE *fp) { int c; int c1, c2; - fpos_t pos; + long pos; unsigned short magic; + unsigned align; + int (*unpack)(unsigned char *, char *, ...); + int (*pack)(unsigned char *, char *, ...); + Obj *obj; - fgetpos(fp, &pos); + pos = ftell(fp); c1 = getc(fp); c2 = getc(fp); - fsetpos(fp, &pos); + fseek(fp, pos, SEEK_SET); if (ferror(fp)) die("ld: %s: %s", fname, strerror(errno)); @@ -107,15 +275,129 @@ probe(char *fname, char *member, FILE *fp) magic = c1 | c2 << 8; switch (magic) { + case COFF_I386MAGIC: case COFF_Z80MAGIC: - return 1; + unpack = lunpack; + pack = lpack; + align = 2; + break; default: - return 0; + return NULL; } + + obj = newobj(fname, member, fp); + obj->unpack = unpack; + obj->align = align; + obj->offset = pos; + + return obj; } -struct objfile coff32 = { - .probe = probe, - .pass1 = pass1, - .pass2 = pass2, -}; +static void +wrhdr(FILE *fp) +{ + FILHDR hdr; + Section *sp; + unsigned char buff[FILHSZ]; + + if (numsects > NUMSCN_MAX || numsymbols > NUMENT_MAX) { + fprintf(stderr, "ld: too many symbols or sections\n"); + exit(EXIT_FAILURE); + } + + /* + * we set the timestamp to 0 to make the output + * reproductible and to avoid a not standard use + * of time() + */ + hdr.f_symptr = 0; + hdr.f_magic = COFF_Z80MAGIC; + hdr.f_nscns = numsects; + hdr.f_symptr = 0; + hdr.f_timdat = 0; + hdr.f_nsyms = 0; + hdr.f_opthdr = AOUTSZ; + hdr.f_flags = F_EXEC | F_AR32WR; /* TODO: set the correct endianess */ + + if (!sflag) { + hdr.f_symptr = 0; /* TODO: set correct value here */ + hdr.f_flags |= F_SYMS; + hdr.f_nsyms = numsymbols; + } + + coff32_pack_hdr(lpack, buff, &hdr); + fwrite(buff, FILHSZ, 1, fp); +} + +static void +wraout(FILE *fp) +{ + AOUTHDR aout; + unsigned char buff[AOUTSZ]; + Symbol *sym; + long addr; + + if ((sym = lookup(entry, NOINSTALL)) != NULL) { + addr = sym->value; + } else { + fprintf(stderr, + "ld: warning: cannot find entry symbol '%s'; defaulting to 0\n", + entry); + addr = 0; + } + + aout.magic = ZMAGIC; + aout.vstamp = 0; + aout.entry = addr; + aout.tsize = tsize; + aout.dsize = dsize; + aout.bsize = bsize; + aout.text_start = textpc; + aout.data_start = textpc + dsize; + + coff32_pack_aout(lpack, buff, &aout); + fwrite(buff, AOUTSZ, 1, fp); +} + +static void +wrscn(FILE *fp, Section *sp, long pc) +{ + SCNHDR scn; + unsigned char buff[SCNHSZ]; + + strcpy(scn.s_name, sp->name); + scn.s_paddr = pc; + scn.s_vaddr = pc; + scn.s_size = sp->size; + scn.s_scnptr = 0; /* TODO: file ptr */ + scn.s_relptr = 0; + scn.s_lnnoptr = 0; + scn.s_nrelloc = 0; + scn.s_nlnno = 0; + scn.s_flags = 0; /* TODO: Add flags */ + + coff32_pack_scn(lpack, buff, &scn); + fwrite(buff, SCNHSZ, 1, fp); +} + +void +writeout(FILE *fp) +{ + Section *sp; + long pc = textpc; + + wrhdr(fp); + wraout(fp); + + for (sp = sectlst; sp; sp = sp->next) { + wrscn(fp, sp, pc); + pc += sp->size; + } + + /* TODO: run over all the files */ + + if (fflush(fp) == EOF) { + perror("ld: error writing output file"); + exit(EXIT_FAILURE); + } +} diff --git a/ld/deps.mk b/ld/deps.mk @@ -0,0 +1,15 @@ + +#deps +coff32.o: ../inc/coff32/aouthdr.h +coff32.o: ../inc/coff32/coff32.h +coff32.o: ../inc/coff32/filehdr.h +coff32.o: ../inc/coff32/scnhdr.h +coff32.o: ../inc/coff32/syms.h +coff32.o: ../inc/scc.h +coff32.o: ld.h +main.o: ../inc/ar.h +main.o: ../inc/scc.h +main.o: ../inc/syslibs.h +main.o: ld.h +obj.o: ../inc/scc.h +obj.o: ld.h diff --git a/ld/formats.c b/ld/formats.c @@ -1,13 +0,0 @@ -static char sccsid[] = "@(#) ./ld/probe.c"; - -#include <stdio.h> - -#include "ld.h" - -/* TODO: Autogenerate this file */ -struct objfile coff32; - -struct objfile *formats[] = { - &coff32, - NULL, -}; diff --git a/ld/ld.h b/ld/ld.h @@ -1,20 +1,85 @@ +#define INSTALL 1 +#define NOINSTALL 0 + typedef struct obj Obj; +typedef struct symbol Symbol; +typedef struct section Section; struct obj { char *fname; - void *hdr; + char *member; + FILE *fp; + long offset; + + void *filhdr; + void *scnhdr; + void *enthdr; + char *strtbl; + size_t strsiz; + + int (*unpack)(unsigned char *, char *, ...); + int align; + struct obj *next; }; -#ifdef stdin -struct objfile { - int (*probe)(char *fname, char *member, FILE *fp); - void (*pass1)(char *fname, char *member, FILE *fp); - void (*pass2)(char *fname, char *member, FILE *fp); +enum symflg { + SDEFINED = 1 << 1, +}; + +struct symbol { + char *name; + unsigned char flags; + long size; + TUINT base; + TUINT value; + Section *section; + Obj *where; + struct symbol *hash, *next; +}; + +struct section { + char *name; + TUINT base; + TUINT size; + struct section *next; }; -#endif /* obj.c */ -extern Obj *newobj(char *fname); +extern Obj *newobj(char *fname, char *member, FILE *fp); +extern Obj *add(Obj *obj); +extern void delobj(Obj *obj); +extern Section *slookup(char *name); +extern Symbol *lookup(char *name, int install); + +/* main.c */ +extern void outmem(void); +extern void corrupted(char *fname, char *member); +extern void redefined(Obj *obj, Symbol *sym); + +/* object format */ +extern Obj *probe(char *fname, char *member, FILE *fp); +extern Obj *load(Obj *obj); +extern void writeout(FILE *fp); + + +/* + * Definition of globals variables + */ +extern int pass; +extern int sflag; +extern int xflag; +extern int Xflag; +extern int rflag; +extern int dflag; +extern int gflag; +extern Obj *objlst; +extern Section *sectlst; +extern long numsects; +extern long numsymbols; +extern TUINT tsize, dsize, bsize; +extern char *output; +extern char *entry; +extern char *datasiz; diff --git a/ld/main.c b/ld/main.c @@ -7,32 +7,66 @@ static char sccsid[] = "@(#) ./ld/main.c"; #include <stdlib.h> #include <string.h> -#include "../inc/arg.h" #include "../inc/scc.h" #include "../inc/ar.h" +#include "../inc/syslibs.h" #include "ld.h" -char *argv0; +char *output = "a.out", *entry = "start", *datasiz; int pass; +int sflag; /* discard all the symbols */ +int xflag; /* discard local symbols */ +int Xflag; /* discard locals starting with 'L' */ +int rflag; /* preserve relocation bits */ +int dflag; /* define common even with rflag */ +int gflag; /* preserve debug symbols */ + +static int done; + +void +redefined(Obj *obj, Symbol *sym) +{ + /* TODO: add infotmation about where it is defined */ + fprintf(stderr, + "ld: %s: redifinition of symbol '%s'\n", + obj->fname, sym->name); +} + +void +corrupted(char *fname, char *member) +{ + char *fmt; + + fmt = (member) ? + "ld: %s(%s): corrupted file\n" : "ld: %s: corrupted file\n"; + fprintf(stderr, fmt, fname, member); + exit(EXIT_FAILURE); +} + +void +outmem(void) +{ + fputs("ld: out of memory\n", stderr); + exit(EXIT_FAILURE); +} + +static void +cleanup(void) +{ + if (!done) + remove(output); +} static int object(char *fname, char *member, FILE *fp) { - extern struct objfile *formats[]; - struct objfile **p, *obj; - void *data; - void (*fun)(char *, char *, FILE *); - - for (p = formats; *p; ++p) { - obj = *p; - if ((*obj->probe)(fname, member, fp)) - break; - } - if (*p == NULL) + Obj *obj; + + obj = probe(fname, member, fp); + if (!obj) return 0; + load(obj); - fun = (pass == 1) ? obj->pass1 : obj->pass2; - (*fun)(fname, member, fp); return 1; } @@ -64,35 +98,36 @@ ar(char *fname, FILE *fp) goto file_error; while (fread(&hdr, sizeof(hdr), 1, fp) == 1) { - pos = ftell(fp); if (strncmp(hdr.ar_fmag, ARFMAG, sizeof(hdr.ar_fmag))) - goto corrupted; + corrupted(fname, NULL); siz = 0; sscanf(hdr.ar_size, "%10ld", &siz); - if (siz == 0) - goto corrupted; - if (siz & 1) siz++; - if (pos == -1 || pos > LONG_MAX - siz) - die("ld: %s: overflow in size of archive", fname); + if (siz == 0) + corrupted(fname, NULL); + + pos = ftell(fp); + if (pos == -1 || pos > LONG_MAX - siz) { + fprintf(stderr, + "ld: %s(%s): overflow in size of archive", + fname, member); + exit(EXIT_FAILURE); + } pos += siz; getfname(&hdr, member); object(fname, member, fp); if (fseek(fp, pos, SEEK_SET) == EOF) - goto file_error; + break; } - if (ferror(fp)) - goto file_error; - return; - -corrupted: - die("ld: %s: corrupted archive", fname); file_error: - die("ld: %s: %s", fname, strerror(errno)); + if (ferror(fp)) { + fprintf(stderr, "ld: %s: %s\n", fname, strerror(errno)); + exit(EXIT_FAILURE); + } } static int @@ -106,7 +141,7 @@ archive(char *fname, FILE *fp) fsetpos(fp, &pos); if (ferror(fp)) - die("ld: %s: %s", fname, strerror(errno)); + return 0; if (strncmp(magic, ARMAG, SARMAG) != 0) return 0; @@ -115,73 +150,139 @@ archive(char *fname, FILE *fp) } static void -process(char *fname) +pass1(int argc, char *argv[]) { FILE *fp; - - if ((fp = fopen(fname, "rb")) == NULL) - die("ld: %s: %s", fname, strerror(errno)); - - if (!object(fname, fname, fp) && !archive(fname, fp)) - die("ld: %s: File format not recognized", fname); - - if (ferror(fp)) - die("ld: %s: %s", fname, strerror(errno)); - - fclose(fp); + char *s; + + while ((s = *argv++) != NULL) { + if ((fp = fopen(s, "rb")) == NULL) { + fprintf(stderr, "ld: %s: %s\n", s, strerror(errno)); + exit(EXIT_FAILURE); + } + if (!object(s, NULL, fp) && !archive(s, fp)) { + fprintf(stderr, "ld: %s: File format not recognized\n", s); + exit(EXIT_FAILURE); + } + fclose(fp); + } } static void -pass1(int argc, char *argv[]) +pass2(int argc, char *argv[]) { - while (*argv) - process(*argv++); + FILE *fp; + + if ((fp = fopen(output, "wb")) != NULL) { + writeout(fp); + if (fclose(fp) != EOF) + return; + } + + fprintf(stderr, "ld: %s: %s\n", output, strerror(errno)); + exit(EXIT_FAILURE); } static void -pass2(int argc, char *argv[]) +usage(void) { - while (*argv) - process(*argv++); + fputs("usage: ld [options] file ...\n", stderr); + exit(1); } static void -usage(void) +Lpath(char *path) { - fputs("usage: ld [options] [@file] file ...\n", stderr); - exit(1); + char **bp; + + for (bp = syslibs; bp < &syslibs[MAX_LIB_PATHS] && *bp; ++bp) + ; + if (bp == &syslibs[MAX_LIB_PATHS]) { + fputs("ld: too many -L options\n", stderr); + exit(1); + } + *bp = path; } int main(int argc, char *argv[]) { - unsigned i; - - ARGBEGIN { - case 's': - case 'u': - case 'l': - case 'x': - case 'X': - case 'r': - case 'd': - case 'n': - case 'i': - case 'o': - case 'e': - case 'O': - case 'D': - break; - default: - usage(); - } ARGEND + char *cp, **p; + for (--argc; *++argv; --argc) { + if (argv[0][0] != '-' || argv[0][1] == 'l') + break; + if (argv[0][1] == '-') { + --argc, ++argv; + break; + } + for (cp = &argv[0][1]; *cp; ++cp) { + switch (*cp) { + case 's': + sflag = 1; + break; + case 'x': + xflag = 1; + break; + case 'X': + Xflag = 1; + break; + case 'r': + rflag = 1; + break; + case 'd': + dflag = 1; + break; + case 'i': + case 'n': + /* TODO */ + break; + case 'L': + if (argc == 0) + goto usage; + ++argv, --argc; + Lpath(*argv); + break; + case 'u': + if (argc == 0) + goto usage; + ++argv, --argc; + lookup(*argv, INSTALL); + break; + case 'o': + if (argc == 0) + goto usage; + ++argv, --argc; + output = *argv; + break; + case 'e': + if (argc == 0) + goto usage; + ++argv, --argc; + entry = *argv; + break; + case 'D': + if (argc == 0) + goto usage; + ++argv, --argc; + datasiz = *argv; + break; + default: + usage: + usage(); + } + } + } if (argc == 0) usage(); + atexit(cleanup); + pass1(argc, argv); pass2(argc, argv); + done = 1; + return 0; } diff --git a/ld/obj.c b/ld/obj.c @@ -1,33 +1,153 @@ static char sccsid[] = "@(#) ./ld/obj.c"; +#include <errno.h> +#include <stdio.h> #include <stdlib.h> #include <string.h> #include "../inc/scc.h" #include "ld.h" +#define NR_SYM_HASH 64 + +TUINT tsize, dsize, bsize; + Obj *objlst; -static Obj *tail; +static Obj *objtail; + +long numsects, numsymbols; +static Symbol *secttail; +static Symbol *symtbl[NR_SYM_HASH]; + +Section *sectlst; + +Obj * +add(Obj *obj) +{ + obj->next = NULL; + + if (!objlst) { + objtail = objlst = obj; + } else { + objtail->next = obj; + objtail = obj; + } +} + +void +delobj(Obj *obj) +{ + free(obj->strtbl); + free(obj->scnhdr); + free(obj->filhdr); + free(obj->fname); + free(obj->member); + free(obj); +} Obj * -newobj(char *fname) +newobj(char *fname, char *member, FILE *fp) { Obj *obj; - char *s; - size_t len = strlen(fname); + char *s, *t; + size_t len; + len = strlen(fname); obj = malloc(sizeof(*obj)); - s = malloc(len+1); + s = malloc(len) + 1; if (!obj || !s) - die("ld: out of memory"); - + outmem(); + memset(obj, 0, sizeof(*obj)); obj->fname = memcpy(s, fname, len); - obj->next = NULL; - if (!objlst) - tail = objlst = obj; - else - tail->next = obj; + if (!member) { + obj->member = NULL; + } else { + len = strlen(member) + 1; + if ((s = malloc(len)) == NULL) + outmem(); + obj->member = memcpy(s, member, len); + } + + obj->fp = fp; + if ((obj->offset = ftell(fp)) == EOF) { + fprintf(stderr, "ld: %s: %s\n", fname, strerror(errno)); + exit(1); + } return obj; } + +Section * +slookup(char *name) +{ + char *s; + Section *prev, *sp; + size_t len = strlen(name); + + for (prev = sp = sectlst; sp; prev = sp, sp = sp->next) { + if (!memcmp(sp->name, name, len)) + return sp; + } + + sp = malloc(sizeof(*sp)); + s = malloc(len); + if (!sp || !s) + outmem(); + sp->name = s; + sp->base = 0; + sp->size = 0; + sp->next = NULL; + + if (!prev) + sectlst = sp; + else + prev->next = sp; + numsects++; + + return sp; +} + +static unsigned +hash(char *s) +{ + unsigned h, c; + + for (h = 0; c = *s; ++s) + h = h*33 ^ c; + return h & NR_SYM_HASH-1; +} + +Symbol * +lookup(char *name, int install) +{ + unsigned h; + char *s; + size_t len; + Symbol *sym; + + h = hash(name); + for (sym = symtbl[h]; sym; sym = sym->hash) { + s = sym->name; + if (*name == *s && !strcmp(name, s)) + return sym; + } + + if (!install) + return NULL; + + len = strlen(name) + 1; + sym = malloc(sizeof(*sym)); + s = malloc(len); + if (!sym || !s) + outmem(); + memset(sym, 0, sizeof(*sym)); + memcpy(s, name, len); + + sym->hash = symtbl[h]; + symtbl[h] = sym; + sym->name = s; + numsymbols++; + + return sym; +} diff --git a/lib/Makefile b/lib/Makefile @@ -4,7 +4,12 @@ PROJECTDIR = .. include $(PROJECTDIR)/rules.mk -DIRS = scc +DIRS = scc coff32 crt c -all dep clean distclean: +all: $(DIRS) + +$(DIRS): FORCE + +@cd $@ && $(MAKE) + +dep clean distclean: $(FORALL) diff --git a/lib/c/Makefile b/lib/c/Makefile @@ -1,4 +1,9 @@ .POSIX: +PROJECTDIR = ../.. +include $(PROJECTDIR)/rules.mk + +DIRS = target + all dep clean distclean: - +cd target && $(MAKE) $@ + $(FORALL) diff --git a/lib/c/__putc.c b/lib/c/__putc.c @@ -2,35 +2,20 @@ #include <errno.h> #include <stdio.h> #include <stdlib.h> -#include "syscall.h" -int -_fflush(FILE *fp) -{ - int lnbuf = fp->flags & _IOLBF; - size_t cnt; - - cnt = ((lnbuf) ? fp->lp : fp->wp) - fp->buf; - - if (_write(fp->fd, fp->buf, cnt) != cnt) { - fp->flags |= _IOERR; - return EOF; - } - fp->rp = fp->wp = fp->buf; - - return 0; -} +extern int _flsbuf(FILE *fp); int fflush(FILE *fp) { - int err = 0; + int err; if (fp) return _flsbuf(fp); + err = 0; for (fp = __iob; fp < &__iob[FOPEN_MAX]; ++fp) { - if ((fp->flags & _IOWRITE) == 0 && _flush(fp)) + if ((fp->flags & _IOWRITE) == 0 && _flsbuf(fp)) err = EOF; } return err; @@ -71,10 +56,10 @@ __putc(int ch, FILE *fp) } if (fp->flags & _IOLBF) { - if (fp->lp == fp->rp && _flush(fp)) + if (fp->lp == fp->rp && _flsbuf(fp)) return EOF; *fp->lp++ = ch; - if (ch == '\n' && flsbuf(fp)) + if (ch == '\n' && _flsbuf(fp)) return EOF; } else { if (fp->wp == fp->rp && _flsbuf(fp)) diff --git a/lib/c/_flsbuf.c b/lib/c/_flsbuf.c @@ -0,0 +1,23 @@ + +#include <errno.h> +#include <stdio.h> +#include "syscall.h" + +int +_flsbuf(FILE *fp) +{ + int lnbuf = fp->flags & _IOLBF; + unsigned char *p; + size_t cnt; + + p = (lnbuf) ? fp->lp : fp->wp; + cnt = p - fp->buf; + + if (_write(fp->fd, fp->buf, cnt) != cnt) { + fp->flags |= _IOERR; + return EOF; + } + fp->lp = fp->rp = fp->wp = fp->buf; + + return 0; +} diff --git a/lib/c/_fpopen.c b/lib/c/_fpopen.c @@ -2,13 +2,15 @@ #include <errno.h> #include <stdio.h> #include <stdlib.h> +#include <sys.h> #include "syscall.h" +#include "libc.h" #undef fopen FILE * _fpopen(const char * restrict fname, - const char * restrict mode, - FILE * restrict fp) + const char * restrict mode, + FILE * restrict fp) { int i, flags, fd, rw, bin; @@ -52,12 +54,12 @@ _fpopen(const char * restrict fname, return NULL; } - if ((fd = _open(name, flags)) < 0) + if ((fd = _open(fname, flags)) < 0) return NULL; if (fp->buf == NULL) { if ((fp->buf = malloc(BUFSIZ)) == NULL) { - close(fd); + _close(fd); errno = ENOMEM; return NULL; } @@ -66,7 +68,7 @@ _fpopen(const char * restrict fname, fp->fd = fd; if (!bin) - fp->flags |= _IOTEXT; + fp->flags |= _IOTXT; if (flags & O_RDWR) fp->flags |= _IORW; diff --git a/lib/c/calloc.c b/lib/c/calloc.c @@ -1,5 +1,6 @@ #include <stdlib.h> #include <string.h> +#undef calloc void * calloc(size_t nmemb, size_t size) diff --git a/lib/c/ctype.c b/lib/c/ctype.c @@ -1,6 +1,5 @@ #define __USE_MACROS #include <ctype.h> -#undef ctype int __ctmp; diff --git a/lib/c/errno.c b/lib/c/errno.c @@ -0,0 +1 @@ +int errno; diff --git a/lib/c/fclose.c b/lib/c/fclose.c @@ -1,18 +1,22 @@ +#include <stdlib.h> #include <stdio.h> +#include "syscall.h" #undef fclose +extern int _flsbuf(FILE *fp); + int fclose(FILE *fp) { int r = EOF; if ((fp->flags & _IOSTRG) == 0 && - fp->flags & (_IOWRITE | _IOREAD | _IOWR)) { + fp->flags & (_IOWRITE | _IOREAD | _IORW)) { r = 0; - if (fflush(fp) == EOF) + if (_flsbuf(fp) == EOF) r = EOF; - if (close(fp->fd) < 0) + if (_close(fp->fd) < 0) r = EOF; } @@ -21,7 +25,7 @@ fclose(FILE *fp) fp->buf = NULL; } - fp->flags &= ~(_IOWRITE | _IOREAD | _IOWR | + fp->flags &= ~(_IOWRITE | _IOREAD | _IORW | _IOERR | _IOEOF | _IOALLOC | _IOTXT | diff --git a/lib/c/fopen.c b/lib/c/fopen.c @@ -1,18 +1,22 @@ #include <errno.h> #include <stdio.h> + +#include "syscall.h" +#include "libc.h" #undef fopen + FILE * fopen(const char * restrict name, const char * restrict mode) { FILE *fp; - for (fp = __iob; fp < &__iob[FILE_MAX]; ++fp) { - if (fp->flags & (_IOREAD | _IOWRITE | _IORW) == 0) + for (fp = __iob; fp < &__iob[FOPEN_MAX]; ++fp) { + if ((fp->flags & (_IOREAD | _IOWRITE | _IORW)) == 0) break; } - if (fp == &__iob[FILE_MAX]) { + if (fp == &__iob[FOPEN_MAX]) { errno = ENOMEM; return NULL; } diff --git a/lib/c/fputs.c b/lib/c/fputs.c @@ -1,5 +1,6 @@ #include <stdio.h> +#undef fputs int fputs(const char * restrict bp, FILE * restrict fp) diff --git a/lib/c/fread.c b/lib/c/fread.c @@ -8,6 +8,7 @@ fread(void * restrict ptr, size_t size, size_t nmemb, { unsigned char *bp = ptr; size_t n, i; + int c; if (size == 0) return 0; @@ -15,8 +16,9 @@ fread(void * restrict ptr, size_t size, size_t nmemb, for (n = 0; n < nmemb; n++) { i = size; do { - if ((*bp++ = getc(fp)) == EOF) + if ((c = getc(fp)) == EOF) return n; + *bp++ = c; } while (--i); } diff --git a/lib/c/freopen.c b/lib/c/freopen.c @@ -1,5 +1,8 @@ #include <stdio.h> + +#include "syscall.h" +#include "libc.h" #undef freopen FILE * diff --git a/lib/c/fseek.c b/lib/c/fseek.c @@ -3,18 +3,20 @@ #include "syscall.h" #undef fseek +extern int _flsbuf(FILE *fp); + int fseek(FILE *fp, long off, int whence) { if (fp->flags & _IOERR) return EOF; - if ((fp->flags & _IOWRITE) && fflush(fp)) + if ((fp->flags & _IOWRITE) && _flsbuf(fp)) return -1; else if (whence == SEEK_CUR && (fp->flags & _IOREAD)) - off -= fp->wp - fp->rd; + off -= fp->wp - fp->rp; - if (_seek(fp->fd, off, type) < 0) { + if (_lseek(fp->fd, off, whence) < 0) { fp->flags |= _IOERR; return EOF; } diff --git a/lib/c/include/assert.h b/lib/c/include/assert.h @@ -1,10 +0,0 @@ - -void __assert(char *exp, char *file, long line); - -#undef assert -#ifndef NDEBUG -# define assert(exp) ((exp) ? (void) 0 : __assert(#exp, __FILE__, __LINE__)) -#else -# define assert(exp) ((void)0) -#endif - diff --git a/lib/c/include/bits/amd64-sysv/arch/limits.h b/lib/c/include/bits/amd64-sysv/arch/limits.h @@ -1,17 +0,0 @@ -#define SCHAR_MAX 0x7F -#define SCHAR_MIN (-SCHAR_MIN-1) -#define CHAR_MAX 0x7F -#define CHAR_MIN (-CHAR_MAX-1) -#define UCHAR_MAX 0xFF -#define SHRT_MAX 0x7FFF -#define SHRT_MIN (-SHRT_MAX-1) -#define USHRT_MAX 0xFFFF -#define INT_MAX 0x7FFFFFFF -#define INT_MIN (-INT_MAX-1) -#define UINT_MAX 0xFFFFFFFF -#define LONG_MAX 0x7FFFFFFFFFFFFFFF -#define LONG_MIN (-LONG_MAX-1) -#define ULONG_MAX 0xFFFFFFFFFFFFFFFF -#define LLONG_MAX 0x7FFFFFFFFFFFFFFF -#define LLONG_MIN (-LLONG_MAX-1) -#define ULLONG_MAX 0xFFFFFFFFFFFFFFFF diff --git a/lib/c/include/bits/amd64-sysv/arch/signal.h b/lib/c/include/bits/amd64-sysv/arch/signal.h @@ -1,27 +0,0 @@ -typedef int sig_atomic_t; - -#define SIG_ERR -1 -#define SIG_DFL 0 -#define SIG_IGN 1 - -#define SIGHUP 1 -#define SIGINT 2 -#define SIGQUIT 3 -#define SIGILL 4 -#define SIGABRT 6 -#define SIGFPE 8 -#define SIGKILL 9 -#define SIGUSR1 10 -#define SIGSEGV 11 -#define SIGUSR2 12 -#define SIGPIPE 13 -#define SIGALRM 14 -#define SIGTERM 15 -#define SIGCHLD 17 -#define SIGCONT 18 -#define SIGSTOP 19 -#define SIGSSTP 20 -#define SIGTTIN 21 -#define SIGTTOU 22 - -#define __NR_SIGNALS 23 diff --git a/lib/c/include/bits/amd64-sysv/arch/stdio.h b/lib/c/include/bits/amd64-sysv/arch/stdio.h @@ -1,13 +0,0 @@ -#ifndef _SIZET -typedef unsigned long size_t; -#define _SIZET -#endif - -#define BUFSIZ 512 -#define FILENAME_MAX 256 -#define FOPEN_MAX 16 - -#define TMP_MAX 25 -#define L_tmpnam 256 - -typedef int fpos_t; diff --git a/lib/c/include/bits/i386-sysv/arch/limits.h b/lib/c/include/bits/i386-sysv/arch/limits.h @@ -1,17 +0,0 @@ -#define SCHAR_MAX 0x7F -#define SCHAR_MIN (-SCHAR_MIN-1) -#define CHAR_MAX 0x7F -#define CHAR_MIN (-CHAR_MAX-1) -#define UCHAR_MAX 0xFF -#define SHRT_MAX 0x7FFF -#define SHRT_MIN (-SHRT_MAX-1) -#define USHRT_MAX 0xFFFF -#define INT_MAX 0x7FFFFFFF -#define INT_MIN (-INT_MAX-1) -#define UINT_MAX 0xFFFFFFFF -#define LONG_MAX 0x7FFFFFFF -#define LONG_MIN (-LONG_MAX-1) -#define ULONG_MAX 0xFFFFFFFF -#define LLONG_MAX 0x7FFFFFFFFFFFFFFF -#define LLONG_MIN (-LLONG_MAX-1) -#define ULLONG_MAX 0xFFFFFFFFFFFFFFFF diff --git a/lib/c/include/bits/i386-sysv/arch/signal.h b/lib/c/include/bits/i386-sysv/arch/signal.h @@ -1,27 +0,0 @@ -typedef int sig_atomic_t; - -#define SIG_ERR -1 -#define SIG_DFL 0 -#define SIG_IGN 1 - -#define SIGHUP 1 -#define SIGINT 2 -#define SIGQUIT 3 -#define SIGILL 4 -#define SIGABRT 6 -#define SIGFPE 8 -#define SIGKILL 9 -#define SIGUSR1 10 -#define SIGSEGV 11 -#define SIGUSR2 12 -#define SIGPIPE 13 -#define SIGALRM 14 -#define SIGTERM 15 -#define SIGCHLD 17 -#define SIGCONT 18 -#define SIGSTOP 19 -#define SIGSSTP 20 -#define SIGTTIN 21 -#define SIGTTOU 22 - -#define __NR_SIGNALS 23 diff --git a/lib/c/include/bits/i386-sysv/arch/stdio.h b/lib/c/include/bits/i386-sysv/arch/stdio.h @@ -1,13 +0,0 @@ -#ifndef _SIZET -typedef unsigned long size_t; -#define _SIZET -#endif - -#define BUFSIZ 512 -#define FILENAME_MAX 256 -#define FOPEN_MAX 16 - -#define TMP_MAX 25 -#define L_tmpnam 256 - -typedef long fpos_t; diff --git a/lib/c/include/bits/z80-dos/arch/limits.h b/lib/c/include/bits/z80-dos/arch/limits.h @@ -1,17 +0,0 @@ -#define SCHAR_MAX 0x7F -#define SCHAR_MIN (-SCHAR_MIN-1) -#define CHAR_MAX 0xFF -#define CHAR_MIN 0 -#define UCHAR_MAX 0xFF -#define SHRT_MAX 0x7FFF -#define SHRT_MIN (-SHRT_MAX-1) -#define USHRT_MAX 0xFFFF -#define INT_MAX 0x7FFF -#define INT_MIN (-INT_MAX-1) -#define UINT_MAX 0xFFFF -#define LONG_MAX 0x7FFFFFFF -#define LONG_MIN (-LONG_MAX-1) -#define ULONG_MAX 0xFFFFFFFF -#define LLONG_MAX 0x7FFFFFFFFFFFFFFF -#define LLONG_MIN (-LLONG_MAX-1) -#define ULLONG_MAX 0xFFFFFFFFFFFFFFFF diff --git a/lib/c/include/bits/z80-dos/arch/signal.h b/lib/c/include/bits/z80-dos/arch/signal.h @@ -1,31 +0,0 @@ -typedef char sig_atomic_t; - -#define SIG_ERR -1 -#define SIG_DFL 0 -#define SIG_IGN 1 - -#define SIG_ERR -1 -#define SIG_DFL 0 -#define SIG_IGN 1 - -#define SIGHUP 1 -#define SIGINT 2 -#define SIGQUIT 3 -#define SIGILL 4 -#define SIGABRT 6 -#define SIGFPE 8 -#define SIGKILL 9 -#define SIGUSR1 10 -#define SIGSEGV 11 -#define SIGUSR2 12 -#define SIGPIPE 13 -#define SIGALRM 14 -#define SIGTERM 15 -#define SIGCHLD 17 -#define SIGCONT 18 -#define SIGSTOP 19 -#define SIGSSTP 20 -#define SIGTTIN 21 -#define SIGTTOU 22 - -#define __NR_SIGNALS 23 diff --git a/lib/c/include/bits/z80-dos/arch/stdio.h b/lib/c/include/bits/z80-dos/arch/stdio.h @@ -1,13 +0,0 @@ -#ifndef _SIZET -typedef unsigned size_t; -#define _SIZET -#endif - -#define BUFSIZ 512 -#define FILENAME_MAX 256 -#define FOPEN_MAX 16 - -#define TMP_MAX 25 -#define L_tmpnam 256 - -typedef long fpos_t; diff --git a/lib/c/include/errno.h b/lib/c/include/errno.h @@ -1,14 +0,0 @@ -#ifndef _ERRNO_H -#define _ERRNO_H - -#define EDOM 1 -#define EILSEQ 2 -#define ERANGE 3 -#define ENOMEM 4 -#define EBADF 5 - -extern int errno; -extern char *_sys_errlist[]; -extern int _sys_nerr; - -#endif diff --git a/lib/c/include/limits.h b/lib/c/include/limits.h @@ -1,9 +0,0 @@ -#ifndef _LIMITS_H -#define _LIMITS_H - -#include <arch/limits.h> - -#define CHAR_BIT 8 -#define MB_LEN_MAX 1 - -#endif diff --git a/lib/c/include/signal.h b/lib/c/include/signal.h @@ -1,9 +0,0 @@ -#ifndef _SIGNAL_H -#define _SIGNAL_H - -#include <arch/signal.h> - -void ( *signal(int signum, void (*handler)(int)) ) (int); -int raise(int sig); - -#endif diff --git a/lib/c/include/stdbool.h b/lib/c/include/stdbool.h @@ -1,9 +0,0 @@ -#ifndef _STDBOOL_H -#define _STDBOOL_H - -#define bool _Bool -#define true ((bool) 1) -#define false ((bool) 0) -#define __bool_true_false_are_defined 1 - -#endif diff --git a/lib/c/include/string.h b/lib/c/include/string.h @@ -1,33 +0,0 @@ -#ifndef _STRING_H -#define _STRING_H - -#include <arch/string.h> - -#ifndef NULL -#define NULL ((void *) 0) -#endif - -extern void *memcpy(void * restrict s1, const void * restrict s2, size_t n); -extern void *memmove(void *s1, const void *s2, size_t n); -extern char *strcpy(char * restrict s1, const char * restrict s2); -extern char *strncpy(char * restrict s1, const char * restrict s2, size_t n); -extern char *strcat(char * restrict s1, const char * restrict s2); -extern char *strncat(char * restrict s1, const char * restrict s2, size_t n); -extern int memcmp(const void *s1, const void *s2, size_t n); -extern int strcmp(const char *s1, const char *s2); -extern int strcoll(const char *s1, const char *s2); -extern int strncmp(const char *s1, const char *s2, size_t n); -extern size_t strxfrm(char * restrict s1, const char * restrict s2, size_t n); -extern void *memchr(const void *s, int c, size_t n); -extern char *strchr(const char *s, int c); -extern size_t strcspn(const char *s1, const char *s2); -extern char *strpbrk(const char *s1, const char *s2); -extern char *strrchr(const char *s, int c); -extern size_t strspn(const char *s1, const char *s2); -extern char *strstr(const char *s1, const char *s2); -extern char *strtok(char * restrict s1, const char * restrict s2); -extern void *memset(void *s, int c, size_t n); -extern char *strerror(int errnum); -extern size_t strlen(const char *s); - -#endif diff --git a/lib/c/isascii.c b/lib/c/isascii.c @@ -1,4 +1,3 @@ -#define __USE_MACROS #include <ctype.h> #undef isascii diff --git a/lib/c/isblank.c b/lib/c/isblank.c @@ -1,3 +1,6 @@ + +#include <ctype.h> + int isblank(int c) { diff --git a/lib/c/libc.h b/lib/c/libc.h @@ -0,0 +1,5 @@ +#ifdef stdin +extern FILE *_fpopen(const char * restrict fname, + const char * restrict mode, + FILE * restrict fp); +#endif diff --git a/lib/c/memchr.c b/lib/c/memchr.c @@ -4,7 +4,7 @@ void * memchr(const void *s, int c, size_t n) { - unsigned char *bp = (char *) s; + unsigned char *bp = (unsigned char *) s; while (n > 0 && *bp++ != c) --n; diff --git a/lib/c/putc.c b/lib/c/putc.c @@ -5,5 +5,5 @@ int putc(int ch, FILE *fp) { - return (fp->wp >= fp->rp) ? __putc(c,fp) : *fp->wp++ = c; + return (fp->wp >= fp->rp) ? __putc(ch,fp) : (*fp->wp++ = ch); } diff --git a/lib/c/putchar.c b/lib/c/putchar.c @@ -5,5 +5,5 @@ int putchar(int ch) { - return putc(ch, stdin); + return putc(ch, stdout); } diff --git a/lib/c/puts.c b/lib/c/puts.c @@ -1,12 +1,13 @@ #include <stdio.h> +#undef puts int puts(const char *str) { int ch; - while (ch = *str) + while (ch = *str++) putchar(ch); return putchar('\n'); } diff --git a/lib/c/realloc.c b/lib/c/realloc.c @@ -2,6 +2,7 @@ #include <string.h> #include "malloc.h" +#undef realloc void * realloc(void *ptr, size_t nbytes) diff --git a/lib/c/setvbuf.c b/lib/c/setvbuf.c @@ -1,14 +1,17 @@ #include <errno.h> #include <stdio.h> +#include <stdlib.h> #undef setvbuf +extern int _flsbuf(FILE *fp); + int setvbuf(FILE * restrict fp, char * restrict buf, int mode, size_t size) { int flags, r; - if (fflush(fp) == EOF) + if (_flsbuf(fp) == EOF) return EOF; switch (mode) { @@ -27,18 +30,18 @@ setvbuf(FILE * restrict fp, char * restrict buf, int mode, size_t size) } break; default: - errno = EIVAL; + errno = EINVAL; return EOF; } flags = fp->flags; if (flags & _IOALLOC) free(fp->buf); - flag &= ~(_IONBF | _IOLBF | _IOFBF | _IOALLOC | _IOALLOC); + flags &= ~(_IONBF | _IOLBF | _IOFBF | _IOALLOC | _IOALLOC); flags |= mode; fp->flags = flags; fp->buf = buf; - fp->size = size; + fp->len = size; return 0; } diff --git a/lib/c/stdio.c b/lib/c/stdio.c @@ -9,13 +9,19 @@ FILE __iob[FOPEN_MAX] = { .fd = 0, .buf = inbuf, .len = BUFSIZ, - .flags = _IOREAD + .flags = _IOREAD, + .lp = inbuf, + .rp = inbuf, + .wp = inbuf, }, { .fd = 1, .buf = outbuf, .len = BUFSIZ, - .flags = _IOWRITE | _IOLBF + .flags = _IOWRITE | _IOLBF, + .lp = outbuf, + .rp = outbuf, + .wp = outbuf, }, { .fd = 2, diff --git a/lib/c/strnlen.c b/lib/c/strnlen.c @@ -0,0 +1,13 @@ +#include <string.h> + +#undef strnlen + +size_t +strnlen(const char *s, size_t maxlen) +{ + size_t n; + + for (n = 0; n < maxlen && *s++; ++n) + ; + return n; +} diff --git a/lib/c/strpbrk.c b/lib/c/strpbrk.c @@ -11,7 +11,7 @@ strpbrk(const char *s1, const char *s2) for (p = s2; *p && *p != c; ++p) ; if (*p == c) - return s1; + return (char *) s1; } return NULL; } diff --git a/lib/c/syscall.h b/lib/c/syscall.h @@ -1,14 +1,8 @@ extern void *_brk(void *addr); -extern int _open(char *path, int flags, int perm); +extern int _open(const char *path, int flags); extern int _close(int fd); extern int _read(int fd, void *buf, size_t n); extern int _write(int fd, void *buf, size_t n); extern int _lseek(int fd, long off, int whence); extern void _Exit(int status); -extern void _access(char *path, int mode); - -extern int raise(int sig); -extern void (*signal(int sig, void (*func)(int)))(int); -extern getenv(const char *var); -extern int rename(const char *from, const char *to); -extern int remove(const char *path); +extern int _access(char *path, int mode); diff --git a/lib/c/target/.gitignore b/lib/c/target/.gitignore @@ -0,0 +1 @@ +_sys_errlist.c diff --git a/lib/c/target/Makefile b/lib/c/target/Makefile @@ -3,7 +3,13 @@ PROJECTDIR = ../../.. include $(PROJECTDIR)/rules.mk -DIRS = $(TARGETS) +DIRS = amd64-sysv-linux \ + amd64-sysv-openbsd \ + amd64-sysv-netbsd \ -all dep clean distclean: +all clean distclean: + $(FORALL) + +dep: + ./script/objlst.sh $(FORALL) diff --git a/lib/c/target/amd64-sysv-linux-elf/Makefile b/lib/c/target/amd64-sysv-linux-elf/Makefile @@ -1,9 +0,0 @@ -.POSIX: - -PROJECTDIR = ../../../.. - -include $(PROJECTDIR)/rules.mk -include ../objlst.mk -include ../common.mk - -SCC_CFLAGS = -I../../include -I../../include/bits/amd64-sysv/ diff --git a/lib/c/target/amd64-sysv-linux-elf/gendep.sh b/lib/c/target/amd64-sysv-linux-elf/gendep.sh @@ -1,16 +0,0 @@ -#!/bin/sh - -set -e - -rm -f makefile -trap "rm -f $$.mk" 0 2 3 - -(cat Makefile -for i -do - cat <<EOF -$i: ../../${i%.o}.c - \$(CC) \$(TF_CFLAGS) ../../${i%.o}.c -c - -EOF -done) > $$.mk && mv $$.mk makefile diff --git a/lib/c/target/amd64-sysv-linux/.gitignore b/lib/c/target/amd64-sysv-linux/.gitignore @@ -0,0 +1,10 @@ +_Exit.s +_brk.s +_close.s +_getpid.s +_kill.s +_lseek.s +_open.s +_read.s +_sigaction.s +_write.s diff --git a/lib/c/target/amd64-sysv-linux/Makefile b/lib/c/target/amd64-sysv-linux/Makefile @@ -0,0 +1,17 @@ +.POSIX: + +PROJECTDIR = ../../../.. +include $(PROJECTDIR)/rules.mk + +SYS = linux +ARCH = amd64 +ABI = sysv +SYSERRTBL = ../posix/linux.e +MORECFLAGS = -std=c99 -g -static -nostdinc +SYSOBJ = raise.o signal.o + +include syscall.mk +include ../amd64-sysv/objlst.mk +include ../script/objlst.mk +include ../posix/objlst.mk +include ../script/common.mk diff --git a/lib/c/target/amd64-sysv-linux/sys.h b/lib/c/target/amd64-sysv-linux/sys.h @@ -0,0 +1,20 @@ + +#define O_RDONLY 0x00000000 +#define O_WRONLY 0x00000001 +#define O_RDWR 0x00000002 + +#define O_TRUNC 0x00000400 +#define O_APPEND 0x00000008 +#define O_CREAT 0x00000200 + +typedef int pid_t; + +struct sigaction { + void (*sa_handler)(int); + int sa_mask; + int sa_flags; +}; + +extern pid_t _getpid(void); +extern int _kill(pid_t pid, int signum); +extern int _sigaction(int sig, struct sigaction *new, struct sigaction *old); diff --git a/lib/c/target/amd64-sysv-linux/syscall.lst b/lib/c/target/amd64-sysv-linux/syscall.lst @@ -0,0 +1,11 @@ +#number name +1 _Exit +3 _read +4 _write +5 _open +6 _close +17 _brk +20 _getpid +37 _kill +46 _sigaction +199 _lseek diff --git a/lib/c/target/amd64-sysv-linux/syscall.mk b/lib/c/target/amd64-sysv-linux/syscall.mk @@ -0,0 +1 @@ +SYSCALL = _Exit.o _read.o _write.o _open.o _close.o _brk.o _getpid.o _kill.o _sigaction.o _lseek.o diff --git a/lib/c/target/amd64-sysv-netbsd/.gitignore b/lib/c/target/amd64-sysv-netbsd/.gitignore @@ -0,0 +1,10 @@ +_Exit.s +_brk.s +_close.s +_getpid.s +_kill.s +_lseek.s +_open.s +_read.s +_write.s +_sigaction.s diff --git a/lib/c/target/amd64-sysv-netbsd/Makefile b/lib/c/target/amd64-sysv-netbsd/Makefile @@ -0,0 +1,17 @@ +.POSIX: + +PROJECTDIR = ../../../.. +include $(PROJECTDIR)/rules.mk + +SYS = netbsd +ARCH = amd64 +ABI = sysv +SYSERRTBL = ../posix/netbsd.e +MORECFLAGS = -std=c99 -g -static -nostdinc +SYSOBJ = raise.o signal.o _sigaction.o _sigaction2.o _setcontext.o + +include syscall.mk +include ../amd64-sysv/objlst.mk +include ../script/objlst.mk +include ../posix/objlst.mk +include ../script/common.mk diff --git a/lib/c/target/amd64-sysv-netbsd/_setcontext.s b/lib/c/target/amd64-sysv-netbsd/_setcontext.s @@ -0,0 +1,14 @@ + + .text + .globl _Exit + .globl _setcontext + +_setcontext: + movq %r15,%rdi + movq $0x134,%rax + syscall + + # Something was wrong, finish the program. We can't call + # abort here because it could generate a loop + movq $-1,%rdi + jmp _Exit diff --git a/lib/c/target/amd64-sysv-netbsd/_sigaction.c b/lib/c/target/amd64-sysv-netbsd/_sigaction.c @@ -0,0 +1,15 @@ + +#include <stddef.h> +#include <sys.h> + +extern int _sigaction2(int sig, + struct sigaction *new, struct sigaction *old, + int siginfo[], int num); + +int +_sigaction(int sig, struct sigaction *new, struct sigaction *old) +{ + extern int _setcontext[]; + + return _sigaction2(sig, new, old, _setcontext, 2); +} diff --git a/lib/c/target/amd64-sysv-netbsd/_sigaction2.s b/lib/c/target/amd64-sysv-netbsd/_sigaction2.s @@ -0,0 +1,12 @@ + +# This syscall cannot be autogenerated because it receives more than +# 4 arguments + + .text + .globl _sigaction2 + +_sigaction2: + mov $0x154,%eax + mov %rcx,%r10 + syscall + retq diff --git a/lib/c/target/amd64-sysv-netbsd/sys.h b/lib/c/target/amd64-sysv-netbsd/sys.h @@ -0,0 +1,20 @@ + +#define O_RDONLY 0x00000000 +#define O_WRONLY 0x00000001 +#define O_RDWR 0x00000002 + +#define O_TRUNC 0x00000400 +#define O_APPEND 0x00000008 +#define O_CREAT 0x00000200 + +typedef int pid_t; + +struct sigaction { + void (*sa_handler)(int); + char sa_mask[8]; + int sa_flags; +}; + +extern pid_t _getpid(void); +extern int _kill(pid_t pid, int signum); +extern int _sigaction(int sig, struct sigaction *new, struct sigaction *old); diff --git a/lib/c/target/amd64-sysv-netbsd/syscall.lst b/lib/c/target/amd64-sysv-netbsd/syscall.lst @@ -0,0 +1,10 @@ +#number name +1 _Exit +3 _read +4 _write +5 _open +6 _close +17 _brk +20 _getpid +37 _kill +199 _lseek diff --git a/lib/c/target/amd64-sysv-netbsd/syscall.mk b/lib/c/target/amd64-sysv-netbsd/syscall.mk @@ -0,0 +1 @@ +SYSCALL = _Exit.o _read.o _write.o _open.o _close.o _brk.o _getpid.o _kill.o _lseek.o diff --git a/lib/c/target/amd64-sysv-openbsd-elf/Makefile b/lib/c/target/amd64-sysv-openbsd-elf/Makefile @@ -1,7 +0,0 @@ -.POSIX: - -PROJECTDIR = ../../../.. - -include $(PROJECTDIR)/rules.mk -include ../objlst.mk -include ../common.mk diff --git a/lib/c/target/amd64-sysv-openbsd-elf/gendep.sh b/lib/c/target/amd64-sysv-openbsd-elf/gendep.sh @@ -1,16 +0,0 @@ -#!/bin/sh - -set -e - -rm -f makefile -trap "rm -f $$.mk" 0 2 3 - -(cat Makefile -for i -do - cat <<EOF -$i: ../../${i%.o}.c - \$(CC) \$(TF_CFLAGS) ../../${i%.o}.c -c - -EOF -done) > $$.mk && mv $$.mk makefile diff --git a/lib/c/target/amd64-sysv-openbsd/.gitignore b/lib/c/target/amd64-sysv-openbsd/.gitignore @@ -0,0 +1,10 @@ +_Exit.s +_brk.s +_close.s +_getpid.s +_kill.s +_lseek.s +_open.s +_read.s +_sigaction.s +_write.s diff --git a/lib/c/target/amd64-sysv-openbsd/Makefile b/lib/c/target/amd64-sysv-openbsd/Makefile @@ -0,0 +1,17 @@ +.POSIX: + +PROJECTDIR = ../../../.. +include $(PROJECTDIR)/rules.mk + +SYS = openbsd +ARCH = amd64 +ABI = sysv +SYSERRTBL = ../posix/netbsd.e +MORECFLAGS = -std=c99 -g -static -nostdinc -fno-stack-protector --freestanding +SYSOBJ = raise.o signal.o _sigaction.o + +include syscall.mk +include ../amd64-sysv/objlst.mk +include ../script/objlst.mk +include ../posix/objlst.mk +include ../script/common.mk diff --git a/lib/c/target/amd64-sysv-openbsd/sys.h b/lib/c/target/amd64-sysv-openbsd/sys.h @@ -0,0 +1,20 @@ + +#define O_RDONLY 0x00000000 +#define O_WRONLY 0x00000001 +#define O_RDWR 0x00000002 + +#define O_TRUNC 0x00000400 +#define O_APPEND 0x00000008 +#define O_CREAT 0x00000200 + +typedef int pid_t; + +struct sigaction { + void (*sa_handler)(int); + int sa_mask; + int sa_flags; +}; + +extern pid_t _getpid(void); +extern int _kill(pid_t pid, int signum); +extern int _sigaction(int sig, struct sigaction *new, struct sigaction *old); diff --git a/lib/c/target/amd64-sysv-openbsd/syscall.lst b/lib/c/target/amd64-sysv-openbsd/syscall.lst @@ -0,0 +1,11 @@ +#number name +1 _Exit +3 _read +4 _write +5 _open +6 _close +17 _brk +20 _getpid +46 _sigaction +122 _kill +198 _lseek diff --git a/lib/c/target/amd64-sysv-openbsd/syscall.mk b/lib/c/target/amd64-sysv-openbsd/syscall.mk @@ -0,0 +1 @@ +SYSCALL = _Exit.o _read.o _write.o _open.o _close.o _brk.o _getpid.o _sigaction.o _kill.o _lseek.o diff --git a/lib/c/target/amd64-sysv/longjmp.s b/lib/c/target/amd64-sysv/longjmp.s @@ -0,0 +1,20 @@ +# Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license + .file "longjmp" + .global longjmp + +longjmp: + mov %rsi,%rax # val will be longjmp return + test %rax,%rax + jnz 1f + inc %rax # if val==0, val=1 per longjmp semantics +1: + mov (%rdi),%rbx # rdi is the jmp_buf, restore regs from it + mov 8(%rdi),%rbp + mov 16(%rdi),%r12 + mov 24(%rdi),%r13 + mov 32(%rdi),%r14 + mov 40(%rdi),%r15 + mov 48(%rdi),%rdx # this ends up being the stack pointer + mov %rdx,%rsp + mov 56(%rdi),%rdx # this is the instruction pointer + jmp *%rdx # goto saved address without altering rsp diff --git a/lib/c/target/amd64-sysv/objlst.mk b/lib/c/target/amd64-sysv/objlst.mk @@ -0,0 +1,7 @@ +ARCHOBJ = setjmp.o longjmp.o + +setjmp.o: ../amd64-sysv/setjmp.s + $(AS) $(ASFLAGS) -o $@ ../amd64-sysv/setjmp.s + +longjmp.o: ../amd64-sysv/longjmp.s + $(AS) $(ASFLAGS) -o $@ ../amd64-sysv/longjmp.s diff --git a/lib/c/target/amd64-sysv/setjmp.s b/lib/c/target/amd64-sysv/setjmp.s @@ -0,0 +1,17 @@ +/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */ + + .file "setjmp.s" + .global setjmp +setjmp: + mov %rbx,(%rdi) # rdi is jmp_buf, move registers onto it + mov %rbp,8(%rdi) + mov %r12,16(%rdi) + mov %r13,24(%rdi) + mov %r14,32(%rdi) + mov %r15,40(%rdi) + lea 8(%rsp),%rdx # this is our rsp WITHOUT current ret addr + mov %rdx,48(%rdi) + mov (%rsp),%rdx # save return addr ptr for new rip + mov %rdx,56(%rdi) + xor %rax,%rax # always return 0 + ret diff --git a/lib/c/target/common.mk b/lib/c/target/common.mk @@ -1,15 +0,0 @@ - -all: libc.a - -libc.a: $(OBJ) - $(AR) $(ARFLAGS) $@ $? - ranlib $@ - -dep: - gendep.sh $(OBJ) - -clean: - rm -f *.o - -distclean: clean - rm -f makefile diff --git a/lib/c/target/i386-sysv-linux-elf/Makefile b/lib/c/target/i386-sysv-linux-elf/Makefile @@ -1,7 +0,0 @@ -.POSIX: - -PROJECTDIR = ../../../.. - -include $(PROJECTDIR)/rules.mk -include ../objlst.mk -include ../common.mk diff --git a/lib/c/target/i386-sysv-linux-elf/gendep.sh b/lib/c/target/i386-sysv-linux-elf/gendep.sh @@ -1,16 +0,0 @@ -#!/bin/sh - -set -e - -rm -f makefile -trap "rm -f $$.mk" 0 2 3 - -(cat Makefile -for i -do - cat <<EOF -$i: ../../${i%.o}.c - \$(CC) \$(TF_CFLAGS) ../../${i%.o}.c -c - -EOF -done) > $$.mk && mv $$.mk makefile diff --git a/lib/c/target/i386-sysv-linux/Makefile b/lib/c/target/i386-sysv-linux/Makefile @@ -0,0 +1,9 @@ +.POSIX: + +PROJECTDIR = ../../../.. + +include $(PROJECTDIR)/rules.mk +include ../objlst.mk +include ../common.mk + +SCC_CFLAGS = -nostdinc -I../../include -I../../include/bits/i386-sysv/ diff --git a/lib/c/target/objlst.mk b/lib/c/target/objlst.mk @@ -1,22 +0,0 @@ - -OBJ = bsearch.o qsort.o \ - abs.o __abs.o labs.o __labs.o llabs.o __llabs.o \ - perror.o strerror.o \ - tmpnam.o \ - sprintf.o snprintf.o vsprintf.o vsnprintf.o \ - printf.o fprintf.o vfprintf.o \ - fgets.o gets.of fgetc.o fputc.o getchar.o putchar.o \ - fputs.o puts.o fread.o fwrite.o \ - getc.o putc.o __putc.o __getc.o \ - rewind.o fseek.o ferror.o feof.o clearerr.o \ - setbuf.o setvbuf.o \ - fclose.o fopen.c freopen.c _fpopen.o stdio.o \ - realloc.o calloc.o malloc.o \ - __assert.o strcpy.o strcmp.o strlen.o strchr.o \ - strrchr.o strcat.o strncmp.o strncpy.o strncat.o strcoll.o \ - strxfrm.o strstr.o strspn.o strcspn.o strpbrk.o strtok.o \ - memset.o memcpy.o memmove.o memcmp.o memchr.o \ - isalnum.o isalpha.o isascii.o isblank.o iscntrl.o isdigit.o \ - isgraph.o islower.o isprint.o ispunct.o isspace.o isupper.o \ - isxdigit.o toupper.o tolower.o ctype.o setlocale.o \ - localeconv.o atoi.o atol.o atoll.o atexit.o abort.o exit.o diff --git a/lib/c/target/posix/geterrno.sh b/lib/c/target/posix/geterrno.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +awk '/define[ ]*E/ && $3 ~ /[0-9]+/ && $3 > 0 { + sub(/\#define[ ]*/, "") + sub(/\/\*/, "") + sub(/\*\//, "") + print +}' /usr/include/sys/errno.h diff --git a/lib/c/target/posix/linux.e b/lib/c/target/posix/linux.e @@ -0,0 +1,131 @@ +EPERM 1 Operation not permitted +ENOENT 2 No such file or directory +ESRCH 3 No such process +EINTR 4 Interrupted system call +EIO 5 I/O error +ENXIO 6 No such device or address +E2BIG 7 Argument list too long +ENOEXEC 8 Exec format error +EBADF 9 Bad file number +ECHILD 10 No child processes +EAGAIN 11 Try again +ENOMEM 12 Out of memory +EACCES 13 Permission denied +EFAULT 14 Bad address +ENOTBLK 15 Block device required +EBUSY 16 Device or resource busy +EEXIST 17 File exists +EXDEV 18 Cross-device link +ENODEV 19 No such device +ENOTDIR 20 Not a directory +EISDIR 21 Is a directory +EINVAL 22 Invalid argument +ENFILE 23 File table overflow +EMFILE 24 Too many open files +ENOTTY 25 Not a typewriter +ETXTBSY 26 Text file busy +EFBIG 27 File too large +ENOSPC 28 No space left on device +ESPIPE 29 Illegal seek +EROFS 30 Read-only file system +EMLINK 31 Too many links +EPIPE 32 Broken pipe +EDOM 33 Math argument out of domain of func +ERANGE 34 Math result not representable +EDEADLK 35 Resource deadlock would occur +ENAMETOOLONG 36 File name too long +ENOLCK 37 No record locks available +ENOSYS 38 Invalid system call number +ENOTEMPTY 39 Directory not empty +ELOOP 40 Too many symbolic links encountered +ENOMSG 42 No message of desired type +EIDRM 43 Identifier removed +ECHRNG 44 Channel number out of range +EL2NSYNC 45 Level 2 not synchronized +EL3HLT 46 Level 3 halted +EL3RST 47 Level 3 reset +ELNRNG 48 Link number out of range +EUNATCH 49 Protocol driver not attached +ENOCSI 50 No CSI structure available +EL2HLT 51 Level 2 halted +EBADE 52 Invalid exchange +EBADR 53 Invalid request descriptor +EXFULL 54 Exchange full +ENOANO 55 No anode +EBADRQC 56 Invalid request code +EBADSLT 57 Invalid slot +EBFONT 59 Bad font file format +ENOSTR 60 Device not a stream +ENODATA 61 No data available +ETIME 62 Timer expired +ENOSR 63 Out of streams resources +ENONET 64 Machine is not on the network +ENOPKG 65 Package not installed +EREMOTE 66 Object is remote +ENOLINK 67 Link has been severed +EADV 68 Advertise error +ESRMNT 69 Srmount error +ECOMM 70 Communication error on send +EPROTO 71 Protocol error +EMULTIHOP 72 Multihop attempted +EDOTDOT 73 RFS specific error +EBADMSG 74 Not a data message +EOVERFLOW 75 Value too large for defined data type +ENOTUNIQ 76 Name not unique on network +EBADFD 77 File descriptor in bad state +EREMCHG 78 Remote address changed +ELIBACC 79 Can not access a needed shared library +ELIBBAD 80 Accessing a corrupted shared library +ELIBSCN 81 .lib section in a.out corrupted +ELIBMAX 82 Attempting to link in too many shared libraries +ELIBEXEC 83 Cannot exec a shared library directly +EILSEQ 84 Illegal byte sequence +ERESTART 85 Interrupted system call should be restarted +ESTRPIPE 86 Streams pipe error +EUSERS 87 Too many users +ENOTSOCK 88 Socket operation on non-socket +EDESTADDRREQ 89 Destination address required +EMSGSIZE 90 Message too long +EPROTOTYPE 91 Protocol wrong type for socket +ENOPROTOOPT 92 Protocol not available +EPROTONOSUPPORT 93 Protocol not supported +ESOCKTNOSUPPORT 94 Socket type not supported +EOPNOTSUPP 95 Operation not supported on transport endpoint +EPFNOSUPPORT 96 Protocol family not supported +EAFNOSUPPORT 97 Address family not supported by protocol +EADDRINUSE 98 Address already in use +EADDRNOTAVAIL 99 Cannot assign requested address +ENETDOWN 100 Network is down +ENETUNREACH 101 Network is unreachable +ENETRESET 102 Network dropped connection because of reset +ECONNABORTED 103 Software caused connection abort +ECONNRESET 104 Connection reset by peer +ENOBUFS 105 No buffer space available +EISCONN 106 Transport endpoint is already connected +ENOTCONN 107 Transport endpoint is not connected +ESHUTDOWN 108 Cannot send after transport endpoint shutdown +ETOOMANYREFS 109 Too many references: cannot splice +ETIMEDOUT 110 Connection timed out +ECONNREFUSED 111 Connection refused +EHOSTDOWN 112 Host is down +EHOSTUNREACH 113 No route to host +EALREADY 114 Operation already in progress +EINPROGRESS 115 Operation now in progress +ESTALE 116 Stale file handle +EUCLEAN 117 Structure needs cleaning +ENOTNAM 118 Not a XENIX named type file +ENAVAIL 119 No XENIX semaphores available +EISNAM 120 Is a named type file +EREMOTEIO 121 Remote I/O error +EDQUOT 122 Quota exceeded +ENOMEDIUM 123 No medium found +EMEDIUMTYPE 124 Wrong medium type +ECANCELED 125 Operation Canceled +ENOKEY 126 Required key not available +EKEYEXPIRED 127 Key has expired +EKEYREVOKED 128 Key has been revoked +EKEYREJECTED 129 Key was rejected by service +EOWNERDEAD 130 Owner died +ENOTRECOVERABLE 131 State not recoverable +ERFKILL 132 Operation not possible due to RF-kill +EHWPOISON 133 Memory page has hardware error diff --git a/lib/c/target/posix/netbsd.e b/lib/c/target/posix/netbsd.e @@ -0,0 +1,98 @@ +EPERM 1 Operation not permitted +ENOENT 2 No such file or directory +ESRCH 3 No such process +EINTR 4 Interrupted system call +EIO 5 Input/output error +ENXIO 6 Device not configured +E2BIG 7 Argument list too long +ENOEXEC 8 Exec format error +EBADF 9 Bad file descriptor +ECHILD 10 No child processes +EDEADLK 11 Resource deadlock avoided +ENOMEM 12 Cannot allocate memory +EACCES 13 Permission denied +EFAULT 14 Bad address +ENOTBLK 15 Block device required +EBUSY 16 Device busy +EEXIST 17 File exists +EXDEV 18 Cross-device link +ENODEV 19 Operation not supported by device +ENOTDIR 20 Not a directory +EISDIR 21 Is a directory +EINVAL 22 Invalid argument +ENFILE 23 Too many open files in system +EMFILE 24 Too many open files +ENOTTY 25 Inappropriate ioctl for device +ETXTBSY 26 Text file busy +EFBIG 27 File too large +ENOSPC 28 No space left on device +ESPIPE 29 Illegal seek +EROFS 30 Read-only file system +EMLINK 31 Too many links +EPIPE 32 Broken pipe +EDOM 33 Numerical argument out of domain +ERANGE 34 Result too large or too small +EAGAIN 35 Resource temporarily unavailable +EWOULDBLOCK EAGAIN Operation would block +EINPROGRESS 36 Operation now in progress +EALREADY 37 Operation already in progress +ENOTSOCK 38 Socket operation on non-socket +EDESTADDRREQ 39 Destination address required +EMSGSIZE 40 Message too long +EPROTOTYPE 41 Protocol wrong type for socket +ENOPROTOOPT 42 Protocol option not available +EPROTONOSUPPORT 43 Protocol not supported +ESOCKTNOSUPPORT 44 Socket type not supported +EOPNOTSUPP 45 Operation not supported +EPFNOSUPPORT 46 Protocol family not supported +EAFNOSUPPORT 47 Address family not supported by protocol family +EADDRINUSE 48 Address already in use +EADDRNOTAVAIL 49 Can't assign requested address +ENETDOWN 50 Network is down +ENETUNREACH 51 Network is unreachable +ENETRESET 52 Network dropped connection on reset +ECONNABORTED 53 Software caused connection abort +ECONNRESET 54 Connection reset by peer +ENOBUFS 55 No buffer space available +EISCONN 56 Socket is already connected +ENOTCONN 57 Socket is not connected +ESHUTDOWN 58 Can't send after socket shutdown +ETOOMANYREFS 59 Too many references: can't splice +ETIMEDOUT 60 Operation timed out +ECONNREFUSED 61 Connection refused +ELOOP 62 Too many levels of symbolic links +ENAMETOOLONG 63 File name too long +EHOSTDOWN 64 Host is down +EHOSTUNREACH 65 No route to host +ENOTEMPTY 66 Directory not empty +EPROCLIM 67 Too many processes +EUSERS 68 Too many users +EDQUOT 69 Disc quota exceeded +ESTALE 70 Stale NFS file handle +EREMOTE 71 Too many levels of remote in path +EBADRPC 72 RPC struct is bad +ERPCMISMATCH 73 RPC version wrong +EPROGUNAVAIL 74 RPC prog. not avail +EPROGMISMATCH 75 Program version wrong +EPROCUNAVAIL 76 Bad procedure for program +ENOLCK 77 No locks available +ENOSYS 78 Function not implemented +EFTYPE 79 Inappropriate file type or format +EAUTH 80 Authentication error +ENEEDAUTH 81 Need authenticator +EIDRM 82 Identifier removed +ENOMSG 83 No message of desired type +EOVERFLOW 84 Value too large to be stored in data type +EILSEQ 85 Illegal byte sequence +ENOTSUP 86 Not supported +ECANCELED 87 Operation canceled +EBADMSG 88 Bad or Corrupt message +ENODATA 89 No message available +ENOSR 90 No STREAM resources +ENOSTR 91 Not a STREAM +ETIME 92 STREAM ioctl timeout +ENOATTR 93 Attribute not found +EMULTIHOP 94 Multihop attempted +ENOLINK 95 Link has been severed +EPROTO 96 Protocol error +ELAST 96 Must equal largest errno diff --git a/lib/c/target/posix/objlst.mk b/lib/c/target/posix/objlst.mk @@ -0,0 +1,6 @@ + +raise.o: ../posix/raise.c ../../syscall.h + $(CC) $(SCC_CFLAGS) ../posix/raise.c -c + +signal.o: ../posix/signal.c ../../syscall.h + $(CC) $(SCC_CFLAGS) ../posix/signal.c -c diff --git a/lib/c/target/posix/openbsd.e b/lib/c/target/posix/openbsd.e @@ -0,0 +1,96 @@ +EPERM 1 Operation not permitted +ENOENT 2 No such file or directory +ESRCH 3 No such process +EINTR 4 Interrupted system call +EIO 5 Input/output error +ENXIO 6 Device not configured +E2BIG 7 Argument list too long +ENOEXEC 8 Exec format error +EBADF 9 Bad file descriptor +ECHILD 10 No child processes +EDEADLK 11 Resource deadlock avoided +ENOMEM 12 Cannot allocate memory +EACCES 13 Permission denied +EFAULT 14 Bad address +ENOTBLK 15 Block device required +EBUSY 16 Device busy +EEXIST 17 File exists +EXDEV 18 Cross-device link +ENODEV 19 Operation not supported by device +ENOTDIR 20 Not a directory +EISDIR 21 Is a directory +EINVAL 22 Invalid argument +ENFILE 23 Too many open files in system +EMFILE 24 Too many open files +ENOTTY 25 Inappropriate ioctl for device +ETXTBSY 26 Text file busy +EFBIG 27 File too large +ENOSPC 28 No space left on device +ESPIPE 29 Illegal seek +EROFS 30 Read-only file system +EMLINK 31 Too many links +EPIPE 32 Broken pipe +EDOM 33 Numerical argument out of domain +ERANGE 34 Result too large +EAGAIN 35 Resource temporarily unavailable +EINPROGRESS 36 Operation now in progress +EALREADY 37 Operation already in progress +ENOTSOCK 38 Socket operation on non-socket +EDESTADDRREQ 39 Destination address required +EMSGSIZE 40 Message too long +EPROTOTYPE 41 Protocol wrong type for socket +ENOPROTOOPT 42 Protocol not available +EPROTONOSUPPORT 43 Protocol not supported +ESOCKTNOSUPPORT 44 Socket type not supported +EOPNOTSUPP 45 Operation not supported +EPFNOSUPPORT 46 Protocol family not supported +EAFNOSUPPORT 47 Address family not supported by protocol family +EADDRINUSE 48 Address already in use +EADDRNOTAVAIL 49 Can't assign requested address +ENETDOWN 50 Network is down +ENETUNREACH 51 Network is unreachable +ENETRESET 52 Network dropped connection on reset +ECONNABORTED 53 Software caused connection abort +ECONNRESET 54 Connection reset by peer +ENOBUFS 55 No buffer space available +EISCONN 56 Socket is already connected +ENOTCONN 57 Socket is not connected +ESHUTDOWN 58 Can't send after socket shutdown +ETOOMANYREFS 59 Too many references: can't splice +ETIMEDOUT 60 Operation timed out +ECONNREFUSED 61 Connection refused +ELOOP 62 Too many levels of symbolic links +ENAMETOOLONG 63 File name too long +EHOSTDOWN 64 Host is down +EHOSTUNREACH 65 No route to host +ENOTEMPTY 66 Directory not empty +EPROCLIM 67 Too many processes +EUSERS 68 Too many users +EDQUOT 69 Disk quota exceeded +ESTALE 70 Stale NFS file handle +EREMOTE 71 Too many levels of remote in path +EBADRPC 72 RPC struct is bad +ERPCMISMATCH 73 RPC version wrong +EPROGUNAVAIL 74 RPC program not available +EPROGMISMATCH 75 Program version wrong +EPROCUNAVAIL 76 Bad procedure for program +ENOLCK 77 No locks available +ENOSYS 78 Function not implemented +EFTYPE 79 Inappropriate file type or format +EAUTH 80 Authentication error +ENEEDAUTH 81 Need authenticator +EIPSEC 82 IPsec processing failure +ENOATTR 83 Attribute not found +EILSEQ 84 Illegal byte sequence +ENOMEDIUM 85 No medium found +EMEDIUMTYPE 86 Wrong medium type +EOVERFLOW 87 Value too large to be stored in data type +ECANCELED 88 Operation canceled +EIDRM 89 Identifier removed +ENOMSG 90 No message of desired type +ENOTSUP 91 Not supported +EBADMSG 92 Bad message +ENOTRECOVERABLE 93 State not recoverable +EOWNERDEAD 94 Previous owner died +EPROTO 95 Protocol error +ELAST 95 Must be equal largest errno diff --git a/lib/c/target/posix/raise.c b/lib/c/target/posix/raise.c @@ -0,0 +1,12 @@ + +#include <stddef.h> +#include <signal.h> +#include <sys.h> + +#undef raise + +int +raise(int signum) +{ + return _kill(_getpid(), signum); +} diff --git a/lib/c/target/posix/signal.c b/lib/c/target/posix/signal.c @@ -0,0 +1,21 @@ + +#include <stddef.h> +#include <signal.h> +#include <sys.h> + +#include "../../syscall.h" + +#undef signal + +void +(*signal(int signum, void (*func)(int)))(int) +{ + struct sigaction sa = { + .sa_handler = func, + }; + + if (_sigaction(signum, &sa, &sa) < 0) + return SIG_ERR; + + return sa.sa_handler; +} diff --git a/lib/sys/abi/amd64-sysv.sh b/lib/c/target/script/amd64-sysv.sh diff --git a/lib/c/target/script/common.mk b/lib/c/target/script/common.mk @@ -0,0 +1,38 @@ +SYSNAME = $(ARCH)-$(ABI)-$(SYS) +SYSASM = $(SYSCALL:.o=.s) +TARGET = $(LIBDIR)/$(SYSNAME)/libc.a +INCLUDE = -I$(INCDIR) \ + -I$(INCDIR)/bits/$(ARCH)-$(ABI) \ + -I$(INCDIR)/bits/$(SYS) \ + -I. +SYSERRNO = $(INCDIR)/bits/$(SYS)/sys/errno.h +OBJ = $(LIBOBJ) $(SYSOBJ) $(SYSCALL) $(ARCHOBJ) + +SCC_CFLAGS = $(MORECFLAGS) $(INCLUDE) + +all: $(TARGET) + +$(OBJ): $(SYSERRNO) + +$(SYSERRNO): $(SYSERRTBL) + trap "rm -f $$$$.tmp" 0 2 3 4; \ + ../script/generrno.sh $(SYSERRTBL) > $$$$.tmp && mv $$$$.tmp $@ + +_sys_errlist.c: $(SYSERRTBL) $(SYSERRNO) + trap "rm -f $$$$.tmp" 0 2 3 4; \ + ../script/generrstr.sh $(SYSERRTBL) > $$$$.tmp && mv $$$$.tmp $@ + +$(TARGET): $(OBJ) + $(AR) $(ARFLAGS) $@ $? + ranlib $@ + +clean: + rm -f *.o *.a _sys_errlist.c $(SYSERRNO) + rm -f $(SYSASM) + rm -f $(TARGET) + +$(SYSASM): syscall.lst + ../script/amd64-sysv.sh + +dep: + ../script/syscall.sh diff --git a/lib/c/target/script/generrno.sh b/lib/c/target/script/generrno.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +awk ' +/^E/ && $2 > 0 { + errno[$1] = $2 +} + +END { + for (i in errno) + print "#define", i, errno[i] | "sort -n -k3" + close("sort -n -k3") +}' $@ diff --git a/lib/c/target/script/generrstr.sh b/lib/c/target/script/generrstr.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +awk ' +/^E/ && $2 > 0 { + str = "" + for (i = 3; i <= NF; i++) + str = str " " $i + sub(/^ /, "", str) + errstr[$1] = str + if ($2 > max) + max = $2; +} + +END { + print "#include <errno.h>\n" + print "char *_sys_errstr[] = {" + for (i in errstr) + printf "\t%-20.20s = \"%s\",\n", "[" i "]", errstr[i] + print "};" + print "int _sys_nerr =", $2 + 1 ";" +}' $@ diff --git a/lib/c/target/script/objlst.mk b/lib/c/target/script/objlst.mk @@ -0,0 +1,319 @@ + +LIBOBJ = bsearch.o qsort.o \ + abs.o __abs.o labs.o __labs.o llabs.o __llabs.o \ + perror.o strerror.o \ + tmpnam.o \ + sprintf.o snprintf.o vsprintf.o vsnprintf.o \ + printf.o fprintf.o vfprintf.o \ + fgets.o gets.o fgetc.o fputc.o getchar.o putchar.o \ + fputs.o puts.o fread.o fwrite.o \ + getc.o putc.o __putc.o __getc.o \ + rewind.o fseek.o ferror.o feof.o clearerr.o \ + setbuf.o setvbuf.o \ + fclose.o fopen.o freopen.o _fpopen.o _flsbuf.o stdio.o \ + realloc.o calloc.o malloc.o \ + __assert.o strcpy.o strcmp.o strlen.o strchr.o \ + strrchr.o strcat.o strncmp.o strncpy.o strncat.o strcoll.o \ + strxfrm.o strstr.o strspn.o strcspn.o strpbrk.o strtok.o \ + memset.o memcpy.o memmove.o memcmp.o memchr.o \ + isalnum.o isalpha.o isascii.o isblank.o iscntrl.o isdigit.o \ + isgraph.o islower.o isprint.o ispunct.o isspace.o isupper.o \ + isxdigit.o toupper.o tolower.o ctype.o setlocale.o \ + localeconv.o atoi.o atol.o atoll.o atexit.o abort.o exit.o \ + errno.o _sys_errlist.o strnlen.o wcsnlen.o + +#rules +__abs.o: ../../__abs.c + $(CC) $(SCC_CFLAGS) ../../__abs.c -c + +__assert.o: ../../__assert.c + $(CC) $(SCC_CFLAGS) ../../__assert.c -c + +__getc.o: ../../__getc.c + $(CC) $(SCC_CFLAGS) ../../__getc.c -c + +__labs.o: ../../__labs.c + $(CC) $(SCC_CFLAGS) ../../__labs.c -c + +__llabs.o: ../../__llabs.c + $(CC) $(SCC_CFLAGS) ../../__llabs.c -c + +__putc.o: ../../__putc.c + $(CC) $(SCC_CFLAGS) ../../__putc.c -c + +_flsbuf.o: ../../_flsbuf.c + $(CC) $(SCC_CFLAGS) ../../_flsbuf.c -c + +_fpopen.o: ../../_fpopen.c + $(CC) $(SCC_CFLAGS) ../../_fpopen.c -c + +abort.o: ../../abort.c + $(CC) $(SCC_CFLAGS) ../../abort.c -c + +abs.o: ../../abs.c + $(CC) $(SCC_CFLAGS) ../../abs.c -c + +atexit.o: ../../atexit.c + $(CC) $(SCC_CFLAGS) ../../atexit.c -c + +atoi.o: ../../atoi.c + $(CC) $(SCC_CFLAGS) ../../atoi.c -c + +atol.o: ../../atol.c + $(CC) $(SCC_CFLAGS) ../../atol.c -c + +atoll.o: ../../atoll.c + $(CC) $(SCC_CFLAGS) ../../atoll.c -c + +bsearch.o: ../../bsearch.c + $(CC) $(SCC_CFLAGS) ../../bsearch.c -c + +calloc.o: ../../calloc.c + $(CC) $(SCC_CFLAGS) ../../calloc.c -c + +clearerr.o: ../../clearerr.c + $(CC) $(SCC_CFLAGS) ../../clearerr.c -c + +ctype.o: ../../ctype.c + $(CC) $(SCC_CFLAGS) ../../ctype.c -c + +errno.o: ../../errno.c + $(CC) $(SCC_CFLAGS) ../../errno.c -c + +exit.o: ../../exit.c + $(CC) $(SCC_CFLAGS) ../../exit.c -c + +fclose.o: ../../fclose.c + $(CC) $(SCC_CFLAGS) ../../fclose.c -c + +feof.o: ../../feof.c + $(CC) $(SCC_CFLAGS) ../../feof.c -c + +ferror.o: ../../ferror.c + $(CC) $(SCC_CFLAGS) ../../ferror.c -c + +fgetc.o: ../../fgetc.c + $(CC) $(SCC_CFLAGS) ../../fgetc.c -c + +fgets.o: ../../fgets.c + $(CC) $(SCC_CFLAGS) ../../fgets.c -c + +fopen.o: ../../fopen.c + $(CC) $(SCC_CFLAGS) ../../fopen.c -c + +fprintf.o: ../../fprintf.c + $(CC) $(SCC_CFLAGS) ../../fprintf.c -c + +fputc.o: ../../fputc.c + $(CC) $(SCC_CFLAGS) ../../fputc.c -c + +fputs.o: ../../fputs.c + $(CC) $(SCC_CFLAGS) ../../fputs.c -c + +fread.o: ../../fread.c + $(CC) $(SCC_CFLAGS) ../../fread.c -c + +freopen.o: ../../freopen.c + $(CC) $(SCC_CFLAGS) ../../freopen.c -c + +fseek.o: ../../fseek.c + $(CC) $(SCC_CFLAGS) ../../fseek.c -c + +fwrite.o: ../../fwrite.c + $(CC) $(SCC_CFLAGS) ../../fwrite.c -c + +getc.o: ../../getc.c + $(CC) $(SCC_CFLAGS) ../../getc.c -c + +getchar.o: ../../getchar.c + $(CC) $(SCC_CFLAGS) ../../getchar.c -c + +gets.o: ../../gets.c + $(CC) $(SCC_CFLAGS) ../../gets.c -c + +isalnum.o: ../../isalnum.c + $(CC) $(SCC_CFLAGS) ../../isalnum.c -c + +isalpha.o: ../../isalpha.c + $(CC) $(SCC_CFLAGS) ../../isalpha.c -c + +isascii.o: ../../isascii.c + $(CC) $(SCC_CFLAGS) ../../isascii.c -c + +isblank.o: ../../isblank.c + $(CC) $(SCC_CFLAGS) ../../isblank.c -c + +iscntrl.o: ../../iscntrl.c + $(CC) $(SCC_CFLAGS) ../../iscntrl.c -c + +isdigit.o: ../../isdigit.c + $(CC) $(SCC_CFLAGS) ../../isdigit.c -c + +isgraph.o: ../../isgraph.c + $(CC) $(SCC_CFLAGS) ../../isgraph.c -c + +islower.o: ../../islower.c + $(CC) $(SCC_CFLAGS) ../../islower.c -c + +isprint.o: ../../isprint.c + $(CC) $(SCC_CFLAGS) ../../isprint.c -c + +ispunct.o: ../../ispunct.c + $(CC) $(SCC_CFLAGS) ../../ispunct.c -c + +isspace.o: ../../isspace.c + $(CC) $(SCC_CFLAGS) ../../isspace.c -c + +isupper.o: ../../isupper.c + $(CC) $(SCC_CFLAGS) ../../isupper.c -c + +isxdigit.o: ../../isxdigit.c + $(CC) $(SCC_CFLAGS) ../../isxdigit.c -c + +labs.o: ../../labs.c + $(CC) $(SCC_CFLAGS) ../../labs.c -c + +llabs.o: ../../llabs.c + $(CC) $(SCC_CFLAGS) ../../llabs.c -c + +localeconv.o: ../../localeconv.c + $(CC) $(SCC_CFLAGS) ../../localeconv.c -c + +malloc.o: ../../malloc.c + $(CC) $(SCC_CFLAGS) ../../malloc.c -c + +memchr.o: ../../memchr.c + $(CC) $(SCC_CFLAGS) ../../memchr.c -c + +memcmp.o: ../../memcmp.c + $(CC) $(SCC_CFLAGS) ../../memcmp.c -c + +memcpy.o: ../../memcpy.c + $(CC) $(SCC_CFLAGS) ../../memcpy.c -c + +memmove.o: ../../memmove.c + $(CC) $(SCC_CFLAGS) ../../memmove.c -c + +memset.o: ../../memset.c + $(CC) $(SCC_CFLAGS) ../../memset.c -c + +perror.o: ../../perror.c + $(CC) $(SCC_CFLAGS) ../../perror.c -c + +printf.o: ../../printf.c + $(CC) $(SCC_CFLAGS) ../../printf.c -c + +putc.o: ../../putc.c + $(CC) $(SCC_CFLAGS) ../../putc.c -c + +putchar.o: ../../putchar.c + $(CC) $(SCC_CFLAGS) ../../putchar.c -c + +puts.o: ../../puts.c + $(CC) $(SCC_CFLAGS) ../../puts.c -c + +qsort.o: ../../qsort.c + $(CC) $(SCC_CFLAGS) ../../qsort.c -c + +rand.o: ../../rand.c + $(CC) $(SCC_CFLAGS) ../../rand.c -c + +realloc.o: ../../realloc.c + $(CC) $(SCC_CFLAGS) ../../realloc.c -c + +rewind.o: ../../rewind.c + $(CC) $(SCC_CFLAGS) ../../rewind.c -c + +setbuf.o: ../../setbuf.c + $(CC) $(SCC_CFLAGS) ../../setbuf.c -c + +setlocale.o: ../../setlocale.c + $(CC) $(SCC_CFLAGS) ../../setlocale.c -c + +setvbuf.o: ../../setvbuf.c + $(CC) $(SCC_CFLAGS) ../../setvbuf.c -c + +snprintf.o: ../../snprintf.c + $(CC) $(SCC_CFLAGS) ../../snprintf.c -c + +sprintf.o: ../../sprintf.c + $(CC) $(SCC_CFLAGS) ../../sprintf.c -c + +stdio.o: ../../stdio.c + $(CC) $(SCC_CFLAGS) ../../stdio.c -c + +strcat.o: ../../strcat.c + $(CC) $(SCC_CFLAGS) ../../strcat.c -c + +strchr.o: ../../strchr.c + $(CC) $(SCC_CFLAGS) ../../strchr.c -c + +strcmp.o: ../../strcmp.c + $(CC) $(SCC_CFLAGS) ../../strcmp.c -c + +strcoll.o: ../../strcoll.c + $(CC) $(SCC_CFLAGS) ../../strcoll.c -c + +strcpy.o: ../../strcpy.c + $(CC) $(SCC_CFLAGS) ../../strcpy.c -c + +strcspn.o: ../../strcspn.c + $(CC) $(SCC_CFLAGS) ../../strcspn.c -c + +strerror.o: ../../strerror.c + $(CC) $(SCC_CFLAGS) ../../strerror.c -c + +strlen.o: ../../strlen.c + $(CC) $(SCC_CFLAGS) ../../strlen.c -c + +strncat.o: ../../strncat.c + $(CC) $(SCC_CFLAGS) ../../strncat.c -c + +strncmp.o: ../../strncmp.c + $(CC) $(SCC_CFLAGS) ../../strncmp.c -c + +strncpy.o: ../../strncpy.c + $(CC) $(SCC_CFLAGS) ../../strncpy.c -c + +strnlen.o: ../../strnlen.c + $(CC) $(SCC_CFLAGS) ../../strnlen.c -c + +strpbrk.o: ../../strpbrk.c + $(CC) $(SCC_CFLAGS) ../../strpbrk.c -c + +strrchr.o: ../../strrchr.c + $(CC) $(SCC_CFLAGS) ../../strrchr.c -c + +strspn.o: ../../strspn.c + $(CC) $(SCC_CFLAGS) ../../strspn.c -c + +strstr.o: ../../strstr.c + $(CC) $(SCC_CFLAGS) ../../strstr.c -c + +strtok.o: ../../strtok.c + $(CC) $(SCC_CFLAGS) ../../strtok.c -c + +strxfrm.o: ../../strxfrm.c + $(CC) $(SCC_CFLAGS) ../../strxfrm.c -c + +tmpnam.o: ../../tmpnam.c + $(CC) $(SCC_CFLAGS) ../../tmpnam.c -c + +tolower.o: ../../tolower.c + $(CC) $(SCC_CFLAGS) ../../tolower.c -c + +toupper.o: ../../toupper.c + $(CC) $(SCC_CFLAGS) ../../toupper.c -c + +vfprintf.o: ../../vfprintf.c + $(CC) $(SCC_CFLAGS) ../../vfprintf.c -c + +vsnprintf.o: ../../vsnprintf.c + $(CC) $(SCC_CFLAGS) ../../vsnprintf.c -c + +vsprintf.o: ../../vsprintf.c + $(CC) $(SCC_CFLAGS) ../../vsprintf.c -c + +wcsnlen.o: ../../wcsnlen.c + $(CC) $(SCC_CFLAGS) ../../wcsnlen.c -c + diff --git a/lib/c/target/script/objlst.sh b/lib/c/target/script/objlst.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +set -e + + +(cd .. +echo H +echo '/^#rules/+;$c' + +for i in *.c +do + cat <<EOF +${i%.c}.o: ../../$i + \$(CC) \$(SCC_CFLAGS) ../../$i -c + +EOF +done + +echo . +echo w) | ed -s script/objlst.mk diff --git a/lib/c/target/script/syscall.sh b/lib/c/target/script/syscall.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +(echo '/SYS/c' + awk 'BEGIN {printf "SYSCALL = "} + ! /^#/ {printf "%s.o ", $2} + END {print ""}' syscall.lst + echo . + echo w) | ed -s syscall.mk diff --git a/lib/c/target/z80-scc-none-none/Makefile b/lib/c/target/z80-scc-none-none/Makefile @@ -1,7 +0,0 @@ -.POSIX: - -PROJECTDIR = ../../../.. - -include $(PROJECTDIR)/rules.mk -include ../objlst.mk -include ../common.mk diff --git a/lib/c/target/z80-scc-none-none/gendep.sh b/lib/c/target/z80-scc-none-none/gendep.sh @@ -1,16 +0,0 @@ -#!/bin/sh - -set -e - -rm -f makefile -trap "rm -f $$.mk" 0 2 3 - -(cat Makefile -for i -do - cat <<EOF -$i: ../../${i%.o}.c - \$(CC) \$(TF_CFLAGS) ../../${i%.o}.c -c - -EOF -done) > $$.mk && mv $$.mk makefile diff --git a/lib/c/target/z80-scc-none/Makefile b/lib/c/target/z80-scc-none/Makefile @@ -0,0 +1,9 @@ +.POSIX: + +PROJECTDIR = ../../../.. + +include $(PROJECTDIR)/rules.mk +include ../objlst.mk +include ../common.mk + +SCC_CFLAGS = -nostdinc -I../../include -I../../include/bits/z80-none/ diff --git a/lib/c/vfprintf.c b/lib/c/vfprintf.c @@ -64,7 +64,7 @@ getnum(va_list va, int flags, int *sign) uval = (uintmax_t) va_arg(va, void *); } else { val = va_arg(va, int); - uval = (unsigned) uval; + uval = (unsigned) val; } if ((flags & UNSIGNED) == 0 && val < 0) { @@ -128,6 +128,7 @@ wstrout(wchar_t *ws, size_t len, int width, int fill, FILE * restrict fp) int left = 0, adjust; size_t cnt = 0; wchar_t wc; +#if 0 if (width < 0) { left = 1; @@ -148,7 +149,7 @@ wstrout(wchar_t *ws, size_t len, int width, int fill, FILE * restrict fp) for ( ; adjust < 0; adjust--) putc(' ', fp); - +#endif return cnt; } diff --git a/lib/c/vsnprintf.c b/lib/c/vsnprintf.c @@ -9,13 +9,13 @@ vsnprintf(char * restrict s, size_t siz, const char * restrict fmt, va_list ap) FILE f; int r; - f.flag = _IOWRT | _IOSTRG; - f.size = siz; + f.flags = _IORW | _IOSTRG; + f.len = siz; f.buf = s; f.wp = s; f.rp = s + siz; - r = vfprintf(&f, fmt, va); + r = vfprintf(&f, fmt, ap); if (s) { if (f.wp == f.rp) --f.wp; diff --git a/lib/c/vsprintf.c b/lib/c/vsprintf.c @@ -1,6 +1,7 @@ #include <limits.h> #include <stdarg.h> +#include <stdint.h> #include <stdio.h> #undef vsprintf diff --git a/lib/c/wcsnlen.c b/lib/c/wcsnlen.c @@ -0,0 +1,10 @@ +#include <stdio.h> +#include <wchar.h> + +#undef wcsnlen + +size_t +wcsnlen(const wchar_t *s, size_t maxlen) +{ + return 0; +} diff --git a/lib/coff32/Makefile b/lib/coff32/Makefile @@ -0,0 +1,22 @@ +.POSIX: + +PROJECTDIR = ../.. +LIBCOFF32 = . +include $(PROJECTDIR)/rules.mk +include objlst.mk + +TARGET = $(LIBDIR)/libcoff32.a + +all: $(TARGET) + +$(TARGET): $(LIBCOFF32-OBJ) + $(AR) $(ARFLAGS) $@ $? + ranlib $@ + +dep: + $(PROJECTDIR)/mkdep.sh + +clean: + rm -f *.o $(TARGET) + +include deps.mk diff --git a/lib/coff32/coff32_pack_aout.c b/lib/coff32/coff32_pack_aout.c @@ -0,0 +1,10 @@ + +#include <assert.h> + +#include "../../inc/coff32/aouthdr.h" +#include "../../inc/coff32/coff32.h" + +void +coff32_pack_aout(packfun fun, unsigned char *buff, AOUTHDR *aout) +{ +} diff --git a/lib/coff32/coff32_pack_ent.c b/lib/coff32/coff32_pack_ent.c @@ -0,0 +1,21 @@ + +#include <assert.h> + +#include "../../inc/coff32/syms.h" +#include "../../inc/coff32/coff32.h" + +void +coff32_pack_ent(packfun fun, unsigned char *buff, SYMENT *ent) +{ + int n; + + n = (*fun)(buff, + "'8lsscc", + &ent->n_name, + &ent->n_value, + &ent->n_scnum, + &ent->n_type, + &ent->n_sclass, + &ent->n_numaux); + assert(n == SYMESZ); +} diff --git a/lib/coff32/coff32_pack_hdr.c b/lib/coff32/coff32_pack_hdr.c @@ -0,0 +1,22 @@ + +#include <assert.h> + +#include "../../inc/coff32/filehdr.h" +#include "../../inc/coff32/coff32.h" + +void +coff32_pack_hdr(packfun fun, unsigned char *buff, FILHDR *hdr) +{ + int n; + + n = (*fun)(buff, + "sslllss", + hdr->f_magic, + hdr->f_nscns, + hdr->f_timdat, + hdr->f_symptr, + hdr->f_nsyms, + hdr->f_opthdr, + hdr->f_flags); + assert(n == FILHSZ); +} diff --git a/lib/coff32/coff32_pack_scn.c b/lib/coff32/coff32_pack_scn.c @@ -0,0 +1,25 @@ + +#include <assert.h> + +#include "../../inc/coff32/scnhdr.h" +#include "../../inc/coff32/coff32.h" + +void +coff32_pack_scn(packfun fun, unsigned char *buff, SCNHDR *scn) +{ + int n; + + n = (*fun)(buff, + "'8llllllssl", + scn->s_name, + scn->s_paddr, + scn->s_vaddr, + scn->s_size, + scn->s_scnptr, + scn->s_relptr, + scn->s_lnnoptr, + scn->s_nrelloc, + scn->s_nlnno, + scn->s_flags); + assert(n == SCNHSZ); +} diff --git a/lib/coff32/coff32_unpack_aout.c b/lib/coff32/coff32_unpack_aout.c @@ -0,0 +1,10 @@ + +#include <assert.h> + +#include "../../inc/coff32/aouthdr.h" +#include "../../inc/coff32/coff32.h" + +void +coff32_unpack_aout(packfun fun, unsigned char *buff, AOUTHDR *ent) +{ +} diff --git a/lib/coff32/coff32_unpack_ent.c b/lib/coff32/coff32_unpack_ent.c @@ -0,0 +1,21 @@ + +#include <assert.h> + +#include "../../inc/coff32/syms.h" +#include "../../inc/coff32/coff32.h" + +void +coff32_unpack_ent(packfun fun, unsigned char *buff, SYMENT *ent) +{ + int n; + + n = (*fun)(buff, + "'8lsscc", + &ent->n_name, + &ent->n_value, + &ent->n_scnum, + &ent->n_type, + &ent->n_sclass, + &ent->n_numaux); + assert(n == SYMESZ); +} diff --git a/lib/coff32/coff32_unpack_hdr.c b/lib/coff32/coff32_unpack_hdr.c @@ -0,0 +1,23 @@ + +#include <assert.h> + +#include "../../inc/coff32/filehdr.h" +#include "../../inc/coff32/coff32.h" + +void +coff32_unpack_hdr(packfun fun, unsigned char *buff, FILHDR *hdr) +{ + int n; + + n = (*fun)(buff, + "sslllss", + &hdr->f_magic, + &hdr->f_nscns, + &hdr->f_timdat, + &hdr->f_symptr, + &hdr->f_nsyms, + &hdr->f_opthdr, + &hdr->f_flags); + assert(n == FILHSZ); +} + diff --git a/lib/coff32/coff32_unpack_scn.c b/lib/coff32/coff32_unpack_scn.c @@ -0,0 +1,25 @@ + +#include <assert.h> + +#include "../../inc/coff32/scnhdr.h" +#include "../../inc/coff32/coff32.h" + +void +coff32_unpack_scn(packfun fun, unsigned char *buff, SCNHDR *scn) +{ + int n; + + n = (*fun)(buff, + "'8llllllssl", + scn->s_name, + &scn->s_paddr, + &scn->s_vaddr, + &scn->s_size, + &scn->s_scnptr, + &scn->s_relptr, + &scn->s_lnnoptr, + &scn->s_nrelloc, + &scn->s_nlnno, + &scn->s_flags); + assert(n == SCNHSZ); +} diff --git a/lib/coff32/deps.mk b/lib/coff32/deps.mk @@ -0,0 +1,17 @@ +#deps +coff32_pack_aout.o: ../../inc/coff32/aouthdr.h +coff32_pack_aout.o: ../../inc/coff32/coff32.h +coff32_pack_ent.o: ../../inc/coff32/coff32.h +coff32_pack_ent.o: ../../inc/coff32/syms.h +coff32_pack_hdr.o: ../../inc/coff32/coff32.h +coff32_pack_hdr.o: ../../inc/coff32/filehdr.h +coff32_pack_scn.o: ../../inc/coff32/coff32.h +coff32_pack_scn.o: ../../inc/coff32/scnhdr.h +coff32_unpack_aout.o: ../../inc/coff32/aouthdr.h +coff32_unpack_aout.o: ../../inc/coff32/coff32.h +coff32_unpack_ent.o: ../../inc/coff32/coff32.h +coff32_unpack_ent.o: ../../inc/coff32/syms.h +coff32_unpack_hdr.o: ../../inc/coff32/coff32.h +coff32_unpack_hdr.o: ../../inc/coff32/filehdr.h +coff32_unpack_scn.o: ../../inc/coff32/coff32.h +coff32_unpack_scn.o: ../../inc/coff32/scnhdr.h diff --git a/lib/coff32/libdep.mk b/lib/coff32/libdep.mk @@ -0,0 +1,4 @@ +include $(LIBCOFF32)/objlst.mk + +$(LIBDIR)/libcoff32.a: $(LIBCOFF32-OBJ) + +cd $(LIBCOFF32) && $(MAKE) diff --git a/lib/coff32/objlst.mk b/lib/coff32/objlst.mk @@ -0,0 +1,9 @@ + +LIBCOFF32-OBJ = $(LIBCOFF32)/coff32_pack_hdr.o \ + $(LIBCOFF32)/coff32_unpack_hdr.o \ + $(LIBCOFF32)/coff32_pack_scn.o \ + $(LIBCOFF32)/coff32_unpack_scn.o \ + $(LIBCOFF32)/coff32_pack_aout.o \ + $(LIBCOFF32)/coff32_unpack_aout.o \ + $(LIBCOFF32)/coff32_pack_ent.o \ + $(LIBCOFF32)/coff32_unpack_ent.o diff --git a/lib/crt/Makefile b/lib/crt/Makefile @@ -1,16 +1,14 @@ .POSIX: PROJECTDIR = ../.. - include $(PROJECTDIR)/rules.mk -all: +DIRS = amd64-sysv-linux amd64-sysv-openbsd amd64-sysv-netbsd -dep: - ./gendep.sh $(TARGETS) +all: $(DIRS) -clean: - rm -f */crt.o +$(DIRS): FORCE + @cd $@ && $(MAKE) -distclean: clean - rm -f makefile +clean: + $(FORALL) diff --git a/lib/crt/amd64-sysv-linux/Makefile b/lib/crt/amd64-sysv-linux/Makefile @@ -0,0 +1,9 @@ +.POSIX: + +PROJECTDIR = ../../.. +include $(PROJECTDIR)/rules.mk + +CRT = $(LIBDIR)/amd64-sysv-linux/crt.o +TARGETS = $(CRT) + +include ../common.mk diff --git a/lib/crt/amd64-sysv-linux/crt.s b/lib/crt/amd64-sysv-linux/crt.s @@ -5,4 +5,4 @@ _start: call main movl %eax, %edi - call exit + jmp exit diff --git a/lib/crt/amd64-sysv-netbsd/Makefile b/lib/crt/amd64-sysv-netbsd/Makefile @@ -0,0 +1,9 @@ +.POSIX: + +PROJECTDIR = ../../.. +include $(PROJECTDIR)/rules.mk + +CRT = $(LIBDIR)/amd64-sysv-netbsd/crt.o +TARGETS = $(CRT) + +include ../common.mk diff --git a/lib/crt/amd64-sysv-netbsd/crt.s b/lib/crt/amd64-sysv-netbsd/crt.s @@ -0,0 +1,17 @@ + .file "crt.s" + + .section .note.netbsd.ident + .long 7 + .long 4 + .long 1 + .ascii "NetBSD\0" + .p2align 2 + .long 200000000 + + .text + .align 8 + .global _start +_start: + call main + movl %eax, %edi + jmp exit diff --git a/lib/crt/amd64-sysv-openbsd/Makefile b/lib/crt/amd64-sysv-openbsd/Makefile @@ -0,0 +1,9 @@ +.POSIX: + +PROJECTDIR = ../../.. +include $(PROJECTDIR)/rules.mk + +CRT = $(LIBDIR)/amd64-sysv-openbsd/crt.o +TARGETS = $(CRT) + +include ../common.mk diff --git a/lib/crt/amd64-sysv-openbsd/crt.s b/lib/crt/amd64-sysv-openbsd/crt.s @@ -15,9 +15,4 @@ _start: call main movl %eax, %edi - call exit - - .data - .global __guard_local -__guard_local: - .long 0 + jmp exit diff --git a/lib/crt/common.mk b/lib/crt/common.mk @@ -0,0 +1,8 @@ +all: $(TARGETS) + +$(CRT): crt.o + cp crt.o $@ + +clean: + rm -f *.o + rm -f $(TARGETS) diff --git a/lib/crt/gendep.sh b/lib/crt/gendep.sh @@ -1,25 +0,0 @@ -#!/bin/sh - -set -e - -rm -f makefile $$.tmp -trap "rm -f $$.mk $$.tmp" 0 2 3 - -re='\([^-]*\)-\([^-]*\)-\([^-]*\)-\([^-]*\)' - -echo $@ | -tr ' ' '\n' | -sed "s/$re/\1-\2-\3/" | -sort -u | -(cat Makefile -echo -while read i -do - cat <<EOF >> $$.tmp - mkdir -p ../../rootdir/lib/scc/crt/$i - cp $i/crt.o ../../rootdir/lib/scc/crt/$i/ -EOF - echo all: $i/crt.o -done -echo all: -cat $$.tmp) > $$.mk && mv $$.mk makefile diff --git a/lib/scc/Makefile b/lib/scc/Makefile @@ -1,23 +1,21 @@ -.POSIX: PROJECTDIR = ../.. -LIBDIR = . +LIBSCC = . include $(PROJECTDIR)/rules.mk include objlst.mk -all: libscc.a +TARGET = $(LIBDIR)/libscc.a -$(LIB-OBJ): $(PROJECTDIR)/inc/scc.h -$(LIBDIR)/wmyro.o: $(PROJECTDIR)/inc/myro.h -$(LIBDIR)/rmyro.o: $(PROJECTDIR)/inc/myro.h +all: $(TARGET) -libscc.a: $(LIB-OBJ) - ar $(ARFLAGS) $@ $? +$(TARGET): $(LIBSCC-OBJ) + $(AR) $(ARFLAGS) $@ $? ranlib $@ dep: + $(PROJECTDIR)/mkdep.sh clean: - rm -f *.o *.a + rm -f *.o $(LIBDIR)/libscc.a -distclean: clean +include deps.mk diff --git a/lib/scc/bpack.c b/lib/scc/bpack.c @@ -1,3 +1,5 @@ + +#include <ctype.h> #include <stdarg.h> #include "../../inc/scc.h" @@ -5,16 +7,27 @@ int bpack(unsigned char *dst, char *fmt, ...) { - unsigned char *bp; + unsigned char *bp, *cp; unsigned s; unsigned long l; unsigned long long q; + size_t n; + int d; va_list va; bp = dst; va_start(va, fmt); while (*fmt) { switch (*fmt++) { + case '\'': + for (n = 0; isdigit(*fmt); n += d) { + n *= 10; + d = *fmt++ - '0'; + } + cp = va_arg(va, unsigned char *); + while (n--) + *bp++ = *cp++; + break; case 'c': *bp++ = va_arg(va, unsigned); break; diff --git a/lib/scc/bunpack.c b/lib/scc/bunpack.c @@ -26,7 +26,7 @@ lunpack(unsigned char *src, char *fmt, ...) n *= 10; d = *fmt++ - '0'; } - cp = va_arg(va, char *); + cp = va_arg(va, unsigned char *); while (n--) *cp++ = *bp++; break; diff --git a/lib/scc/deps.mk b/lib/scc/deps.mk @@ -0,0 +1,18 @@ +#deps +alloc.o: ../../inc/scc.h +bpack.o: ../../inc/scc.h +bunpack.o: ../../inc/scc.h +casecmp.o: ../../inc/scc.h +debug.o: ../../inc/scc.h +die.o: ../../inc/scc.h +lpack.o: ../../inc/scc.h +lunpack.o: ../../inc/scc.h +newitem.o: ../../inc/scc.h +rmyro.o: ../../inc/myro.h +rmyro.o: ../../inc/scc.h +wmyro.o: ../../inc/myro.h +wmyro.o: ../../inc/scc.h +xcalloc.o: ../../inc/scc.h +xmalloc.o: ../../inc/scc.h +xrealloc.o: ../../inc/scc.h +xstrdup.o: ../../inc/scc.h diff --git a/lib/scc/libdep.mk b/lib/scc/libdep.mk @@ -1,4 +1,4 @@ -include $(LIBDIR)/objlst.mk +include $(LIBSCC)/objlst.mk -$(LIBDIR)/libscc.a: $(LIB-OBJ) - +cd $(LIBDIR) && $(MAKE) +$(LIBDIR)/libscc.a: $(LIBSCC-OBJ) + +@cd $(LIBSCC) && $(MAKE) diff --git a/lib/scc/lpack.c b/lib/scc/lpack.c @@ -1,3 +1,5 @@ + +#include <ctype.h> #include <stdarg.h> #include "../../inc/scc.h" @@ -5,16 +7,27 @@ int lpack(unsigned char *dst, char *fmt, ...) { - unsigned char *bp; + unsigned char *bp, *cp; unsigned s; unsigned long l; unsigned long long q; + size_t n; + int d; va_list va; bp = dst; va_start(va, fmt); while (*fmt) { switch (*fmt++) { + case '\'': + for (n = 0; isdigit(*fmt); n += d) { + n *= 10; + d = *fmt++ - '0'; + } + cp = va_arg(va, unsigned char *); + while (n--) + *bp++ = *cp++; + break; case 'c': *bp++ = va_arg(va, unsigned); break; diff --git a/lib/scc/lunpack.c b/lib/scc/lunpack.c @@ -26,7 +26,7 @@ lunpack(unsigned char *src, char *fmt, ...) n *= 10; d = *fmt++ - '0'; } - cp = va_arg(va, char *); + cp = va_arg(va, unsigned char *); while (n--) *cp++ = *bp++; break; diff --git a/lib/scc/objlst.mk b/lib/scc/objlst.mk @@ -1,16 +1,16 @@ -LIB-OBJ = $(LIBDIR)/debug.o \ - $(LIBDIR)/die.o \ - $(LIBDIR)/newitem.o \ - $(LIBDIR)/xcalloc.o \ - $(LIBDIR)/xmalloc.o \ - $(LIBDIR)/xrealloc.o \ - $(LIBDIR)/xstrdup.o \ - $(LIBDIR)/alloc.o \ - $(LIBDIR)/casecmp.o \ - $(LIBDIR)/lunpack.o \ - $(LIBDIR)/lpack.o \ - $(LIBDIR)/bunpack.o \ - $(LIBDIR)/bpack.o \ - $(LIBDIR)/wmyro.o \ - $(LIBDIR)/rmyro.o \ +LIBSCC-OBJ = $(LIBSCC)/debug.o \ + $(LIBSCC)/die.o \ + $(LIBSCC)/newitem.o \ + $(LIBSCC)/xcalloc.o \ + $(LIBSCC)/xmalloc.o \ + $(LIBSCC)/xrealloc.o \ + $(LIBSCC)/xstrdup.o \ + $(LIBSCC)/alloc.o \ + $(LIBSCC)/casecmp.o \ + $(LIBSCC)/lunpack.o \ + $(LIBSCC)/lpack.o \ + $(LIBSCC)/bunpack.o \ + $(LIBSCC)/bpack.o \ + $(LIBSCC)/wmyro.o \ + $(LIBSCC)/rmyro.o \ diff --git a/lib/sys/Makefile b/lib/sys/Makefile @@ -1,14 +0,0 @@ -.POSIX: - -PROJECTDIR = ../.. - -include $(PROJECTDIR)/rules.mk - -all clean distclean: - +@pwd=$$PWD ;\ - for i in $(SYSS); \ - do \ - cd $$i; \ - $(MAKE) -e SYS=$i $@ ;\ - cd $$pwd; \ - done diff --git a/lib/sys/amd64-sysv-linux/Makefile b/lib/sys/amd64-sysv-linux/Makefile @@ -1,4 +0,0 @@ -.POSIX: - -include ../common.mk -ABI = amd64-sysv diff --git a/lib/sys/amd64-sysv-linux/syscall.lst b/lib/sys/amd64-sysv-linux/syscall.lst @@ -1,11 +0,0 @@ -#number name -0 _read -1 _write -2 _open -3 _close -3 _lseek -12 _brk -13 _rt_sigaction -38 _getpid -60 _Exit -32 _kill diff --git a/lib/sys/common.mk b/lib/sys/common.mk @@ -1,14 +0,0 @@ -.POSIX: - -PROJECTDIR = ../../.. - -include $(PROJECTDIR)/rules.mk - -all clean distclean: system.mk - +$(MAKE) ABI=$(ABI) -f ../libsys.mk $@ - -system.mk: syscall.lst - rm -f $@; trap "rm -f $$$$.mk" 0 2 3; \ - awk 'BEGIN{printf "OBJ = "} \ - ! /^#/ {printf "%s.o ", $$2}' syscall.lst > $$$$.mk && \ - mv $$$$.mk $@ diff --git a/lib/sys/i386-sysv-linux/Makefile b/lib/sys/i386-sysv-linux/Makefile @@ -1,3 +0,0 @@ -.POSIX: - -include ../Makefile.sys diff --git a/lib/sys/i386-sysv-linux/syscall.lst b/lib/sys/i386-sysv-linux/syscall.lst diff --git a/lib/sys/libsys.mk b/lib/sys/libsys.mk @@ -1,25 +0,0 @@ -.POSIX: - -PROJECTDIR = ../../.. - -include $(PROJECTDIR)/rules.mk -include system.mk - -ASM = $(OBJ:.o=.s) - -all: libsys.a - -libsys.a: $(OBJ) - $(AR) $(ARFLAGS) $@ $? - ranlib $@ - -$(ASM): syscall.lst - ../abi/$(ABI).sh - -clean: - rm -f $(ASM) - rm -f $(OBJ) - rm -f libsys.a - -distclean: clean - rm -f system.mk diff --git a/lib/sys/qbe-linux/Makefile b/lib/sys/qbe-linux/Makefile @@ -1,4 +0,0 @@ -.POSIX: - -include ../common.mk -ABI=amd64-sysv diff --git a/lib/sys/qbe-linux/syscall.lst b/lib/sys/qbe-linux/syscall.lst @@ -1,11 +0,0 @@ -#number name -0 _read -1 _write -2 _open -3 _close -3 _lseek -12 _brk -13 _rt_sigaction -38 _getpid -60 _Exit -32 _kill diff --git a/lib/sys/z80-linux/Makefile b/lib/sys/z80-linux/Makefile @@ -1,3 +0,0 @@ -.POSIX: - -include ../Makefile.sys diff --git a/lib/sys/z80-linux/syscall.lst b/lib/sys/z80-linux/syscall.lst diff --git a/mkdep.sh b/mkdep.sh @@ -1,11 +1,19 @@ #!/bin/sh set -e -trap "rm -f $$.tmp" 0 2 3 -(sed '/^#deps/q' Makefile -for i in *.c +(echo '/^#deps/+;$c' + +for i in `find . -name '*.c'` do - sed -n '/#include "/ s/#include "\(.*\)"/'$i': \1/p' $i + file=`basename $i | sed 's/\.c$/.o/'` + + dir=`dirname $i | + sed -e 's,^\./,,' -e 's,^\.$,,' -e 's,...*[^/],&/,'` + + sed -n "/#include \"/ s,#include \"\(.*\)\",$dir$file: $dir\1,p" $i done | -sort) > $$.tmp && mv $$.tmp Makefile +LC_ALL=C sort -s + +echo . +echo w) | ed -s deps.mk diff --git a/nm/Makefile b/nm/Makefile @@ -2,32 +2,21 @@ PROJECTDIR = .. include $(PROJECTDIR)/rules.mk -include $(LIBDIR)/libdep.mk +include $(LIBSCC)/libdep.mk OBJ = main.o coff32.o formats.o -all: nm - cp nm $(PROJECTDIR)/rootdir/bin/nm +all: $(BINDIR)/nm -nm: $(OBJ) $(LIBDIR)/libscc.a +$(BINDIR)/nm: $(OBJ) $(LIBDIR)/libscc.a $(CC) $(SCC_LDFLAGS) $(OBJ) -lscc -o $@ dep: $(PROJECTDIR)/mkdep.sh clean: - rm -f nm *.o + rm -f $(BINDIR)/nm *.o distclean: clean -#deps -coff32.c: ../inc/coff32/filehdr.h -coff32.c: ../inc/coff32/scnhdr.h -coff32.c: ../inc/coff32/syms.h -coff32.c: ../inc/scc.h -coff32.c: nm.h -formats.c: nm.h -main.c: ../inc/arg.h -main.c: ../inc/ar.h -main.c: ../inc/scc.h -main.c: nm.h +include deps.mk diff --git a/nm/coff32.c b/nm/coff32.c @@ -30,7 +30,7 @@ typeof(SYMENT *ent) switch (ent->n_scnum) { case N_DEBUG: - c = '?'; + c = 'n'; break; case N_ABS: c = 'a'; @@ -251,9 +251,9 @@ nm(char *fname, char *member, FILE *fp) long pos = ftell(fp); if (fread(buff, FILHSZ, 1, fp) != 1) { - if (ferror(fp)) - die("nm: %s: %s", fname, strerror(errno)); - die("nm: %s: corrupted file", fname); + if (!ferror(fp)) + return 0; + die("nm: %s: %s", fname, strerror(errno)); } getfhdr(buff, &hdr); @@ -297,6 +297,7 @@ probe(char *fname, char *member, FILE *fp) magic = c1 | c2 << 8; switch (magic) { + case COFF_I386MAGIC: case COFF_Z80MAGIC: unpack = lunpack; return 1; diff --git a/nm/deps.mk b/nm/deps.mk @@ -0,0 +1,12 @@ + +#deps +coff32.o: ../inc/coff32/filehdr.h +coff32.o: ../inc/coff32/scnhdr.h +coff32.o: ../inc/coff32/syms.h +coff32.o: ../inc/scc.h +coff32.o: nm.h +formats.o: nm.h +main.o: ../inc/ar.h +main.o: ../inc/arg.h +main.o: ../inc/scc.h +main.o: nm.h diff --git a/objdump/Makefile b/objdump/Makefile @@ -2,19 +2,19 @@ PROJECTDIR = .. include $(PROJECTDIR)/rules.mk -include $(LIBDIR)/libdep.mk +include $(LIBSCC)/libdep.mk OBJ = main.o -all: objdump +all: $(BINDIR)/objdump -objdump: $(OBJ) $(LIBDIR)/libscc.a +$(BINDIR)/objdump: $(OBJ) $(LIBDIR)/libscc.a $(CC) $(SCC_LDFLAGS) $(OBJ) -lscc -o $@ -main.o: $(PROJECTDIR)/inc/scc.h $(PROJECTDIR)/inc/myro.h $(PROJECTDIR)/inc/arg.h - dep: + $(PROJECTDIR)/mkdep.sh + clean: - rm -f objdump *.o + rm -f $(BINDIR)/objdump *.o -distclean: clean +include deps.mk diff --git a/objdump/deps.mk b/objdump/deps.mk @@ -0,0 +1,4 @@ +#deps +main.o: ../inc/arg.h +main.o: ../inc/myro.h +main.o: ../inc/scc.h diff --git a/rootdir/bin/README b/rootdir/bin/README @@ -0,0 +1 @@ +This is a placeholder for VCS diff --git a/rootdir/include/scc/assert.h b/rootdir/include/scc/assert.h @@ -0,0 +1,9 @@ + +extern void __assert(char *exp, char *file, long line); + +#undef assert +#ifndef NDEBUG +# define assert(exp) ((exp) ? (void) 0 : __assert(#exp, __FILE__, __LINE__)) +#else +# define assert(exp) ((void)0) +#endif diff --git a/rootdir/include/scc/bits/.gitignore b/rootdir/include/scc/bits/.gitignore @@ -0,0 +1 @@ +errno.h diff --git a/rootdir/include/scc/bits/amd64-sysv/arch/limits.h b/rootdir/include/scc/bits/amd64-sysv/arch/limits.h @@ -0,0 +1,18 @@ +#define CHAR_BIT 8 +#define SCHAR_MAX 0x7F +#define SCHAR_MIN (-SCHAR_MAX-1) +#define CHAR_MAX 0x7F +#define CHAR_MIN (-CHAR_MAX-1) +#define UCHAR_MAX 0xFF +#define SHRT_MAX 0x7FFF +#define SHRT_MIN (-SHRT_MAX-1) +#define USHRT_MAX 0xFFFF +#define INT_MAX 0x7FFFFFFF +#define INT_MIN (-INT_MAX-1) +#define UINT_MAX 0xFFFFFFFF +#define LONG_MAX 0x7FFFFFFFFFFFFFFF +#define LONG_MIN (-LONG_MAX-1) +#define ULONG_MAX 0xFFFFFFFFFFFFFFFF +#define LLONG_MAX 0x7FFFFFFFFFFFFFFF +#define LLONG_MIN (-LLONG_MAX-1) +#define ULLONG_MAX 0xFFFFFFFFFFFFFFFF diff --git a/rootdir/include/scc/bits/amd64-sysv/arch/setjmp.h b/rootdir/include/scc/bits/amd64-sysv/arch/setjmp.h @@ -0,0 +1 @@ +typedef unsigned long long jmp_buf[8]; diff --git a/lib/c/include/bits/amd64-sysv/arch/stddef.h b/rootdir/include/scc/bits/amd64-sysv/arch/stddef.h diff --git a/lib/c/include/bits/amd64-sysv/arch/stdint.h b/rootdir/include/scc/bits/amd64-sysv/arch/stdint.h diff --git a/rootdir/include/scc/bits/amd64-sysv/arch/stdio.h b/rootdir/include/scc/bits/amd64-sysv/arch/stdio.h @@ -0,0 +1,15 @@ +#ifndef _SIZET +typedef unsigned long size_t; +#define _SIZET +#endif + +#define BUFSIZ 512 +#define FILENAME_MAX 256 +#define FOPEN_MAX 16 + +#define TMP_MAX 25 +#define L_tmpnam 256 + +#define _TMPNAME "/tmp/tmp.0000000" + +typedef int fpos_t; diff --git a/lib/c/include/bits/amd64-sysv/arch/stdlib.h b/rootdir/include/scc/bits/amd64-sysv/arch/stdlib.h diff --git a/lib/c/include/bits/amd64-sysv/arch/string.h b/rootdir/include/scc/bits/amd64-sysv/arch/string.h diff --git a/lib/c/include/bits/amd64-sysv/arch/time.h b/rootdir/include/scc/bits/amd64-sysv/arch/time.h diff --git a/rootdir/include/scc/bits/i386-sysv/arch/limits.h b/rootdir/include/scc/bits/i386-sysv/arch/limits.h @@ -0,0 +1,18 @@ +#define CHAR_BIT 8 +#define SCHAR_MAX 0x7F +#define SCHAR_MIN (-SCHAR_MIN-1) +#define CHAR_MAX 0x7F +#define CHAR_MIN (-CHAR_MAX-1) +#define UCHAR_MAX 0xFF +#define SHRT_MAX 0x7FFF +#define SHRT_MIN (-SHRT_MAX-1) +#define USHRT_MAX 0xFFFF +#define INT_MAX 0x7FFFFFFF +#define INT_MIN (-INT_MAX-1) +#define UINT_MAX 0xFFFFFFFF +#define LONG_MAX 0x7FFFFFFF +#define LONG_MIN (-LONG_MAX-1) +#define ULONG_MAX 0xFFFFFFFF +#define LLONG_MAX 0x7FFFFFFFFFFFFFFF +#define LLONG_MIN (-LLONG_MAX-1) +#define ULLONG_MAX 0xFFFFFFFFFFFFFFFF diff --git a/lib/c/include/bits/i386-sysv/arch/stddef.h b/rootdir/include/scc/bits/i386-sysv/arch/stddef.h diff --git a/lib/c/include/bits/i386-sysv/arch/stdint.h b/rootdir/include/scc/bits/i386-sysv/arch/stdint.h diff --git a/rootdir/include/scc/bits/i386-sysv/arch/stdio.h b/rootdir/include/scc/bits/i386-sysv/arch/stdio.h @@ -0,0 +1,15 @@ +#ifndef _SIZET +typedef unsigned long size_t; +#define _SIZET +#endif + +#define BUFSIZ 512 +#define FILENAME_MAX 256 +#define FOPEN_MAX 16 + +#define TMP_MAX 25 +#define L_tmpnam 256 + +#define _TMPNAME "/tmp/tmp.0000000" + +typedef long fpos_t; diff --git a/lib/c/include/bits/i386-sysv/arch/stdlib.h b/rootdir/include/scc/bits/i386-sysv/arch/stdlib.h diff --git a/lib/c/include/bits/i386-sysv/arch/string.h b/rootdir/include/scc/bits/i386-sysv/arch/string.h diff --git a/lib/c/include/bits/i386-sysv/arch/time.h b/rootdir/include/scc/bits/i386-sysv/arch/time.h diff --git a/rootdir/include/scc/bits/linux/sys/signal.h b/rootdir/include/scc/bits/linux/sys/signal.h @@ -0,0 +1,27 @@ +typedef int sig_atomic_t; + +#define SIG_ERR ((void (*)(int))-1) +#define SIG_DFL ((void (*)(int)) 0) +#define SIG_IGN ((void (*)(int)) 1) + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGABRT 6 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGSSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 + +#define __NR_SIGNALS 23 diff --git a/rootdir/include/scc/bits/netbsd/sys/signal.h b/rootdir/include/scc/bits/netbsd/sys/signal.h @@ -0,0 +1,27 @@ +typedef int sig_atomic_t; + +#define SIG_ERR ((void (*)(int))-1) +#define SIG_DFL ((void (*)(int)) 0) +#define SIG_IGN ((void (*)(int)) 1) + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGABRT 6 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGSSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 + +#define __NR_SIGNALS 23 diff --git a/rootdir/include/scc/bits/openbsd/sys/signal.h b/rootdir/include/scc/bits/openbsd/sys/signal.h @@ -0,0 +1,27 @@ +typedef int sig_atomic_t; + +#define SIG_ERR ((void (*)(int))-1) +#define SIG_DFL ((void (*)(int)) 0) +#define SIG_IGN ((void (*)(int)) 1) + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGABRT 6 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGSSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 + +#define __NR_SIGNALS 23 diff --git a/rootdir/include/scc/bits/z80-dos/arch/limits.h b/rootdir/include/scc/bits/z80-dos/arch/limits.h @@ -0,0 +1,18 @@ +#define CHAR_BIT 8 +#define SCHAR_MAX 0x7F +#define SCHAR_MIN (-SCHAR_MIN-1) +#define CHAR_MAX 0xFF +#define CHAR_MIN 0 +#define UCHAR_MAX 0xFF +#define SHRT_MAX 0x7FFF +#define SHRT_MIN (-SHRT_MAX-1) +#define USHRT_MAX 0xFFFF +#define INT_MAX 0x7FFF +#define INT_MIN (-INT_MAX-1) +#define UINT_MAX 0xFFFF +#define LONG_MAX 0x7FFFFFFF +#define LONG_MIN (-LONG_MAX-1) +#define ULONG_MAX 0xFFFFFFFF +#define LLONG_MAX 0x7FFFFFFFFFFFFFFF +#define LLONG_MIN (-LLONG_MAX-1) +#define ULLONG_MAX 0xFFFFFFFFFFFFFFFF diff --git a/lib/c/include/bits/z80-dos/arch/stddef.h b/rootdir/include/scc/bits/z80-dos/arch/stddef.h diff --git a/lib/c/include/bits/z80-dos/arch/stdint.h b/rootdir/include/scc/bits/z80-dos/arch/stdint.h diff --git a/rootdir/include/scc/bits/z80-dos/arch/stdio.h b/rootdir/include/scc/bits/z80-dos/arch/stdio.h @@ -0,0 +1,15 @@ +#ifndef _SIZET +typedef unsigned size_t; +#define _SIZET +#endif + +#define BUFSIZ 512 +#define FILENAME_MAX 256 +#define FOPEN_MAX 16 + +#define TMP_MAX 25 +#define L_tmpnam 256 + +#define _TMPNAME "TMP.000" + +typedef long fpos_t; diff --git a/lib/c/include/bits/z80-dos/arch/stdlib.h b/rootdir/include/scc/bits/z80-dos/arch/stdlib.h diff --git a/lib/c/include/bits/z80-dos/arch/string.h b/rootdir/include/scc/bits/z80-dos/arch/string.h diff --git a/lib/c/include/bits/z80-dos/arch/time.h b/rootdir/include/scc/bits/z80-dos/arch/time.h diff --git a/lib/c/include/ctype.h b/rootdir/include/scc/ctype.h diff --git a/rootdir/include/scc/errno.h b/rootdir/include/scc/errno.h @@ -0,0 +1,10 @@ +#ifndef _ERRNO_H +#define _ERRNO_H + +#include <sys/errno.h> + +extern int errno; +extern char *_sys_errlist[]; +extern int _sys_nerr; + +#endif diff --git a/rootdir/include/scc/float.h b/rootdir/include/scc/float.h @@ -0,0 +1,4 @@ +#ifndef _FLOAT_H +#define _FLOAT_H +#error not supported yet +#endif diff --git a/rootdir/include/scc/limits.h b/rootdir/include/scc/limits.h @@ -0,0 +1,8 @@ +#ifndef _LIMITS_H +#define _LIMITS_H + +#include <arch/limits.h> + +#define MB_LEN_MAX 4 + +#endif diff --git a/lib/c/include/locale.h b/rootdir/include/scc/locale.h diff --git a/rootdir/include/scc/math.h b/rootdir/include/scc/math.h @@ -0,0 +1,4 @@ +#ifndef _MATH_H +#define _MATH_H +#error math.h is not supported yet +#endif diff --git a/rootdir/include/scc/setjmp.h b/rootdir/include/scc/setjmp.h @@ -0,0 +1,11 @@ +#ifndef _SETJMP_H +#define _SETJMP_H + +#include <arch/setjmp.h> + +extern int setjmp(jmp_buf env); +extern void longjmp(jmp_buf env, int val); + +#define setjmp setjmp + +#endif diff --git a/rootdir/include/scc/signal.h b/rootdir/include/scc/signal.h @@ -0,0 +1,9 @@ +#ifndef _SIGNAL_H +#define _SIGNAL_H + +#include <sys/signal.h> + +void ( *signal(int signum, void (*handler)(int)) ) (int); +int raise(int sig); + +#endif diff --git a/lib/c/include/stdarg.h b/rootdir/include/scc/stdarg.h diff --git a/rootdir/include/scc/stdbool.h b/rootdir/include/scc/stdbool.h @@ -0,0 +1,9 @@ +#ifndef _STDBOOL_H +#define _STDBOOL_H + +#define bool _Bool +#define true 1 +#define false 0 +#define __bool_true_false_are_defined 1 + +#endif diff --git a/lib/c/include/stddef.h b/rootdir/include/scc/stddef.h diff --git a/lib/c/include/stdint.h b/rootdir/include/scc/stdint.h diff --git a/lib/c/include/stdio.h b/rootdir/include/scc/stdio.h diff --git a/lib/c/include/stdlib.h b/rootdir/include/scc/stdlib.h diff --git a/rootdir/include/scc/string.h b/rootdir/include/scc/string.h @@ -0,0 +1,34 @@ +#ifndef _STRING_H +#define _STRING_H + +#include <arch/string.h> + +#ifndef NULL +#define NULL ((void *) 0) +#endif + +extern void *memcpy(void * restrict s1, const void * restrict s2, size_t n); +extern void *memmove(void *s1, const void *s2, size_t n); +extern char *strcpy(char * restrict s1, const char * restrict s2); +extern char *strncpy(char * restrict s1, const char * restrict s2, size_t n); +extern char *strcat(char * restrict s1, const char * restrict s2); +extern char *strncat(char * restrict s1, const char * restrict s2, size_t n); +extern int memcmp(const void *s1, const void *s2, size_t n); +extern int strcmp(const char *s1, const char *s2); +extern int strcoll(const char *s1, const char *s2); +extern int strncmp(const char *s1, const char *s2, size_t n); +extern size_t strxfrm(char * restrict s1, const char * restrict s2, size_t n); +extern void *memchr(const void *s, int c, size_t n); +extern char *strchr(const char *s, int c); +extern size_t strcspn(const char *s1, const char *s2); +extern char *strpbrk(const char *s1, const char *s2); +extern char *strrchr(const char *s, int c); +extern size_t strspn(const char *s1, const char *s2); +extern char *strstr(const char *s1, const char *s2); +extern char *strtok(char * restrict s1, const char * restrict s2); +extern void *memset(void *s, int c, size_t n); +extern char *strerror(int errnum); +extern size_t strlen(const char *s); +extern size_t strnlen(const char *s, size_t maxlen); + +#endif diff --git a/lib/c/include/time.h b/rootdir/include/scc/time.h diff --git a/rootdir/include/scc/wchar.h b/rootdir/include/scc/wchar.h @@ -0,0 +1,11 @@ +#ifndef _WCHAR_H +#define _WCHAR_H + +/* TODO: This is only a placeholder */ +typedef long wchar_t; +typedef long wint_t; + +extern size_t wcsnlen(const wchar_t *s, size_t maxlen); +extern wint_t putwc(wchar_t wc, FILE *fp); + +#endif diff --git a/rootdir/lib/scc/amd64-sysv-linux/README b/rootdir/lib/scc/amd64-sysv-linux/README @@ -0,0 +1 @@ +This is a placeholder for VCS diff --git a/rootdir/lib/scc/amd64-sysv-netbsd/README b/rootdir/lib/scc/amd64-sysv-netbsd/README @@ -0,0 +1 @@ +This is a placeholder for VCS diff --git a/rootdir/lib/scc/amd64-sysv-openbsd/README b/rootdir/lib/scc/amd64-sysv-openbsd/README @@ -0,0 +1 @@ +This is a placeholder for VCS diff --git a/rootdir/lib/scc/i386-sysv-linux/README b/rootdir/lib/scc/i386-sysv-linux/README @@ -0,0 +1 @@ +This is a placeholder for VCS diff --git a/rootdir/lib/scc/i386-sysv-openbsd/README b/rootdir/lib/scc/i386-sysv-openbsd/README @@ -0,0 +1 @@ +This is a placeholder for VCS diff --git a/rootdir/lib/scc/z80-scc-none/README b/rootdir/lib/scc/z80-scc-none/README @@ -0,0 +1 @@ +This is a placeholder for VCS diff --git a/rootdir/libexec/scc/README b/rootdir/libexec/scc/README @@ -0,0 +1 @@ +This is a placeholder for VCS diff --git a/rules.mk b/rules.mk @@ -1,14 +1,18 @@ include $(PROJECTDIR)/config.mk -INCDIR = $(PROJECTDIR)/inc/ -LIBDIR = $(PROJECTDIR)/lib/scc +INCLUDE = $(PROJECTDIR)/inc -SCC_CFLAGS = $(MOREFLAGS) \ - $(SYSCFLAGS) \ - -g \ - $(CFLAGS) +BINDIR = $(PROJECTDIR)/rootdir/bin +INCDIR = $(PROJECTDIR)/rootdir/include/scc +LIBDIR = $(PROJECTDIR)/rootdir/lib/scc +LIBEXEC = $(PROJECTDIR)/rootdir/libexec/scc -SCC_LDFLAGS = -L$(LIBDIR) -g $(LDFLAGS) +LIBSCC = $(PROJECTDIR)/lib/scc +LIBCOFF32 = $(PROJECTDIR)/lib/coff32 + +SCC_CFLAGS = $(MORECFLAGS) $(SYSCFLAGS) $(STDCFLAGS) -g $(CFLAGS) + +SCC_LDFLAGS = $(MORELFLAGS) $(SYSLDFLAGS) -L$(LIBDIR) -g $(LDFLAGS) # helper macro to run over all the directories FORALL = +@set -e ;\ @@ -26,14 +30,8 @@ FORALL = +@set -e ;\ .c.o: $(CC) $(SCC_CFLAGS) -o $@ -c $< -.c: - $(CC) $(SCC_CFLAGS) $(SCC_LDFLAGS) -o $@ $< - - -all: $(PROJECTDIR)/rootdir/bin $(PROJECTDIR)/rootdir/libexec/scc - -$(PROJECTDIR)/rootdir/bin: - mkdir -p $(PROJECTDIR)/rootdir/bin - -$(PROJECTDIR)/rootdir/libexec/scc: - mkdir -p $(PROJECTDIR)/rootdir/libexec/scc +all: +dep: +clean: +distclean: clean +FORCE: diff --git a/system.mk b/system.mk @@ -1,18 +0,0 @@ -# Plan9 -SYSCFLAGS = -D_SUSV2_SOURCE - -# NetBSD -CC1_CFLAGS = -D_ISOC99_SOURCE -D_ANSI_SOURCE -CC2_CFLAGS = -D_ISOC99_SOURCE -D_ANSI_SOURCE -AS_CFLAGS = -D_ISOC99_SOURCE -D_ANSI_SOURCE - -# OpenBSD -CC1_CFLAGS = -D_ISOC99_SOURCE -D_ANSI_SOURCE -CC2_CFLAGS = -D_ISOC99_SOURCE -D_ANSI_SOURCE -AS_CFLAGS = -D_ISOC99_SOURCE -D_ANSI_SOURCE - -# FreeBSD -CC1_CFLAGS = -D_ISOC99_SOURCE -D_ANSI_SOURCE -CC2_CFLAGS = -D_ISOC99_SOURCE -D_ANSI_SOURCE -AS_CFLAGS = -D_ISOC99_SOURCE -D_ANSI_SOURCE - diff --git a/tests/Makefile b/tests/Makefile @@ -3,10 +3,11 @@ PROJECTDIR = .. include $(PROJECTDIR)/rules.mk -DIRS=ar nm +DIRS=ar/execute \ + nm/execute \ + as/execute \ + libc/execute \ + scc/execute scc/error all clean: $(FORALL) - -distclean: clean -dep: diff --git a/tests/ar/Makefile b/tests/ar/Makefile @@ -1,9 +0,0 @@ -.POSIX: - -PROJECTDIR = ../.. -include $(PROJECTDIR)/rules.mk - -DIRS=error execute - -all clean: - $(FORALL) diff --git a/tests/ar/error/Makefile b/tests/ar/error/Makefile @@ -1,3 +0,0 @@ -.POSIX: - -all clean: diff --git a/tests/ar/execute/0001-append.sh b/tests/ar/execute/0001-append.sh @@ -2,11 +2,11 @@ set -e -trap "rm -f file.a f1 f2 f3 $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file.a f1 f2 f3 $tmp1 $tmp2; exit" 0 2 3 + ########################################################################### #Append generated files at once to an empty archive diff --git a/tests/ar/execute/0002-append.sh b/tests/ar/execute/0002-append.sh @@ -2,11 +2,11 @@ set -e -trap "rm -f file.a f1 f2 f3 $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file.a f1 f2 f3 $tmp1 $tmp2; exit" 0 2 3 + ########################################################################### #Append generated files one by one to an empty file diff --git a/tests/ar/execute/0003-append.sh b/tests/ar/execute/0003-append.sh @@ -2,11 +2,11 @@ set -e -trap "rm -f file* f1 f2 f3 $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file* f1 f2 f3 $tmp1 $tmp2; exit" 0 2 3 + ########################################################################### #Append generated files at once to an existing archive diff --git a/tests/ar/execute/0004-append.sh b/tests/ar/execute/0004-append.sh @@ -2,11 +2,11 @@ set -e -trap "rm -f file.a f1 f2 f3 $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file.a f1 f2 f3 $tmp1 $tmp2; exit" 0 2 3 + ########################################################################### #empty file list diff --git a/tests/ar/execute/0005-append.sh b/tests/ar/execute/0005-append.sh @@ -2,11 +2,11 @@ set -e -trap "rm -f file.a f1 f2 f3 $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file.a f1 f2 f3 $tmp1 $tmp2; exit" 0 2 3 + ########################################################################### #empty file list diff --git a/tests/ar/execute/0006-append.sh b/tests/ar/execute/0006-append.sh @@ -2,11 +2,11 @@ set -e -trap "rm -f file.a f1 f2 f3 $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file.a f1 f2 f3 $tmp1 $tmp2; exit" 0 2 3 + ########################################################################### #empty file list diff --git a/tests/ar/execute/0007-delete.sh b/tests/ar/execute/0007-delete.sh @@ -3,7 +3,7 @@ set -e -trap "rm -f file.a" 0 2 3 +trap "rm -f file.a; exit" 0 2 3 ############################################################################ #delete one member diff --git a/tests/ar/execute/0008-delete.sh b/tests/ar/execute/0008-delete.sh @@ -3,7 +3,7 @@ set -e -trap "rm -f file.a" 0 2 3 +trap "rm -f file.a; exit" 0 2 3 ############################################################################ #delete two members, 1st and 2nd diff --git a/tests/ar/execute/0009-delete.sh b/tests/ar/execute/0009-delete.sh @@ -3,7 +3,7 @@ set -e -trap "rm -f file.a" 0 2 3 +trap "rm -f file.a; exit" 0 2 3 ############################################################################ #delete two members, 2nd and 3rd diff --git a/tests/ar/execute/0010-delete.sh b/tests/ar/execute/0010-delete.sh @@ -3,7 +3,7 @@ set -e -trap "rm -f file.a" 0 2 3 +trap "rm -f file.a; exit" 0 2 3 ############################################################################ #remove all the members diff --git a/tests/ar/execute/0011-delete.sh b/tests/ar/execute/0011-delete.sh @@ -3,7 +3,7 @@ set -e -trap "rm -f file.a" 0 2 3 +trap "rm -f file.a; exit" 0 2 3 ############################################################################ #no members diff --git a/tests/ar/execute/0012-delete.sh b/tests/ar/execute/0012-delete.sh @@ -3,7 +3,7 @@ set -e -trap "rm -f file.a" 0 2 3 +trap "rm -f file.a; exit" 0 2 3 ############################################################################ #delete one member diff --git a/tests/ar/execute/0013-print.sh b/tests/ar/execute/0013-print.sh @@ -1,12 +1,11 @@ #!/bin/sh - - set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file.a $tmp1 $tmp2" 0 2 3 + +trap "rm -f file.a $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #print 1st member diff --git a/tests/ar/execute/0014-print.sh b/tests/ar/execute/0014-print.sh @@ -1,12 +1,11 @@ #!/bin/sh - - set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file.a $tmp1 $tmp2" 0 2 3 + +trap "rm -f file.a $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #print 3rd member diff --git a/tests/ar/execute/0015-print.sh b/tests/ar/execute/0015-print.sh @@ -1,13 +1,11 @@ #!/bin/sh - - set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file.a $tmp1 $tmp2" 0 2 3 +trap "rm -f file.a $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #print 2nd member with verbose diff --git a/tests/ar/execute/0016-print.sh b/tests/ar/execute/0016-print.sh @@ -1,12 +1,11 @@ #!/bin/sh - - set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file.a $tmp1 $tmp2" 0 2 3 + +trap "rm -f file.a $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #print all members diff --git a/tests/ar/execute/0017-print.sh b/tests/ar/execute/0017-print.sh @@ -1,11 +1,11 @@ #!/bin/sh - set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file.a $tmp1 $tmp2" 0 2 3 + +trap "rm -f file.a $tmp1 $tmp2; exit" 0 2 3 #and now with no members in command line diff --git a/tests/ar/execute/0018-list.sh b/tests/ar/execute/0018-list.sh @@ -4,8 +4,8 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file.a $tmp1 $tmp2" 0 2 3 +trap "rm -f file.a $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #list 1st member diff --git a/tests/ar/execute/0019-list.sh b/tests/ar/execute/0019-list.sh @@ -4,8 +4,8 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file.a $tmp1 $tmp2" 0 2 3 +trap "rm -f file.a $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #print 3rd member diff --git a/tests/ar/execute/0020-list.sh b/tests/ar/execute/0020-list.sh @@ -4,7 +4,8 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file.a $tmp1 $tmp2" 0 2 3 + +trap "rm -f file.a $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #print 2nd member with verbose diff --git a/tests/ar/execute/0021-list.sh b/tests/ar/execute/0021-list.sh @@ -4,7 +4,8 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file.a $tmp1 $tmp2" 0 2 3 + +trap "rm -f file.a $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #print all members diff --git a/tests/ar/execute/0022-list.sh b/tests/ar/execute/0022-list.sh @@ -4,8 +4,8 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file.a $tmp1 $tmp2" 0 2 3 +trap "rm -f file.a $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #list 1st member diff --git a/tests/ar/execute/0023-extract.sh b/tests/ar/execute/0023-extract.sh @@ -1,11 +1,11 @@ #!/bin/sh - set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file* $tmp1 $tmp2" 0 2 3 + +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #extract 1st member diff --git a/tests/ar/execute/0024-extract.sh b/tests/ar/execute/0024-extract.sh @@ -1,12 +1,11 @@ #!/bin/sh - set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file* $tmp1 $tmp2" 0 2 3 +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #extract 3rd member diff --git a/tests/ar/execute/0025-extract.sh b/tests/ar/execute/0025-extract.sh @@ -1,11 +1,11 @@ #!/bin/sh - set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file* $tmp1 $tmp2" 0 2 3 + +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #extract 3rd member diff --git a/tests/ar/execute/0026-extract.sh b/tests/ar/execute/0026-extract.sh @@ -1,11 +1,11 @@ #!/bin/sh - set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file* $tmp1 $tmp2" 0 2 3 + +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #extract all members diff --git a/tests/ar/execute/0027-extract.sh b/tests/ar/execute/0027-extract.sh @@ -1,12 +1,11 @@ #!/bin/sh - set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f file* $tmp1 $tmp2" 0 2 3 +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 ############################################################################ #extract without parameters diff --git a/tests/ar/execute/0029-move.sh b/tests/ar/execute/0029-move.sh @@ -1,14 +1,12 @@ #!/bin/sh - - set -e -trap "rm -f file* $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 + ############################################################################ #move 1st without specifier diff --git a/tests/ar/execute/0030-move.sh b/tests/ar/execute/0030-move.sh @@ -1,14 +1,12 @@ #!/bin/sh - - set -e -trap "rm -f file* $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 + ############################################################################ #move 1st at the end diff --git a/tests/ar/execute/0031-move.sh b/tests/ar/execute/0031-move.sh @@ -1,14 +1,12 @@ #!/bin/sh - - set -e -trap "rm -f file* $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 + ############################################################################ #and now, test without parameters diff --git a/tests/ar/execute/0032-update.sh b/tests/ar/execute/0032-update.sh @@ -2,11 +2,11 @@ set -e -trap "rm -f file* $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 + ############################################################################ #Update one member that already exist diff --git a/tests/ar/execute/0033-update.sh b/tests/ar/execute/0033-update.sh @@ -2,11 +2,11 @@ set -e -trap "rm -f file* $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 + ############################################################################ #Update one member that doesn't exist diff --git a/tests/ar/execute/0034-update.sh b/tests/ar/execute/0034-update.sh @@ -2,11 +2,11 @@ set -e -trap "rm -f file* $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 + ############################################################################ #Update one member that exists and using -a diff --git a/tests/ar/execute/0035-update.sh b/tests/ar/execute/0035-update.sh @@ -2,11 +2,11 @@ set -e -trap "rm -f file* $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 + ############################################################################ #Update one member that exists and using -b diff --git a/tests/ar/execute/0036-update.sh b/tests/ar/execute/0036-update.sh @@ -2,11 +2,11 @@ set -e -trap "rm -f file* $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 + ############################################################################ #Update one member that doesn't exist and using -b diff --git a/tests/ar/execute/0037-update.sh b/tests/ar/execute/0037-update.sh @@ -2,11 +2,11 @@ set -e -trap "rm -f file* $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 + ############################################################################ #Update one member that doesn't exist and using -a diff --git a/tests/ar/execute/0038-update.sh b/tests/ar/execute/0038-update.sh @@ -2,11 +2,11 @@ set -e -#trap "rm -f file* $tmp1 $tmp2" 0 2 3 - tmp1=`mktemp` tmp2=`mktemp` +trap "rm -f file* $tmp1 $tmp2; exit" 0 2 3 + ############################################################################ #Update without parameters diff --git a/tests/ar/execute/Makefile b/tests/ar/execute/Makefile @@ -1,12 +1,12 @@ .POSIX: PROJECTDIR=$$PWD/../../../ -ROOTDIR=$(PROJECTDIR)/rootdir +ROOT=$(PROJECTDIR)/rootdir all: tests tests: master.a - PATH=$(ROOTDIR)/bin:$$PATH ./chktest.sh + @TZ=UTC PATH=$(ROOT)/bin:$$PATH ./chktest.sh master.a: ./mkmaster.sh diff --git a/tests/ar/execute/chktest.sh b/tests/ar/execute/chktest.sh @@ -1,9 +1,6 @@ #!/bin/sh -ttyflags=`stty -g` -trap "stty $ttyflags;tabs -8;rm -rf file*" 0 2 3 15 -stty tabs -tabs 40 +trap "rm -rf file*; exit" 0 2 3 15 ulimit -c 0 rm -f test.log rm -rf file* @@ -11,6 +8,6 @@ rm -rf file* for i in *-*.sh do printf "Test: %s\n\n" $i >> test.log - printf "%s\t" $i - ./$i >> test.log 2>&1 && echo [OK] || echo [FAIL] + ./$i >> test.log 2>&1 && printf '[PASS]: ' || printf '[FAIL]: ' + echo "$i" done diff --git a/tests/ar/execute/mkmaster.sh b/tests/ar/execute/mkmaster.sh @@ -2,7 +2,7 @@ uid=`id -u` gid=`id -g` -time=`date -d "1980-01-01" +%s` +time=315532800 cat <<EOF >master.a !<arch> diff --git a/tests/as/execute/Makefile b/tests/as/execute/Makefile @@ -0,0 +1,12 @@ +.POSIX: + +PROJECTDIR=$$PWD/../../../ +ROOT=$(PROJECTDIR)/rootdir + +all: tests + +tests: + @PATH=$(ROOT)/bin:$$PATH ./chktest.sh + +clean: + rm -f test.log diff --git a/tests/as/execute/chktest.sh b/tests/as/execute/chktest.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +ulimit -c 0 +rm -f test.log + +for i in *.s +do + cpu="${i%.s}" + printf "Test: %s\n\n" $cpu >> test.log + ./test.sh $cpu && printf '[PASS]: ' || printf '[FAIL]: ' + printf 'testing cpu=%s\n' "$cpu" +done diff --git a/tests/as/execute/i286.s b/tests/as/execute/i286.s @@ -0,0 +1,150 @@ +/ Look in http://www.mlsite.net/8086/ +/ Look in http://www.srmuniv.ac.in/sites/default/files/2017/15CS205J-unitII.pdf +/ Look in http://www.c-jump.com/CIS77/reference/Instructions_by_Opcode.html +/ Look in http://www.c-jump.com/CIS77/CPU/x86/lecture.html#X77_0020_encoding_overview +/ Look in http://www.c-jump.com/CIS77/reference/Instructions_by_Opcode.html +/ Look in https://www.felixcloutier.com/x86/index.html + + ADDB AL,AL / 00 C0 + ADDB CL,AL / 00 C8 + ADDB DL,AL / 00 D0 + ADDB BL,AL / 00 D8 + ADDB AH,AL / 00 E0 + ADDB CH,AL / 00 E8 + ADDB DH,AL / 00 F0 + ADDB BH,AL / 00 F8 + + ADDW AX,AX / 01 C0 + ADDW CX,AX / 01 C8 + ADDW DX,AX / 01 D0 + ADDW BX,AX / 01 D8 + ADDW SP,AX / 01 E0 + ADDW BP,AX / 01 E8 + ADDW SI,AX / 01 F0 + ADDW DI,AX / 01 F8 + + ADDB AL,CL / 00 C1 + ADDB CL,CL / 00 C9 + ADDB DL,CL / 00 D1 + ADDB BL,CL / 00 D9 + ADDB AH,CL / 00 E1 + ADDB CH,CL / 00 E9 + ADDB DH,CL / 00 F1 + ADDB BH,CL / 00 F9 + + ADDW AX,CX / 01 C1 + ADDW CX,CX / 01 C9 + ADDW DX,CX / 01 D1 + ADDW BX,CX / 01 D9 + ADDW SP,CX / 01 E1 + ADDW BP,CX / 01 E9 + ADDW SI,CX / 01 F1 + ADDW DI,CX / 01 F9 + + ADDB AL,DL / 00 C2 + ADDB CL,DL / 00 CA + ADDB DL,DL / 00 D2 + ADDB BL,DL / 00 DA + ADDB AH,DL / 00 E2 + ADDB CH,DL / 00 EA + ADDB DH,DL / 00 F2 + ADDB BH,DL / 00 FA + + ADDW AX,DX / 01 C2 + ADDW CX,DX / 01 CA + ADDW DX,DX / 01 D2 + ADDW BX,DX / 01 DA + ADDW SP,DX / 01 E2 + ADDW BP,DX / 01 EA + ADDW SI,DX / 01 F2 + ADDW DI,DX / 01 FA + + ADDB AL,BL / 00 C3 + ADDB CL,BL / 00 CB + ADDB DL,BL / 00 D3 + ADDB BL,BL / 00 DB + ADDB AH,BL / 00 E3 + ADDB CH,BL / 00 EB + ADDB DH,BL / 00 F3 + ADDB BH,BL / 00 FB + + ADDW AX,BX / 01 C3 + ADDW CX,BX / 01 CB + ADDW DX,BX / 01 D3 + ADDW BX,BX / 01 DB + ADDW SP,BX / 01 E3 + ADDW BP,BX / 01 EB + ADDW SI,BX / 01 F3 + ADDW DI,BX / 01 FB + + ADDB AL,AH / 00 C4 + ADDB CL,AH / 00 CC + ADDB DL,AH / 00 D4 + ADDB BL,AH / 00 DC + ADDB AH,AH / 00 E4 + ADDB CH,AH / 00 EC + ADDB DH,AH / 00 F4 + ADDB BH,AH / 00 FC + + ADDW AX,SP / 01 C4 + ADDW CX,SP / 01 CC + ADDW DX,SP / 01 D4 + ADDW BX,SP / 01 DC + ADDW SP,SP / 01 E4 + ADDW BP,SP / 01 EC + ADDW SI,SP / 01 F4 + ADDW DI,SP / 01 FC + + ADDB AL,CH / 00 C5 + ADDB CL,CH / 00 CD + ADDB DL,CH / 00 D5 + ADDB BL,CH / 00 DD + ADDB AH,CH / 00 E5 + ADDB CH,CH / 00 ED + ADDB DH,CH / 00 F5 + ADDB BH,CH / 00 FD + + ADDW AX,BP / 01 C5 + ADDW CX,BP / 01 CD + ADDW DX,BP / 01 D5 + ADDW BX,BP / 01 DD + ADDW SP,BP / 01 E5 + ADDW BP,BP / 01 ED + ADDW SI,BP / 01 F5 + ADDW DI,BP / 01 FD + + ADDB AL,DH / 00 C6 + ADDB CL,DH / 00 CE + ADDB DL,DH / 00 D6 + ADDB BL,DH / 00 DE + ADDB AH,DH / 00 E6 + ADDB CH,DH / 00 EE + ADDB DH,DH / 00 F6 + ADDB BH,DH / 00 FE + + ADDW AX,SI / 01 C6 + ADDW CX,SI / 01 CE + ADDW DX,SI / 01 D6 + ADDW BX,SI / 01 DE + ADDW SP,SI / 01 E6 + ADDW BP,SI / 01 EE + ADDW SI,SI / 01 F6 + ADDW DI,SI / 01 FE + + ADDB AL,BH / 00 C7 + ADDB CL,BH / 00 CF + ADDB DL,BH / 00 D7 + ADDB BL,BH / 00 DF + ADDB AH,BH / 00 E7 + ADDB CH,BH / 00 EF + ADDB DH,BH / 00 F7 + ADDB BH,BH / 00 FF + + ADDW AX,DI / 01 C7 + ADDW CX,DI / 01 CF + ADDW DX,DI / 01 D7 + ADDW BX,DI / 01 DF + ADDW SP,DI / 01 E7 + ADDW BP,DI / 01 EF + ADDW SI,DI / 01 F7 + ADDW DI,DI / 01 FF diff --git a/tests/as/execute/test.sh b/tests/as/execute/test.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +set -e +cpu=${1?} +exec >>test.log +exec 2>&1 + +tmp1=`mktemp` +tmp2=`mktemp` +file=$cpu.s + +trap "rm -f a.out $tmp1 $tmp2; exit" 0 2 3 + +as-$cpu $file + +sed -n '/^\// ! { + s%.*/%% + s%^[ ]*%% + s%[ ]*$%% + /^$/d + s%[ ][ ]*%\ +%g + p +}' $file | +nl -b a > $tmp1 + + +objdump | +sed -n '/^data:/,$ { + /^data:/ ! { + s%.*:%% + s%^[ ]*%% + s%[ ]*$%% + /^$/d + s%[ ][ ]*%\ +%g + p + } +}' | +nl -b a > $tmp2 + +echo diff +diff -u $tmp1 $tmp2 diff --git a/tests/as/execute/z80.s b/tests/as/execute/z80.s @@ -0,0 +1,1588 @@ + NOP / 00 + LD BC,$64 / 01 40 00 + LD (BC),A / 02 + INC BC / 03 + INC B / 04 + DEC B / 05 + LD B,$32 / 06 20 + RLCA / 07 + EX AF,AF' / 08 + ADD HL,BC / 09 + LD A,(BC) / 0A + DEC BC / 0B + INC C / 0C + DEC C / 0D + LD C,$64 / 0E 40 + RRCA / 0F +L1: DJNZ $L1 / 10 02 + LD DE,$32 / 11 20 00 + LD (DE),A / 12 + INC DE / 13 + INC D / 14 + DEC D / 15 + LD D,$64 / 16 40 + RLA / 17 +L2: JR $L2 / 18 02 + ADD HL,DE / 19 + LD A,(DE) / 1A + DEC DE / 1B + INC E / 1C + DEC E / 1D + LD E,$64 / 1E 40 + RRA / 1F +L3: JR NZ,$L3 / 20 02 + LD HL,$32 / 21 20 00 + LD (32768),HL / 22 00 80 + INC HL / 23 + INC H / 24 + DEC H / 25 + LD H,$64 / 26 40 + DAA / 27 +L4: JR Z,$L4 / 28 02 + ADD HL,HL / 29 + LD HL,(16384) / 2A 00 40 + DEC HL / 2B + INC L / 2C + DEC L / 2D + LD L,$32 / 2E 20 + CPL / 2F +L5: JR NC,$L5 / 30 02 + LD SP,$64 / 31 40 00 + LD (32768),A / 32 00 80 + INC SP / 33 + INC (HL) / 34 + DEC (HL) / 35 + LD (HL),$32 / 36 20 + SCF / 37 +L6: JR C,$L6 / 38 02 + ADD HL,SP / 39 + LD A,(16384) / 3A 00 40 + DEC SP / 3B + INC A / 3C + DEC A / 3D + LD A,$32 / 3E 20 + CCF / 3F + LD B,B / 40 + LD B,C / 41 + LD B,D / 42 + LD B,E / 43 + LD B,H / 44 + LD B,L / 45 + LD B,(HL) / 46 + LD B,A / 47 + LD C,B / 48 + LD C,C / 49 + LD C,D / 4A + LD C,E / 4B + LD C,H / 4C + LD C,L / 4D + LD C,(HL) / 4E + LD C,A / 4F + LD D,B / 50 + LD D,C / 51 + LD D,D / 52 + LD D,E / 53 + LD D,H / 54 + LD D,L / 55 + LD D,(HL) / 56 + LD D,A / 57 + LD E,B / 58 + LD E,C / 59 + LD E,D / 5A + LD E,E / 5B + LD E,H / 5C + LD E,L / 5D + LD E,(HL) / 5E + LD E,A / 5F + LD H,B / 60 + LD H,C / 61 + LD H,D / 62 + LD H,E / 63 + LD H,H / 64 + LD H,L / 65 + LD H,(HL) / 66 + LD H,A / 67 + LD L,B / 68 + LD L,C / 69 + LD L,D / 6A + LD L,E / 6B + LD L,H / 6C + LD L,L / 6D + LD L,(HL) / 6E + LD L,A / 6F + LD (HL),B / 70 + LD (HL),C / 71 + LD (HL),D / 72 + LD (HL),E / 73 + LD (HL),H / 74 + LD (HL),L / 75 + HALT / 76 + LD (HL),A / 77 + LD A,B / 78 + LD A,C / 79 + LD A,D / 7A + LD A,E / 7B + LD A,H / 7C + LD A,L / 7D + LD A,(HL) / 7E + LD A,A / 7F + ADD A,B / 80 + ADD A,C / 81 + ADD A,D / 82 + ADD A,E / 83 + ADD A,H / 84 + ADD A,L / 85 + ADD A,(HL) / 86 + ADD A,A / 87 + ADC A,B / 88 + ADC A,C / 89 + ADC A,D / 8A + ADC A,E / 8B + ADC A,H / 8C + ADC A,L / 8D + ADC A,(HL) / 8E + ADC A,A / 8F + SUB A,B / 90 + SUB A,C / 91 + SUB A,D / 92 + SUB A,E / 93 + SUB A,H / 94 + SUB A,L / 95 + SUB A,(HL) / 96 + SUB A,A / 97 + SBC A,B / 98 + SBC A,C / 99 + SBC A,D / 9A + SBC A,E / 9B + SBC A,H / 9C + SBC A,L / 9D + SBC A,(HL) / 9E + SBC A,A / 9F + AND A,B / A0 + AND A,C / A1 + AND A,D / A2 + AND A,E / A3 + AND A,H / A4 + AND A,L / A5 + AND A,(HL) / A6 + AND A,A / A7 + XOR A,B / A8 + XOR A,C / A9 + XOR A,D / AA + XOR A,E / AB + XOR A,H / AC + XOR A,L / AD + XOR A,(HL) / AE + XOR A,A / AF + OR A,B / B0 + OR A,C / B1 + OR A,D / B2 + OR A,E / B3 + OR A,H / B4 + OR A,L / B5 + OR A,(HL) / B6 + OR A,A / B7 + CP A,B / B8 + CP A,C / B9 + CP A,D / BA + CP A,E / BB + CP A,H / BC + CP A,L / BD + CP A,(HL) / BE + CP A,A / BF + RET NZ / C0 + POP BC / C1 + JP NZ,$16384 / C2 00 40 + JP $32768 / C3 00 80 + CALL NZ,$32768 / C4 00 80 + PUSH BC / C5 + ADD A,$32 / C6 20 + RST $0 / C7 + RET Z / C8 + RET / C9 + JP Z,$32768 / CA 00 80 + RLC B / CB 00 + RLC C / CB 01 + RLC D / CB 02 + RLC E / CB 03 + RLC H / CB 04 + RLC L / CB 05 + RLC (HL) / CB 06 + RLC A / CB 07 + RRC B / CB 08 + RRC C / CB 09 + RRC D / CB 0A + RRC E / CB 0B + RRC H / CB 0C + RRC L / CB 0D + RRC (HL) / CB 0E + RRC A / CB 0F + RL B / CB 10 + RL C / CB 11 + RL D / CB 12 + RL E / CB 13 + RL H / CB 14 + RL L / CB 15 + RL (HL) / CB 16 + RL A / CB 17 + RR B / CB 18 + RR C / CB 19 + RR D / CB 1A + RR E / CB 1B + RR H / CB 1C + RR L / CB 1D + RR (HL) / CB 1E + RR A / CB 1F + SLA B / CB 20 + SLA C / CB 21 + SLA D / CB 22 + SLA E / CB 23 + SLA H / CB 24 + SLA L / CB 25 + SLA (HL) / CB 26 + SLA A / CB 27 + SRA B / CB 28 + SRA C / CB 29 + SRA D / CB 2A + SRA E / CB 2B + SRA H / CB 2C + SRA L / CB 2D + SRA (HL) / CB 2E + SRA A / CB 2F + SLL B / CB 30 + SLL C / CB 31 + SLL D / CB 32 + SLL E / CB 33 + SLL H / CB 34 + SLL L / CB 35 + SLL (HL) / CB 36 + SLL A / CB 37 + SRL B / CB 38 + SRL C / CB 39 + SRL D / CB 3A + SRL E / CB 3B + SRL H / CB 3C + SRL L / CB 3D + SRL (HL) / CB 3E + SRL A / CB 3F + BIT $0,B / CB 40 + BIT $0,C / CB 41 + BIT $0,D / CB 42 + BIT $0,E / CB 43 + BIT $0,H / CB 44 + BIT $0,L / CB 45 + BIT $0,(HL) / CB 46 + BIT $0,A / CB 47 + BIT $1,B / CB 48 + BIT $1,C / CB 49 + BIT $1,D / CB 4A + BIT $1,E / CB 4B + BIT $1,H / CB 4C + BIT $1,L / CB 4D + BIT $1,(HL) / CB 4E + BIT $1,A / CB 4F + BIT $2,B / CB 50 + BIT $2,C / CB 51 + BIT $2,D / CB 52 + BIT $2,E / CB 53 + BIT $2,H / CB 54 + BIT $2,L / CB 55 + BIT $2,(HL) / CB 56 + BIT $2,A / CB 57 + BIT $3,B / CB 58 + BIT $3,C / CB 59 + BIT $3,D / CB 5A + BIT $3,E / CB 5B + BIT $3,H / CB 5C + BIT $3,L / CB 5D + BIT $3,(HL) / CB 5E + BIT $3,A / CB 5F + BIT $4,B / CB 60 + BIT $4,C / CB 61 + BIT $4,D / CB 62 + BIT $4,E / CB 63 + BIT $4,H / CB 64 + BIT $4,L / CB 65 + BIT $4,(HL) / CB 66 + BIT $4,A / CB 67 + BIT $5,B / CB 68 + BIT $5,C / CB 69 + BIT $5,D / CB 6A + BIT $5,E / CB 6B + BIT $5,H / CB 6C + BIT $5,L / CB 6D + BIT $5,(HL) / CB 6E + BIT $5,A / CB 6F + BIT $6,B / CB 70 + BIT $6,C / CB 71 + BIT $6,D / CB 72 + BIT $6,E / CB 73 + BIT $6,H / CB 74 + BIT $6,L / CB 75 + BIT $6,(HL) / CB 76 + BIT $6,A / CB 77 + BIT $7,B / CB 78 + BIT $7,C / CB 79 + BIT $7,D / CB 7A + BIT $7,E / CB 7B + BIT $7,H / CB 7C + BIT $7,L / CB 7D + BIT $7,(HL) / CB 7E + BIT $7,A / CB 7F + RES $0,B / CB 80 + RES $0,C / CB 81 + RES $0,D / CB 82 + RES $0,E / CB 83 + RES $0,H / CB 84 + RES $0,L / CB 85 + RES $0,(HL) / CB 86 + RES $0,A / CB 87 + RES $1,B / CB 88 + RES $1,C / CB 89 + RES $1,D / CB 8A + RES $1,E / CB 8B + RES $1,H / CB 8C + RES $1,L / CB 8D + RES $1,(HL) / CB 8E + RES $1,A / CB 8F + RES $2,B / CB 90 + RES $2,C / CB 91 + RES $2,D / CB 92 + RES $2,E / CB 93 + RES $2,H / CB 94 + RES $2,L / CB 95 + RES $2,(HL) / CB 96 + RES $2,A / CB 97 + RES $3,B / CB 98 + RES $3,C / CB 99 + RES $3,D / CB 9A + RES $3,E / CB 9B + RES $3,H / CB 9C + RES $3,L / CB 9D + RES $3,(HL) / CB 9E + RES $3,A / CB 9F + RES $4,B / CB A0 + RES $4,C / CB A1 + RES $4,D / CB A2 + RES $4,E / CB A3 + RES $4,H / CB A4 + RES $4,L / CB A5 + RES $4,(HL) / CB A6 + RES $4,A / CB A7 + RES $5,B / CB A8 + RES $5,C / CB A9 + RES $5,D / CB AA + RES $5,E / CB AB + RES $5,H / CB AC + RES $5,L / CB AD + RES $5,(HL) / CB AE + RES $5,A / CB AF + RES $6,B / CB B0 + RES $6,C / CB B1 + RES $6,D / CB B2 + RES $6,E / CB B3 + RES $6,H / CB B4 + RES $6,L / CB B5 + RES $6,(HL) / CB B6 + RES $6,A / CB B7 + RES $7,B / CB B8 + RES $7,C / CB B9 + RES $7,D / CB BA + RES $7,E / CB BB + RES $7,H / CB BC + RES $7,L / CB BD + RES $7,(HL) / CB BE + RES $7,A / CB BF + SET $0,B / CB C0 + SET $0,C / CB C1 + SET $0,D / CB C2 + SET $0,E / CB C3 + SET $0,H / CB C4 + SET $0,L / CB C5 + SET $0,(HL) / CB C6 + SET $0,A / CB C7 + SET $1,B / CB C8 + SET $1,C / CB C9 + SET $1,D / CB CA + SET $1,E / CB CB + SET $1,H / CB CC + SET $1,L / CB CD + SET $1,(HL) / CB CE + SET $1,A / CB CF + SET $2,B / CB D0 + SET $2,C / CB D1 + SET $2,D / CB D2 + SET $2,E / CB D3 + SET $2,H / CB D4 + SET $2,L / CB D5 + SET $2,(HL) / CB D6 + SET $2,A / CB D7 + SET $3,B / CB D8 + SET $3,C / CB D9 + SET $3,D / CB DA + SET $3,E / CB DB + SET $3,H / CB DC + SET $3,L / CB DD + SET $3,(HL) / CB DE + SET $3,A / CB DF + SET $4,B / CB E0 + SET $4,C / CB E1 + SET $4,D / CB E2 + SET $4,E / CB E3 + SET $4,H / CB E4 + SET $4,L / CB E5 + SET $4,(HL) / CB E6 + SET $4,A / CB E7 + SET $5,B / CB E8 + SET $5,C / CB E9 + SET $5,D / CB EA + SET $5,E / CB EB + SET $5,H / CB EC + SET $5,L / CB ED + SET $5,(HL) / CB EE + SET $5,A / CB EF + SET $6,B / CB F0 + SET $6,C / CB F1 + SET $6,D / CB F2 + SET $6,E / CB F3 + SET $6,H / CB F4 + SET $6,L / CB F5 + SET $6,(HL) / CB F6 + SET $6,A / CB F7 + SET $7,B / CB F8 + SET $7,C / CB F9 + SET $7,D / CB FA + SET $7,E / CB FB + SET $7,H / CB FC + SET $7,L / CB FD + SET $7,(HL) / CB FE + SET $7,A / CB FF + CALL Z,$16384 / CC 00 40 + CALL $16384 / CD 00 40 + ADC A,$64 / CE 40 + RST $8 / CF + RET NC / D0 + POP DE / D1 + JP NC,$16384 / D2 00 40 + OUT (153),A / D3 99 + CALL NC,$32768 / D4 00 80 + PUSH DE / D5 + SUB A,$32 / D6 20 + RST $16 / D7 + RET C / D8 + EXX / D9 + JP C,$16384 / DA 00 40 + IN A,(153) / DB 99 + CALL C,$32768 / DC 00 80 + ADD IX,BC / DD 09 + ADD IX,DE / DD 19 + LD IX,$64 / DD 21 40 00 + LD (32768),IX / DD 22 00 80 + INC IX / DD 23 + INC IXH / DD 24 + DEC IXH / DD 25 + LD IXH,$32 / DD 26 20 + ADD IX,IX / DD 29 + LD IX,(16384) / DD 2A 00 40 + DEC IX / DD 2B + INC IXL / DD 2C + DEC IXL / DD 2D + LD IXL,$64 / DD 2E 40 + INC (IX + 32) / DD 34 20 + DEC (IX + 16) / DD 35 10 + LD (IX + 64),$128 / DD 36 40 80 + ADD IX,SP / DD 39 + LD B,IXH / DD 44 + LD B,IXL / DD 45 + LD B,(IX + 32) / DD 46 20 + LD C,IXH / DD 4C + LD C,IXL / DD 4D + LD C,(IX + 48) / DD 4E 30 + LD D,IXH / DD 54 + LD D,IXL / DD 55 + LD D,(IX + 32) / DD 56 20 + LD E,IXH / DD 5C + LD E,IXL / DD 5D + LD E,(IX + 64) / DD 5E 40 + LD IXH,B / DD 60 + LD IXH,C / DD 61 + LD IXH,D / DD 62 + LD IXH,E / DD 63 + LD IXH,IXH / DD 64 + LD IXH,IXL / DD 65 + LD H,(IX + 16) / DD 66 10 + LD IXH,A / DD 67 + LD IXL,B / DD 68 + LD IXL,C / DD 69 + LD IXL,D / DD 6A + LD IXL,E / DD 6B + LD IXL,IXH / DD 6C + LD IXL,IXL / DD 6D + LD L,(IX + 48) / DD 6E 30 + LD IXL,A / DD 6F + LD (IX + 64),B / DD 70 40 + LD (IX + 16),C / DD 71 10 + LD (IX + 32),D / DD 72 20 + LD (IX + 48),E / DD 73 30 + LD (IX + 16),H / DD 74 10 + LD (IX + 32),L / DD 75 20 + LD (IX + 48),A / DD 77 30 + LD A,IXH / DD 7C + LD A,IXL / DD 7D + LD A,(IX + 16) / DD 7E 10 + ADD A,IXH / DD 84 + ADD A,IXL / DD 85 + ADD A,(IX + 32) / DD 86 20 + ADC A,IXH / DD 8C + ADC A,IXL / DD 8D + ADC A,(IX + 48) / DD 8E 30 + SUB A,IXH / DD 94 + SUB A,IXL / DD 95 + SUB A,(IX + 16) / DD 96 10 + SBC A,IXH / DD 9C + SBC A,IXL / DD 9D + SBC A,(IX + 32) / DD 9E 20 + AND A,IXH / DD A4 + AND A,IXL / DD A5 + AND A,(IX + 48) / DD A6 30 + XOR A,IXH / DD AC + XOR A,IXL / DD AD + XOR A,(IX + 16) / DD AE 10 + OR A,IXH / DD B4 + OR A,IXL / DD B5 + OR A,(IX + 32) / DD B6 20 + CP A,IXH / DD BC + CP A,IXL / DD BD + CP A,(IX + 48) / DD BE 30 + RLC (IX + 16),B / DD CB 10 00 + RLC (IX + 32),C / DD CB 20 01 + RLC (IX + 48),D / DD CB 30 02 + RLC (IX + 64),E / DD CB 40 03 + RLC (IX + 16),H / DD CB 10 04 + RLC (IX + 32),L / DD CB 20 05 + RLC (IX + 64) / DD CB 40 06 + RLC (IX + 16),A / DD CB 10 07 + RRC (IX + 32),B / DD CB 20 08 + RRC (IX + 48),C / DD CB 30 09 + RRC (IX + 64),D / DD CB 40 0A + RRC (IX + 16),E / DD CB 10 0B + RRC (IX + 32),H / DD CB 20 0C + RRC (IX + 48),L / DD CB 30 0D + RRC (IX + 16) / DD CB 10 0E + RRC (IX + 16),A / DD CB 10 0F + RL (IX + 32),B / DD CB 20 10 + RL (IX + 48),C / DD CB 30 11 + RL (IX + 64),D / DD CB 40 12 + RL (IX + 16),E / DD CB 10 13 + RL (IX + 32),H / DD CB 20 14 + RL (IX + 48),L / DD CB 30 15 + RL (IX + 32) / DD CB 20 16 + RL (IX + 16),A / DD CB 10 17 + RR (IX + 32),B / DD CB 20 18 + RR (IX + 48),C / DD CB 30 19 + RR (IX + 64),D / DD CB 40 1A + RR (IX + 16),E / DD CB 10 1B + RR (IX + 32),H / DD CB 20 1C + RR (IX + 48),L / DD CB 30 1D + RR (IX + 48) / DD CB 30 1E + RR (IX + 16),A / DD CB 10 1F + SLA (IX + 32),B / DD CB 20 20 + SLA (IX + 48),C / DD CB 30 21 + SLA (IX + 64),D / DD CB 40 22 + SLA (IX + 16),E / DD CB 10 23 + SLA (IX + 32),H / DD CB 20 24 + SLA (IX + 48),L / DD CB 30 25 + SLA (IX + 64) / DD CB 40 26 + SLA (IX + 16),A / DD CB 10 27 + SRA (IX + 32),B / DD CB 20 28 + SRA (IX + 48),C / DD CB 30 29 + SRA (IX + 64),D / DD CB 40 2A + SRA (IX + 16),E / DD CB 10 2B + SRA (IX + 32),H / DD CB 20 2C + SRA (IX + 48),L / DD CB 30 2D + SRA (IX + 16) / DD CB 10 2E + SRA (IX + 16),A / DD CB 10 2F + SLL (IX + 32),B / DD CB 20 30 + SLL (IX + 48),C / DD CB 30 31 + SLL (IX + 64),D / DD CB 40 32 + SLL (IX + 16),E / DD CB 10 33 + SLL (IX + 32),H / DD CB 20 34 + SLL (IX + 48),L / DD CB 30 35 + SLL (IX + 32) / DD CB 20 36 + SLL (IX + 16),A / DD CB 10 37 + SRL (IX + 32),B / DD CB 20 38 + SRL (IX + 48),C / DD CB 30 39 + SRL (IX + 64),D / DD CB 40 3A + SRL (IX + 16),E / DD CB 10 3B + SRL (IX + 32),H / DD CB 20 3C + SRL (IX + 48),L / DD CB 30 3D + SRL (IX + 48) / DD CB 30 3E + SRL (IX + 64),A / DD CB 40 3F + BIT $0,(IX + 16) / DD CB 10 46 + BIT $1,(IX + 32) / DD CB 20 4E + BIT $2,(IX + 48) / DD CB 30 56 + BIT $3,(IX + 64) / DD CB 40 5E + BIT $4,(IX + 16) / DD CB 10 66 + BIT $5,(IX + 32) / DD CB 20 6E + BIT $6,(IX + 48) / DD CB 30 76 + BIT $7,(IX + 64) / DD CB 40 7E + RES $0,(IX + 16),B / DD CB 10 80 + RES $0,(IX + 32),C / DD CB 20 81 + RES $0,(IX + 48),D / DD CB 30 82 + RES $0,(IX + 64),E / DD CB 40 83 + RES $0,(IX + 16),H / DD CB 10 84 + RES $0,(IX + 32),L / DD CB 20 85 + RES $0,(IX + 48) / DD CB 30 86 + RES $0,(IX + 64),A / DD CB 40 87 + RES $1,(IX + 16),B / DD CB 10 88 + RES $1,(IX + 32),C / DD CB 20 89 + RES $1,(IX + 48),D / DD CB 30 8A + RES $1,(IX + 64),E / DD CB 40 8B + RES $1,(IX + 16),H / DD CB 10 8C + RES $1,(IX + 32),L / DD CB 20 8D + RES $1,(IX + 48) / DD CB 30 8E + RES $1,(IX + 64),A / DD CB 40 8F + RES $2,(IX + 16),B / DD CB 10 90 + RES $2,(IX + 32),C / DD CB 20 91 + RES $2,(IX + 48),D / DD CB 30 92 + RES $2,(IX + 64),E / DD CB 40 93 + RES $2,(IX + 16),H / DD CB 10 94 + RES $2,(IX + 32),L / DD CB 20 95 + RES $2,(IX + 48) / DD CB 30 96 + RES $2,(IX + 64),A / DD CB 40 97 + RES $3,(IX + 16),B / DD CB 10 98 + RES $3,(IX + 32),C / DD CB 20 99 + RES $3,(IX + 48),D / DD CB 30 9A + RES $3,(IX + 64),E / DD CB 40 9B + RES $3,(IX + 16),H / DD CB 10 9C + RES $3,(IX + 32),L / DD CB 20 9D + RES $3,(IX + 48) / DD CB 30 9E + RES $3,(IX + 64),A / DD CB 40 9F + RES $4,(IX + 16),B / DD CB 10 A0 + RES $4,(IX + 32),C / DD CB 20 A1 + RES $4,(IX + 48),D / DD CB 30 A2 + RES $4,(IX + 64),E / DD CB 40 A3 + RES $4,(IX + 16),H / DD CB 10 A4 + RES $4,(IX + 32),L / DD CB 20 A5 + RES $4,(IX + 48) / DD CB 30 A6 + RES $4,(IX + 64),A / DD CB 40 A7 + RES $5,(IX + 16),B / DD CB 10 A8 + RES $5,(IX + 32),C / DD CB 20 A9 + RES $5,(IX + 48),D / DD CB 30 AA + RES $5,(IX + 64),E / DD CB 40 AB + RES $5,(IX + 16),H / DD CB 10 AC + RES $5,(IX + 32),L / DD CB 20 AD + RES $5,(IX + 48) / DD CB 30 AE + RES $5,(IX + 64),A / DD CB 40 AF + RES $6,(IX + 16),B / DD CB 10 B0 + RES $6,(IX + 32),C / DD CB 20 B1 + RES $6,(IX + 48),D / DD CB 30 B2 + RES $6,(IX + 64),E / DD CB 40 B3 + RES $6,(IX + 16),H / DD CB 10 B4 + RES $6,(IX + 32),L / DD CB 20 B5 + RES $6,(IX + 48) / DD CB 30 B6 + RES $6,(IX + 64),A / DD CB 40 B7 + RES $7,(IX + 16),B / DD CB 10 B8 + RES $7,(IX + 32),C / DD CB 20 B9 + RES $7,(IX + 48),D / DD CB 30 BA + RES $7,(IX + 64),E / DD CB 40 BB + RES $7,(IX + 16),H / DD CB 10 BC + RES $7,(IX + 32),L / DD CB 20 BD + RES $7,(IX + 48) / DD CB 30 BE + RES $7,(IX + 64),A / DD CB 40 BF + SET $0,(IX + 16),B / DD CB 10 C0 + SET $0,(IX + 32),C / DD CB 20 C1 + SET $0,(IX + 48),D / DD CB 30 C2 + SET $0,(IX + 64),E / DD CB 40 C3 + SET $0,(IX + 16),H / DD CB 10 C4 + SET $0,(IX + 32),L / DD CB 20 C5 + SET $0,(IX + 48) / DD CB 30 C6 + SET $0,(IX + 64),A / DD CB 40 C7 + SET $1,(IX + 16),B / DD CB 10 C8 + SET $1,(IX + 32),C / DD CB 20 C9 + SET $1,(IX + 48),D / DD CB 30 CA + SET $1,(IX + 64),E / DD CB 40 CB + SET $1,(IX + 16),H / DD CB 10 CC + SET $1,(IX + 32),L / DD CB 20 CD + SET $1,(IX + 48) / DD CB 30 CE + SET $1,(IX + 64),A / DD CB 40 CF + SET $2,(IX + 16),B / DD CB 10 D0 + SET $2,(IX + 32),C / DD CB 20 D1 + SET $2,(IX + 48),D / DD CB 30 D2 + SET $2,(IX + 64),E / DD CB 40 D3 + SET $2,(IX + 16),H / DD CB 10 D4 + SET $2,(IX + 32),L / DD CB 20 D5 + SET $2,(IX + 48) / DD CB 30 D6 + SET $2,(IX + 64),A / DD CB 40 D7 + SET $3,(IX + 16),B / DD CB 10 D8 + SET $3,(IX + 32),C / DD CB 20 D9 + SET $3,(IX + 48),D / DD CB 30 DA + SET $3,(IX + 64),E / DD CB 40 DB + SET $3,(IX + 16),H / DD CB 10 DC + SET $3,(IX + 32),L / DD CB 20 DD + SET $3,(IX + 48) / DD CB 30 DE + SET $3,(IX + 64),A / DD CB 40 DF + SET $4,(IX + 16),B / DD CB 10 E0 + SET $4,(IX + 32),C / DD CB 20 E1 + SET $4,(IX + 48),D / DD CB 30 E2 + SET $4,(IX + 64),E / DD CB 40 E3 + SET $4,(IX + 16),H / DD CB 10 E4 + SET $4,(IX + 32),L / DD CB 20 E5 + SET $4,(IX + 48) / DD CB 30 E6 + SET $4,(IX + 64),A / DD CB 40 E7 + SET $5,(IX + 16),B / DD CB 10 E8 + SET $5,(IX + 32),C / DD CB 20 E9 + SET $5,(IX + 48),D / DD CB 30 EA + SET $5,(IX + 64),E / DD CB 40 EB + SET $5,(IX + 16),H / DD CB 10 EC + SET $5,(IX + 32),L / DD CB 20 ED + SET $5,(IX + 48) / DD CB 30 EE + SET $5,(IX + 64),A / DD CB 40 EF + SET $6,(IX + 16),B / DD CB 10 F0 + SET $6,(IX + 32),C / DD CB 20 F1 + SET $6,(IX + 48),D / DD CB 30 F2 + SET $6,(IX + 64),E / DD CB 40 F3 + SET $6,(IX + 16),H / DD CB 10 F4 + SET $6,(IX + 32),L / DD CB 20 F5 + SET $6,(IX + 48) / DD CB 30 F6 + SET $6,(IX + 64),A / DD CB 40 F7 + SET $7,(IX + 16),B / DD CB 10 F8 + SET $7,(IX + 32),C / DD CB 20 F9 + SET $7,(IX + 48),D / DD CB 30 FA + SET $7,(IX + 64),E / DD CB 40 FB + SET $7,(IX + 16),H / DD CB 10 FC + SET $7,(IX + 32),L / DD CB 20 FD + SET $7,(IX + 48) / DD CB 30 FE + SET $7,(IX + 64),A / DD CB 40 FF + POP IX / DD E1 + EX (SP),IX / DD E3 + PUSH IX / DD E5 + JP IX / DD E9 + LD SP,IX / DD F9 + SBC A,$64 / DE 40 + RST $24 / DF + RET PO / E0 + POP HL / E1 + JP PO,$32768 / E2 00 80 + EX (SP),HL / E3 + CALL PO,$16384 / E4 00 40 + PUSH HL / E5 + AND A,$16 / E6 10 + RST $32 / E7 + RET PE / E8 + JP HL / E9 + JP PE,$16384 / EA 00 40 + EX DE,HL / EB + CALL PE,$16384 / EC 00 40 + IN B,(C) / ED 40 + OUT (C),B / ED 41 + SBC HL,BC / ED 42 + LD (32768),BC / ED 43 00 80 + NEG / ED 44 + RETN / ED 45 + IM $0 / ED 46 + LD I,A / ED 47 + IN C,(C) / ED 48 + OUT (C),C / ED 49 + ADC HL,BC / ED 4A + LD BC,(16384) / ED 4B 00 40 + RETI / ED 4D + LD R,A / ED 4F + IN D,(C) / ED 50 + OUT (C),D / ED 51 + SBC HL,DE / ED 52 + LD (32768),DE / ED 53 00 80 + IM $1 / ED 56 + LD A,I / ED 57 + IN E,(C) / ED 58 + OUT (C),E / ED 59 + ADC HL,DE / ED 5A + LD DE,(16384) / ED 5B 00 40 + IM $2 / ED 5E + LD A,R / ED 5F + IN H,(C) / ED 60 + OUT (C),H / ED 61 + SBC HL,HL / ED 62 + RRD / ED 67 + IN L,(C) / ED 68 + OUT (C),L / ED 69 + ADC HL,HL / ED 6A + RLD / ED 6F + IN F,(C) / ED 70 + OUT (C),$0 / ED 71 + SBC HL,SP / ED 72 + LD (16384),SP / ED 73 00 40 + IN A,(C) / ED 78 + OUT (C),A / ED 79 + ADC HL,SP / ED 7A + LD SP,(32768) / ED 7B 00 80 + LDI / ED A0 + CPI / ED A1 + INI / ED A2 + OUTI / ED A3 + LDD / ED A8 + CPD / ED A9 + IND / ED AA + OUTD / ED AB + LDIR / ED B0 + CPIR / ED B1 + INIR / ED B2 + OTIR / ED B3 + LDDR / ED B8 + CPDR / ED B9 + INDR / ED BA + OTDR / ED BB + XOR A,$32 / EE 20 + RST $40 / EF + RET P / F0 + POP AF / F1 + JP P,$32768 / F2 00 80 + DI / F3 + CALL P,$16384 / F4 00 40 + PUSH AF / F5 + OR A,$32 / F6 20 + RST $48 / F7 + RET M / F8 + LD SP,HL / F9 + JP M,$32768 / FA 00 80 + EI / FB + CALL M,$16384 / FC 00 40 + ADD IY,BC / FD 09 + ADD IY,DE / FD 19 + LD IY,$32768 / FD 21 00 80 + LD (16384),IY / FD 22 00 40 + INC IY / FD 23 + INC IYH / FD 24 + DEC IYH / FD 25 + LD IYH,$32 / FD 26 20 + ADD IY,IY / FD 29 + LD IY,(32768) / FD 2A 00 80 + DEC IY / FD 2B + INC IYL / FD 2C + DEC IYL / FD 2D + LD IYL,$16 / FD 2E 10 + INC (IY + 32) / FD 34 20 + DEC (IY + 48) / FD 35 30 + LD (IY + 64),$16 / FD 36 40 10 + ADD IY,SP / FD 39 + LD B,IYH / FD 44 + LD B,IYL / FD 45 + LD B,(IY + 32) / FD 46 20 + LD C,IYH / FD 4C + LD C,IYL / FD 4D + LD C,(IY + 48) / FD 4E 30 + LD D,IYH / FD 54 + LD D,IYL / FD 55 + LD D,(IY + 64) / FD 56 40 + LD E,IYH / FD 5C + LD E,IYL / FD 5D + LD E,(IY + 16) / FD 5E 10 + LD IYH,B / FD 60 + LD IYH,C / FD 61 + LD IYH,D / FD 62 + LD IYH,E / FD 63 + LD IYH,IYH / FD 64 + LD IYH,IYL / FD 65 + LD H,(IY + 32) / FD 66 20 + LD IYH,A / FD 67 + LD IYL,B / FD 68 + LD IYL,C / FD 69 + LD IYL,D / FD 6A + LD IYL,E / FD 6B + LD IYL,IYH / FD 6C + LD IYL,IYL / FD 6D + LD L,(IY + 48) / FD 6E 30 + LD IYL,A / FD 6F + LD (IY + 64),B / FD 70 40 + LD (IY + 16),C / FD 71 10 + LD (IY + 32),D / FD 72 20 + LD (IY + 48),E / FD 73 30 + LD (IY + 64),H / FD 74 40 + LD (IY + 16),L / FD 75 10 + LD (IY + 32),A / FD 77 20 + LD A,IYH / FD 7C + LD A,IYL / FD 7D + LD A,(IY + 48) / FD 7E 30 + ADD A,IYH / FD 84 + ADD A,IYL / FD 85 + ADD A,(IY + 64) / FD 86 40 + ADC A,IYH / FD 8C + ADC A,IYL / FD 8D + ADC A,(IY + 16) / FD 8E 10 + SUB A,IYH / FD 94 + SUB A,IYL / FD 95 + SUB A,(IY + 32) / FD 96 20 + SBC A,IYH / FD 9C + SBC A,IYL / FD 9D + SBC A,(IY + 48) / FD 9E 30 + AND A,IYH / FD A4 + AND A,IYL / FD A5 + AND A,(IY + 64) / FD A6 40 + XOR A,IYH / FD AC + XOR A,IYL / FD AD + XOR A,(IY + 16) / FD AE 10 + OR A,IYH / FD B4 + OR A,IYL / FD B5 + OR A,(IY + 32) / FD B6 20 + CP A,IYH / FD BC + CP A,IYL / FD BD + CP A,(IY + 48) / FD BE 30 + RLC (IY + 16),B / FD CB 10 00 + RLC (IY + 32),C / FD CB 20 01 + RLC (IY + 48),D / FD CB 30 02 + RLC (IY + 64),E / FD CB 40 03 + RLC (IY + 16),H / FD CB 10 04 + RLC (IY + 32),L / FD CB 20 05 + RLC (IY + 16) / FD CB 10 06 + RLC (IY + 32),A / FD CB 20 07 + RRC (IY + 48),B / FD CB 30 08 + RRC (IY + 64),C / FD CB 40 09 + RRC (IY + 16),D / FD CB 10 0A + RRC (IY + 32),E / FD CB 20 0B + RRC (IY + 48),H / FD CB 30 0C + RRC (IY + 64),L / FD CB 40 0D + RRC (IY + 32) / FD CB 20 0E + RRC (IY + 16),A / FD CB 10 0F + RL (IY + 32),B / FD CB 20 10 + RL (IY + 48),C / FD CB 30 11 + RL (IY + 64),D / FD CB 40 12 + RL (IY + 16),E / FD CB 10 13 + RL (IY + 32),H / FD CB 20 14 + RL (IY + 48),L / FD CB 30 15 + RL (IY + 48) / FD CB 30 16 + RL (IY + 16),A / FD CB 10 17 + RR (IY + 32),B / FD CB 20 18 + RR (IY + 48),C / FD CB 30 19 + RR (IY + 64),D / FD CB 40 1A + RR (IY + 16),E / FD CB 10 1B + RR (IY + 32),H / FD CB 20 1C + RR (IY + 48),L / FD CB 30 1D + RR (IY + 64) / FD CB 40 1E + RR (IY + 16),A / FD CB 10 1F + SLA (IY + 32),B / FD CB 20 20 + SLA (IY + 48),C / FD CB 30 21 + SLA (IY + 64),D / FD CB 40 22 + SLA (IY + 16),E / FD CB 10 23 + SLA (IY + 32),H / FD CB 20 24 + SLA (IY + 48),L / FD CB 30 25 + SLA (IY + 16) / FD CB 10 26 + SLA (IY + 16),A / FD CB 10 27 + SRA (IY + 32),B / FD CB 20 28 + SRA (IY + 48),C / FD CB 30 29 + SRA (IY + 64),D / FD CB 40 2A + SRA (IY + 16),E / FD CB 10 2B + SRA (IY + 32),H / FD CB 20 2C + SRA (IY + 48),L / FD CB 30 2D + SRA (IY + 32) / FD CB 20 2E + SRA (IY + 48),A / FD CB 30 2F + SLL (IY + 16),B / FD CB 10 30 + SLL (IY + 32),C / FD CB 20 31 + SLL (IY + 48),D / FD CB 30 32 + SLL (IY + 64),E / FD CB 40 33 + SLL (IY + 16),H / FD CB 10 34 + SLL (IY + 32),L / FD CB 20 35 + SLL (IY + 48) / FD CB 30 36 + SLL (IY + 16),A / FD CB 10 37 + SRL (IY + 32),B / FD CB 20 38 + SRL (IY + 48),C / FD CB 30 39 + SRL (IY + 64),D / FD CB 40 3A + SRL (IY + 16),E / FD CB 10 3B + SRL (IY + 32),H / FD CB 20 3C + SRL (IY + 48),L / FD CB 30 3D + SRL (IY + 64) / FD CB 40 3E + SRL (IY + 16),A / FD CB 10 3F + BIT $0,(IY + 16) / FD CB 10 46 + BIT $1,(IY + 32) / FD CB 20 4E + BIT $2,(IY + 48) / FD CB 30 56 + BIT $3,(IY + 64) / FD CB 40 5E + BIT $4,(IY + 16) / FD CB 10 66 + BIT $5,(IY + 32) / FD CB 20 6E + BIT $6,(IY + 48) / FD CB 30 76 + BIT $7,(IY + 64) / FD CB 40 7E + RES $0,(IY + 16),B / FD CB 10 80 + RES $0,(IY + 32),C / FD CB 20 81 + RES $0,(IY + 48),D / FD CB 30 82 + RES $0,(IY + 64),E / FD CB 40 83 + RES $0,(IY + 16),H / FD CB 10 84 + RES $0,(IY + 32),L / FD CB 20 85 + RES $0,(IY + 48) / FD CB 30 86 + RES $0,(IY + 64),A / FD CB 40 87 + RES $1,(IY + 16),B / FD CB 10 88 + RES $1,(IY + 32),C / FD CB 20 89 + RES $1,(IY + 48),D / FD CB 30 8A + RES $1,(IY + 64),E / FD CB 40 8B + RES $1,(IY + 16),H / FD CB 10 8C + RES $1,(IY + 32),L / FD CB 20 8D + RES $1,(IY + 48) / FD CB 30 8E + RES $1,(IY + 64),A / FD CB 40 8F + RES $2,(IY + 16),B / FD CB 10 90 + RES $2,(IY + 32),C / FD CB 20 91 + RES $2,(IY + 48),D / FD CB 30 92 + RES $2,(IY + 64),E / FD CB 40 93 + RES $2,(IY + 16),H / FD CB 10 94 + RES $2,(IY + 32),L / FD CB 20 95 + RES $2,(IY + 48) / FD CB 30 96 + RES $2,(IY + 64),A / FD CB 40 97 + RES $3,(IY + 16),B / FD CB 10 98 + RES $3,(IY + 32),C / FD CB 20 99 + RES $3,(IY + 48),D / FD CB 30 9A + RES $3,(IY + 64),E / FD CB 40 9B + RES $3,(IY + 16),H / FD CB 10 9C + RES $3,(IY + 32),L / FD CB 20 9D + RES $3,(IY + 48) / FD CB 30 9E + RES $3,(IY + 64),A / FD CB 40 9F + RES $4,(IY + 16),B / FD CB 10 A0 + RES $4,(IY + 32),C / FD CB 20 A1 + RES $4,(IY + 48),D / FD CB 30 A2 + RES $4,(IY + 64),E / FD CB 40 A3 + RES $4,(IY + 16),H / FD CB 10 A4 + RES $4,(IY + 32),L / FD CB 20 A5 + RES $4,(IY + 48) / FD CB 30 A6 + RES $4,(IY + 64),A / FD CB 40 A7 + RES $5,(IY + 16),B / FD CB 10 A8 + RES $5,(IY + 32),C / FD CB 20 A9 + RES $5,(IY + 48),D / FD CB 30 AA + RES $5,(IY + 64),E / FD CB 40 AB + RES $5,(IY + 16),H / FD CB 10 AC + RES $5,(IY + 32),L / FD CB 20 AD + RES $5,(IY + 48) / FD CB 30 AE + RES $5,(IY + 64),A / FD CB 40 AF + RES $6,(IY + 16),B / FD CB 10 B0 + RES $6,(IY + 32),C / FD CB 20 B1 + RES $6,(IY + 48),D / FD CB 30 B2 + RES $6,(IY + 64),E / FD CB 40 B3 + RES $6,(IY + 16),H / FD CB 10 B4 + RES $6,(IY + 32),L / FD CB 20 B5 + RES $6,(IY + 48) / FD CB 30 B6 + RES $6,(IY + 64),A / FD CB 40 B7 + RES $7,(IY + 16),B / FD CB 10 B8 + RES $7,(IY + 32),C / FD CB 20 B9 + RES $7,(IY + 48),D / FD CB 30 BA + RES $7,(IY + 64),E / FD CB 40 BB + RES $7,(IY + 16),H / FD CB 10 BC + RES $7,(IY + 32),L / FD CB 20 BD + RES $7,(IY + 48) / FD CB 30 BE + RES $7,(IY + 64),A / FD CB 40 BF + SET $0,(IY + 16),B / FD CB 10 C0 + SET $0,(IY + 32),C / FD CB 20 C1 + SET $0,(IY + 48),D / FD CB 30 C2 + SET $0,(IY + 64),E / FD CB 40 C3 + SET $0,(IY + 16),H / FD CB 10 C4 + SET $0,(IY + 32),L / FD CB 20 C5 + SET $0,(IY + 48) / FD CB 30 C6 + SET $0,(IY + 64),A / FD CB 40 C7 + SET $1,(IY + 16),B / FD CB 10 C8 + SET $1,(IY + 32),C / FD CB 20 C9 + SET $1,(IY + 48),D / FD CB 30 CA + SET $1,(IY + 64),E / FD CB 40 CB + SET $1,(IY + 16),H / FD CB 10 CC + SET $1,(IY + 32),L / FD CB 20 CD + SET $1,(IY + 48) / FD CB 30 CE + SET $1,(IY + 64),A / FD CB 40 CF + SET $2,(IY + 16),B / FD CB 10 D0 + SET $2,(IY + 32),C / FD CB 20 D1 + SET $2,(IY + 48),D / FD CB 30 D2 + SET $2,(IY + 64),E / FD CB 40 D3 + SET $2,(IY + 16),H / FD CB 10 D4 + SET $2,(IY + 32),L / FD CB 20 D5 + SET $2,(IY + 48) / FD CB 30 D6 + SET $2,(IY + 64),A / FD CB 40 D7 + SET $3,(IY + 16),B / FD CB 10 D8 + SET $3,(IY + 32),C / FD CB 20 D9 + SET $3,(IY + 48),D / FD CB 30 DA + SET $3,(IY + 64),E / FD CB 40 DB + SET $3,(IY + 16),H / FD CB 10 DC + SET $3,(IY + 32),L / FD CB 20 DD + SET $3,(IY + 48) / FD CB 30 DE + SET $3,(IY + 64),A / FD CB 40 DF + SET $4,(IY + 16),B / FD CB 10 E0 + SET $4,(IY + 32),C / FD CB 20 E1 + SET $4,(IY + 48),D / FD CB 30 E2 + SET $4,(IY + 64),E / FD CB 40 E3 + SET $4,(IY + 16),H / FD CB 10 E4 + SET $4,(IY + 32),L / FD CB 20 E5 + SET $4,(IY + 48) / FD CB 30 E6 + SET $4,(IY + 64),A / FD CB 40 E7 + SET $5,(IY + 16),B / FD CB 10 E8 + SET $5,(IY + 32),C / FD CB 20 E9 + SET $5,(IY + 48),D / FD CB 30 EA + SET $5,(IY + 64),E / FD CB 40 EB + SET $5,(IY + 16),H / FD CB 10 EC + SET $5,(IY + 32),L / FD CB 20 ED + SET $5,(IY + 48) / FD CB 30 EE + SET $5,(IY + 64),A / FD CB 40 EF + SET $6,(IY + 16),B / FD CB 10 F0 + SET $6,(IY + 32),C / FD CB 20 F1 + SET $6,(IY + 48),D / FD CB 30 F2 + SET $6,(IY + 64),E / FD CB 40 F3 + SET $6,(IY + 16),H / FD CB 10 F4 + SET $6,(IY + 32),L / FD CB 20 F5 + SET $6,(IY + 48) / FD CB 30 F6 + SET $6,(IY + 64),A / FD CB 40 F7 + SET $7,(IY + 16),B / FD CB 10 F8 + SET $7,(IY + 32),C / FD CB 20 F9 + SET $7,(IY + 48),D / FD CB 30 FA + SET $7,(IY + 64),E / FD CB 40 FB + SET $7,(IY + 16),H / FD CB 10 FC + SET $7,(IY + 32),L / FD CB 20 FD + SET $7,(IY + 48) / FD CB 30 FE + SET $7,(IY + 64),A / FD CB 40 FF + POP IY / FD E1 + EX (SP),IY / FD E3 + PUSH IY / FD E5 + JP IY / FD E9 + LD SP,IY / FD F9 + CP A,$32 / FE 20 + RST $56 / FF + +/ and now, we are going to test at&t syntax in z80 + INC 32(IX) / DD 34 20 + DEC 16(IX) / DD 35 10 + LD 64(IX),$128 / DD 36 40 80 + LD B,32(IX) / DD 46 20 + LD C,48(IX) / DD 4E 30 + LD D,32(IX) / DD 56 20 + LD E,64(IX) / DD 5E 40 + LD H,16(IX) / DD 66 10 + LD L,48(IX) / DD 6E 30 + LD 64(IX),B / DD 70 40 + LD 16(IX),C / DD 71 10 + LD 32(IX),D / DD 72 20 + LD 48(IX),E / DD 73 30 + LD 16(IX),H / DD 74 10 + LD 32(IX),L / DD 75 20 + LD 48(IX),A / DD 77 30 + LD A,16(IX) / DD 7E 10 + ADD A,32(IX) / DD 86 20 + ADC A,48(IX) / DD 8E 30 + SUB A,16(IX) / DD 96 10 + SBC A,32(IX) / DD 9E 20 + AND A,48(IX) / DD A6 30 + XOR A,16(IX) / DD AE 10 + OR A,32(IX) / DD B6 20 + CP A,48(IX) / DD BE 30 + RLC 16(IX),B / DD CB 10 00 + RLC 32(IX),C / DD CB 20 01 + RLC 48(IX),D / DD CB 30 02 + RLC 64(IX),E / DD CB 40 03 + RLC 16(IX),H / DD CB 10 04 + RLC 32(IX),L / DD CB 20 05 + RLC 64(IX) / DD CB 40 06 + RLC 16(IX),A / DD CB 10 07 + RRC 32(IX),B / DD CB 20 08 + RRC 48(IX),C / DD CB 30 09 + RRC 64(IX),D / DD CB 40 0A + RRC 16(IX),E / DD CB 10 0B + RRC 32(IX),H / DD CB 20 0C + RRC 48(IX),L / DD CB 30 0D + RRC 16(IX) / DD CB 10 0E + RRC 16(IX),A / DD CB 10 0F + RL 32(IX),B / DD CB 20 10 + RL 48(IX),C / DD CB 30 11 + RL 64(IX),D / DD CB 40 12 + RL 16(IX),E / DD CB 10 13 + RL 32(IX),H / DD CB 20 14 + RL 48(IX),L / DD CB 30 15 + RL 32(IX) / DD CB 20 16 + RL 16(IX),A / DD CB 10 17 + RR 32(IX),B / DD CB 20 18 + RR 48(IX),C / DD CB 30 19 + RR 64(IX),D / DD CB 40 1A + RR 16(IX),E / DD CB 10 1B + RR 32(IX),H / DD CB 20 1C + RR 48(IX),L / DD CB 30 1D + RR 48(IX) / DD CB 30 1E + RR 16(IX),A / DD CB 10 1F + SLA 32(IX),B / DD CB 20 20 + SLA 48(IX),C / DD CB 30 21 + SLA 64(IX),D / DD CB 40 22 + SLA 16(IX),E / DD CB 10 23 + SLA 32(IX),H / DD CB 20 24 + SLA 48(IX),L / DD CB 30 25 + SLA 64(IX) / DD CB 40 26 + SLA 16(IX),A / DD CB 10 27 + SRA 32(IX),B / DD CB 20 28 + SRA 48(IX),C / DD CB 30 29 + SRA 64(IX),D / DD CB 40 2A + SRA 16(IX),E / DD CB 10 2B + SRA 32(IX),H / DD CB 20 2C + SRA 48(IX),L / DD CB 30 2D + SRA 16(IX) / DD CB 10 2E + SRA 16(IX),A / DD CB 10 2F + SLL 32(IX),B / DD CB 20 30 + SLL 48(IX),C / DD CB 30 31 + SLL 64(IX),D / DD CB 40 32 + SLL 16(IX),E / DD CB 10 33 + SLL 32(IX),H / DD CB 20 34 + SLL 48(IX),L / DD CB 30 35 + SLL 32(IX) / DD CB 20 36 + SLL 16(IX),A / DD CB 10 37 + SRL 32(IX),B / DD CB 20 38 + SRL 48(IX),C / DD CB 30 39 + SRL 64(IX),D / DD CB 40 3A + SRL 16(IX),E / DD CB 10 3B + SRL 32(IX),H / DD CB 20 3C + SRL 48(IX),L / DD CB 30 3D + SRL 48(IX) / DD CB 30 3E + SRL 64(IX),A / DD CB 40 3F + BIT $0,16(IX) / DD CB 10 46 + BIT $1,32(IX) / DD CB 20 4E + BIT $2,48(IX) / DD CB 30 56 + BIT $3,64(IX) / DD CB 40 5E + BIT $4,16(IX) / DD CB 10 66 + BIT $5,32(IX) / DD CB 20 6E + BIT $6,48(IX) / DD CB 30 76 + BIT $7,64(IX) / DD CB 40 7E + RES $0,16(IX),B / DD CB 10 80 + RES $0,32(IX),C / DD CB 20 81 + RES $0,48(IX),D / DD CB 30 82 + RES $0,64(IX),E / DD CB 40 83 + RES $0,16(IX),H / DD CB 10 84 + RES $0,32(IX),L / DD CB 20 85 + RES $0,48(IX) / DD CB 30 86 + RES $0,64(IX),A / DD CB 40 87 + RES $1,16(IX),B / DD CB 10 88 + RES $1,32(IX),C / DD CB 20 89 + RES $1,48(IX),D / DD CB 30 8A + RES $1,64(IX),E / DD CB 40 8B + RES $1,16(IX),H / DD CB 10 8C + RES $1,32(IX),L / DD CB 20 8D + RES $1,48(IX) / DD CB 30 8E + RES $1,64(IX),A / DD CB 40 8F + RES $2,16(IX),B / DD CB 10 90 + RES $2,32(IX),C / DD CB 20 91 + RES $2,48(IX),D / DD CB 30 92 + RES $2,64(IX),E / DD CB 40 93 + RES $2,16(IX),H / DD CB 10 94 + RES $2,32(IX),L / DD CB 20 95 + RES $2,48(IX) / DD CB 30 96 + RES $2,64(IX),A / DD CB 40 97 + RES $3,16(IX),B / DD CB 10 98 + RES $3,32(IX),C / DD CB 20 99 + RES $3,48(IX),D / DD CB 30 9A + RES $3,64(IX),E / DD CB 40 9B + RES $3,16(IX),H / DD CB 10 9C + RES $3,32(IX),L / DD CB 20 9D + RES $3,48(IX) / DD CB 30 9E + RES $3,64(IX),A / DD CB 40 9F + RES $4,16(IX),B / DD CB 10 A0 + RES $4,32(IX),C / DD CB 20 A1 + RES $4,48(IX),D / DD CB 30 A2 + RES $4,64(IX),E / DD CB 40 A3 + RES $4,16(IX),H / DD CB 10 A4 + RES $4,32(IX),L / DD CB 20 A5 + RES $4,48(IX) / DD CB 30 A6 + RES $4,64(IX),A / DD CB 40 A7 + RES $5,16(IX),B / DD CB 10 A8 + RES $5,32(IX),C / DD CB 20 A9 + RES $5,48(IX),D / DD CB 30 AA + RES $5,64(IX),E / DD CB 40 AB + RES $5,16(IX),H / DD CB 10 AC + RES $5,32(IX),L / DD CB 20 AD + RES $5,48(IX) / DD CB 30 AE + RES $5,64(IX),A / DD CB 40 AF + RES $6,16(IX),B / DD CB 10 B0 + RES $6,32(IX),C / DD CB 20 B1 + RES $6,48(IX),D / DD CB 30 B2 + RES $6,64(IX),E / DD CB 40 B3 + RES $6,16(IX),H / DD CB 10 B4 + RES $6,32(IX),L / DD CB 20 B5 + RES $6,48(IX) / DD CB 30 B6 + RES $6,64(IX),A / DD CB 40 B7 + RES $7,16(IX),B / DD CB 10 B8 + RES $7,32(IX),C / DD CB 20 B9 + RES $7,48(IX),D / DD CB 30 BA + RES $7,64(IX),E / DD CB 40 BB + RES $7,16(IX),H / DD CB 10 BC + RES $7,32(IX),L / DD CB 20 BD + RES $7,48(IX) / DD CB 30 BE + RES $7,64(IX),A / DD CB 40 BF + SET $0,16(IX),B / DD CB 10 C0 + SET $0,32(IX),C / DD CB 20 C1 + SET $0,48(IX),D / DD CB 30 C2 + SET $0,64(IX),E / DD CB 40 C3 + SET $0,16(IX),H / DD CB 10 C4 + SET $0,32(IX),L / DD CB 20 C5 + SET $0,48(IX) / DD CB 30 C6 + SET $0,64(IX),A / DD CB 40 C7 + SET $1,16(IX),B / DD CB 10 C8 + SET $1,32(IX),C / DD CB 20 C9 + SET $1,48(IX),D / DD CB 30 CA + SET $1,64(IX),E / DD CB 40 CB + SET $1,16(IX),H / DD CB 10 CC + SET $1,32(IX),L / DD CB 20 CD + SET $1,48(IX) / DD CB 30 CE + SET $1,64(IX),A / DD CB 40 CF + SET $2,16(IX),B / DD CB 10 D0 + SET $2,32(IX),C / DD CB 20 D1 + SET $2,48(IX),D / DD CB 30 D2 + SET $2,64(IX),E / DD CB 40 D3 + SET $2,16(IX),H / DD CB 10 D4 + SET $2,32(IX),L / DD CB 20 D5 + SET $2,48(IX) / DD CB 30 D6 + SET $2,64(IX),A / DD CB 40 D7 + SET $3,16(IX),B / DD CB 10 D8 + SET $3,32(IX),C / DD CB 20 D9 + SET $3,48(IX),D / DD CB 30 DA + SET $3,64(IX),E / DD CB 40 DB + SET $3,16(IX),H / DD CB 10 DC + SET $3,32(IX),L / DD CB 20 DD + SET $3,48(IX) / DD CB 30 DE + SET $3,64(IX),A / DD CB 40 DF + SET $4,16(IX),B / DD CB 10 E0 + SET $4,32(IX),C / DD CB 20 E1 + SET $4,48(IX),D / DD CB 30 E2 + SET $4,64(IX),E / DD CB 40 E3 + SET $4,16(IX),H / DD CB 10 E4 + SET $4,32(IX),L / DD CB 20 E5 + SET $4,48(IX) / DD CB 30 E6 + SET $4,64(IX),A / DD CB 40 E7 + SET $5,16(IX),B / DD CB 10 E8 + SET $5,32(IX),C / DD CB 20 E9 + SET $5,48(IX),D / DD CB 30 EA + SET $5,64(IX),E / DD CB 40 EB + SET $5,16(IX),H / DD CB 10 EC + SET $5,32(IX),L / DD CB 20 ED + SET $5,48(IX) / DD CB 30 EE + SET $5,64(IX),A / DD CB 40 EF + SET $6,16(IX),B / DD CB 10 F0 + SET $6,32(IX),C / DD CB 20 F1 + SET $6,48(IX),D / DD CB 30 F2 + SET $6,64(IX),E / DD CB 40 F3 + SET $6,16(IX),H / DD CB 10 F4 + SET $6,32(IX),L / DD CB 20 F5 + SET $6,48(IX) / DD CB 30 F6 + SET $6,64(IX),A / DD CB 40 F7 + SET $7,16(IX),B / DD CB 10 F8 + SET $7,32(IX),C / DD CB 20 F9 + SET $7,48(IX),D / DD CB 30 FA + SET $7,64(IX),E / DD CB 40 FB + SET $7,16(IX),H / DD CB 10 FC + SET $7,32(IX),L / DD CB 20 FD + SET $7,48(IX) / DD CB 30 FE + SET $7,64(IX),A / DD CB 40 FF + INC 32(IY) / FD 34 20 + DEC 48(IY) / FD 35 30 + LD 64(IY),$16 / FD 36 40 10 + LD B,32(IY) / FD 46 20 + LD C,48(IY) / FD 4E 30 + LD D,64(IY) / FD 56 40 + LD E,16(IY) / FD 5E 10 + LD H,32(IY) / FD 66 20 + LD L,48(IY) / FD 6E 30 + LD 64(IY),B / FD 70 40 + LD 16(IY),C / FD 71 10 + LD 32(IY),D / FD 72 20 + LD 48(IY),E / FD 73 30 + LD 64(IY),H / FD 74 40 + LD 16(IY),L / FD 75 10 + LD 32(IY),A / FD 77 20 + LD A,48(IY) / FD 7E 30 + ADD A,64(IY) / FD 86 40 + ADC A,16(IY) / FD 8E 10 + SUB A,32(IY) / FD 96 20 + SBC A,48(IY) / FD 9E 30 + AND A,64(IY) / FD A6 40 + XOR A,16(IY) / FD AE 10 + OR A,32(IY) / FD B6 20 + CP A,48(IY) / FD BE 30 + RLC 16(IY),B / FD CB 10 00 + RLC 32(IY),C / FD CB 20 01 + RLC 48(IY),D / FD CB 30 02 + RLC 64(IY),E / FD CB 40 03 + RLC 16(IY),H / FD CB 10 04 + RLC 32(IY),L / FD CB 20 05 + RLC 16(IY) / FD CB 10 06 + RLC 32(IY),A / FD CB 20 07 + RRC 48(IY),B / FD CB 30 08 + RRC 64(IY),C / FD CB 40 09 + RRC 16(IY),D / FD CB 10 0A + RRC 32(IY),E / FD CB 20 0B + RRC 48(IY),H / FD CB 30 0C + RRC 64(IY),L / FD CB 40 0D + RRC 32(IY) / FD CB 20 0E + RRC 16(IY),A / FD CB 10 0F + RL 32(IY),B / FD CB 20 10 + RL 48(IY),C / FD CB 30 11 + RL 64(IY),D / FD CB 40 12 + RL 16(IY),E / FD CB 10 13 + RL 32(IY),H / FD CB 20 14 + RL 48(IY),L / FD CB 30 15 + RL 48(IY) / FD CB 30 16 + RL 16(IY),A / FD CB 10 17 + RR 32(IY),B / FD CB 20 18 + RR 48(IY),C / FD CB 30 19 + RR 64(IY),D / FD CB 40 1A + RR 16(IY),E / FD CB 10 1B + RR 32(IY),H / FD CB 20 1C + RR 48(IY),L / FD CB 30 1D + RR 64(IY) / FD CB 40 1E + RR 16(IY),A / FD CB 10 1F + SLA 32(IY),B / FD CB 20 20 + SLA 48(IY),C / FD CB 30 21 + SLA 64(IY),D / FD CB 40 22 + SLA 16(IY),E / FD CB 10 23 + SLA 32(IY),H / FD CB 20 24 + SLA 48(IY),L / FD CB 30 25 + SLA 16(IY) / FD CB 10 26 + SLA 16(IY),A / FD CB 10 27 + SRA 32(IY),B / FD CB 20 28 + SRA 48(IY),C / FD CB 30 29 + SRA 64(IY),D / FD CB 40 2A + SRA 16(IY),E / FD CB 10 2B + SRA 32(IY),H / FD CB 20 2C + SRA 48(IY),L / FD CB 30 2D + SRA 32(IY) / FD CB 20 2E + SRA 48(IY),A / FD CB 30 2F + SLL 16(IY),B / FD CB 10 30 + SLL 32(IY),C / FD CB 20 31 + SLL 48(IY),D / FD CB 30 32 + SLL 64(IY),E / FD CB 40 33 + SLL 16(IY),H / FD CB 10 34 + SLL 32(IY),L / FD CB 20 35 + SLL 48(IY) / FD CB 30 36 + SLL 16(IY),A / FD CB 10 37 + SRL 32(IY),B / FD CB 20 38 + SRL 48(IY),C / FD CB 30 39 + SRL 64(IY),D / FD CB 40 3A + SRL 16(IY),E / FD CB 10 3B + SRL 32(IY),H / FD CB 20 3C + SRL 48(IY),L / FD CB 30 3D + SRL 64(IY) / FD CB 40 3E + SRL 16(IY),A / FD CB 10 3F + BIT $0,16(IY) / FD CB 10 46 + BIT $1,32(IY) / FD CB 20 4E + BIT $2,48(IY) / FD CB 30 56 + BIT $3,64(IY) / FD CB 40 5E + BIT $4,16(IY) / FD CB 10 66 + BIT $5,32(IY) / FD CB 20 6E + BIT $6,48(IY) / FD CB 30 76 + BIT $7,64(IY) / FD CB 40 7E + RES $0,16(IY),B / FD CB 10 80 + RES $0,32(IY),C / FD CB 20 81 + RES $0,48(IY),D / FD CB 30 82 + RES $0,64(IY),E / FD CB 40 83 + RES $0,16(IY),H / FD CB 10 84 + RES $0,32(IY),L / FD CB 20 85 + RES $0,48(IY) / FD CB 30 86 + RES $0,64(IY),A / FD CB 40 87 + RES $1,16(IY),B / FD CB 10 88 + RES $1,32(IY),C / FD CB 20 89 + RES $1,48(IY),D / FD CB 30 8A + RES $1,64(IY),E / FD CB 40 8B + RES $1,16(IY),H / FD CB 10 8C + RES $1,32(IY),L / FD CB 20 8D + RES $1,48(IY) / FD CB 30 8E + RES $1,64(IY),A / FD CB 40 8F + RES $2,16(IY),B / FD CB 10 90 + RES $2,32(IY),C / FD CB 20 91 + RES $2,48(IY),D / FD CB 30 92 + RES $2,64(IY),E / FD CB 40 93 + RES $2,16(IY),H / FD CB 10 94 + RES $2,32(IY),L / FD CB 20 95 + RES $2,48(IY) / FD CB 30 96 + RES $2,64(IY),A / FD CB 40 97 + RES $3,16(IY),B / FD CB 10 98 + RES $3,32(IY),C / FD CB 20 99 + RES $3,48(IY),D / FD CB 30 9A + RES $3,64(IY),E / FD CB 40 9B + RES $3,16(IY),H / FD CB 10 9C + RES $3,32(IY),L / FD CB 20 9D + RES $3,48(IY) / FD CB 30 9E + RES $3,64(IY),A / FD CB 40 9F + RES $4,16(IY),B / FD CB 10 A0 + RES $4,32(IY),C / FD CB 20 A1 + RES $4,48(IY),D / FD CB 30 A2 + RES $4,64(IY),E / FD CB 40 A3 + RES $4,16(IY),H / FD CB 10 A4 + RES $4,32(IY),L / FD CB 20 A5 + RES $4,48(IY) / FD CB 30 A6 + RES $4,64(IY),A / FD CB 40 A7 + RES $5,16(IY),B / FD CB 10 A8 + RES $5,32(IY),C / FD CB 20 A9 + RES $5,48(IY),D / FD CB 30 AA + RES $5,64(IY),E / FD CB 40 AB + RES $5,16(IY),H / FD CB 10 AC + RES $5,32(IY),L / FD CB 20 AD + RES $5,48(IY) / FD CB 30 AE + RES $5,64(IY),A / FD CB 40 AF + RES $6,16(IY),B / FD CB 10 B0 + RES $6,32(IY),C / FD CB 20 B1 + RES $6,48(IY),D / FD CB 30 B2 + RES $6,64(IY),E / FD CB 40 B3 + RES $6,16(IY),H / FD CB 10 B4 + RES $6,32(IY),L / FD CB 20 B5 + RES $6,48(IY) / FD CB 30 B6 + RES $6,64(IY),A / FD CB 40 B7 + RES $7,16(IY),B / FD CB 10 B8 + RES $7,32(IY),C / FD CB 20 B9 + RES $7,48(IY),D / FD CB 30 BA + RES $7,64(IY),E / FD CB 40 BB + RES $7,16(IY),H / FD CB 10 BC + RES $7,32(IY),L / FD CB 20 BD + RES $7,48(IY) / FD CB 30 BE + RES $7,64(IY),A / FD CB 40 BF + SET $0,16(IY),B / FD CB 10 C0 + SET $0,32(IY),C / FD CB 20 C1 + SET $0,48(IY),D / FD CB 30 C2 + SET $0,64(IY),E / FD CB 40 C3 + SET $0,16(IY),H / FD CB 10 C4 + SET $0,32(IY),L / FD CB 20 C5 + SET $0,48(IY) / FD CB 30 C6 + SET $0,64(IY),A / FD CB 40 C7 + SET $1,16(IY),B / FD CB 10 C8 + SET $1,32(IY),C / FD CB 20 C9 + SET $1,48(IY),D / FD CB 30 CA + SET $1,64(IY),E / FD CB 40 CB + SET $1,16(IY),H / FD CB 10 CC + SET $1,32(IY),L / FD CB 20 CD + SET $1,48(IY) / FD CB 30 CE + SET $1,64(IY),A / FD CB 40 CF + SET $2,16(IY),B / FD CB 10 D0 + SET $2,32(IY),C / FD CB 20 D1 + SET $2,48(IY),D / FD CB 30 D2 + SET $2,64(IY),E / FD CB 40 D3 + SET $2,16(IY),H / FD CB 10 D4 + SET $2,32(IY),L / FD CB 20 D5 + SET $2,48(IY) / FD CB 30 D6 + SET $2,64(IY),A / FD CB 40 D7 + SET $3,16(IY),B / FD CB 10 D8 + SET $3,32(IY),C / FD CB 20 D9 + SET $3,48(IY),D / FD CB 30 DA + SET $3,64(IY),E / FD CB 40 DB + SET $3,16(IY),H / FD CB 10 DC + SET $3,32(IY),L / FD CB 20 DD + SET $3,48(IY) / FD CB 30 DE + SET $3,64(IY),A / FD CB 40 DF + SET $4,16(IY),B / FD CB 10 E0 + SET $4,32(IY),C / FD CB 20 E1 + SET $4,48(IY),D / FD CB 30 E2 + SET $4,64(IY),E / FD CB 40 E3 + SET $4,16(IY),H / FD CB 10 E4 + SET $4,32(IY),L / FD CB 20 E5 + SET $4,48(IY) / FD CB 30 E6 + SET $4,64(IY),A / FD CB 40 E7 + SET $5,16(IY),B / FD CB 10 E8 + SET $5,32(IY),C / FD CB 20 E9 + SET $5,48(IY),D / FD CB 30 EA + SET $5,64(IY),E / FD CB 40 EB + SET $5,16(IY),H / FD CB 10 EC + SET $5,32(IY),L / FD CB 20 ED + SET $5,48(IY) / FD CB 30 EE + SET $5,64(IY),A / FD CB 40 EF + SET $6,16(IY),B / FD CB 10 F0 + SET $6,32(IY),C / FD CB 20 F1 + SET $6,48(IY),D / FD CB 30 F2 + SET $6,64(IY),E / FD CB 40 F3 + SET $6,16(IY),H / FD CB 10 F4 + SET $6,32(IY),L / FD CB 20 F5 + SET $6,48(IY) / FD CB 30 F6 + SET $6,64(IY),A / FD CB 40 F7 + SET $7,16(IY),B / FD CB 10 F8 + SET $7,32(IY),C / FD CB 20 F9 + SET $7,48(IY),D / FD CB 30 FA + SET $7,64(IY),E / FD CB 40 FB + SET $7,16(IY),H / FD CB 10 FC + SET $7,32(IY),L / FD CB 20 FD + SET $7,48(IY) / FD CB 30 FE + SET $7,64(IY),A / FD CB 40 FF diff --git a/tests/libc/execute/0001-abort.c b/tests/libc/execute/0001-abort.c @@ -0,0 +1,27 @@ +#include <assert.h> +#include <stdio.h> +#include <signal.h> +#include <stdlib.h> + +/* +output: +aborting +end: +*/ + +void +handler(int dummy) +{ + _Exit(0); +} + +int +main(void) +{ + printf("aborting\n"); + assert(signal(SIGABRT, handler) != SIG_ERR); + abort(); + printf("borning\n"); + + return 0; +} diff --git a/tests/libc/execute/0002-assert.c b/tests/libc/execute/0002-assert.c @@ -0,0 +1,35 @@ + +#include <assert.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> + +/* +output: +First assert +Second assert, that must fail +end: +*/ + +void +handler(int dummy) +{ + _Exit(0); +} + +int +main() +{ + int i; + char c; + + assert(signal(SIGABRT, handler) != SIG_ERR); + + printf("First assert\n"); + assert(sizeof(i) >= sizeof(c)); + + printf("Second assert, that must fail\n"); + assert(sizeof(i) < sizeof(c)); + + return 0; +} diff --git a/tests/libc/execute/0003-assert.c b/tests/libc/execute/0003-assert.c @@ -0,0 +1,27 @@ +#include <assert.h> +#include <stdio.h> + +/* +output: +First assert +Second assert, that must fail +end: +*/ + +int +main() +{ + int i; + char c; + + printf("First assert\n"); + assert(sizeof(i) >= sizeof(c)); + +#define NDEBUG +#include <assert.h> + + printf("Second assert, that must fail\n"); + assert(sizeof(i) < sizeof(c)); + + return 0; +} diff --git a/tests/libc/execute/0004-abort.c b/tests/libc/execute/0004-abort.c @@ -0,0 +1,21 @@ +#include <assert.h> +#include <stdio.h> +#include <signal.h> +#include <stdlib.h> + +/* +output: +aborting +end: +*/ + +int +main(void) +{ + printf("aborting\n"); + assert(signal(SIGABRT, SIG_IGN) != SIG_ERR); + abort(); + printf("borning\n"); + + return 0; +} diff --git a/tests/libc/execute/0005-ctype.c b/tests/libc/execute/0005-ctype.c @@ -0,0 +1,572 @@ +#define __USE_MACROS +#include <assert.h> +#include <ctype.h> +#include <stdio.h> +#include <limits.h> + +/* + * This test assumes an ascii representation + */ + +#define TESTW(f) fputs(#f ":" , stdout); \ + for (i = 0; i <= UCHAR_MAX; i++) \ + if (f(i)) printf(" %d", i); \ + putchar('\n') + +#define TESTC(f) fputs(#f ": " , stdout); \ + for (i = 0; i <= UCHAR_MAX; i++) \ + if (f(i)) putchar(i); \ + putchar('\n') + +#define TESTEOF(f) fputs(#f ": " , stdout); \ + if (!f(EOF)) putchar('!'); puts("EOF"); + +#define TESTLU(f) \ + for (i = 0; i < UCHAR_MAX; i++) { \ + n = f(i); \ + if (!isgraph(i)) \ + continue; \ + printf("%s: %c <-> %c\n", #f, i, n); \ + } + +void +test1() +{ + int i; + + puts("\ntest1"); + TESTC(isalnum); + TESTC(isalpha); + TESTC(isdigit); + TESTC(isgraph); + TESTC(islower); + TESTC(isupper); + TESTC(isprint); + TESTC(ispunct); + TESTC(isxdigit); + TESTC(isdigit); + TESTW(iscntrl); + TESTW(isspace); + TESTEOF(isalpha); + TESTEOF(isdigit); + TESTEOF(isgraph); + TESTEOF(islower); + TESTEOF(isupper); + TESTEOF(isprint); + TESTEOF(ispunct); + TESTEOF(isxdigit); + TESTEOF(isdigit); + TESTEOF(iscntrl); + TESTEOF(isspace); +} + +#undef isalnum +#undef isalpha +#undef isdigit +#undef isgraph +#undef islower +#undef isupper +#undef isprint +#undef ispunct +#undef isxdigit +#undef isdigit + +void +test2() +{ + int i; + + puts("\ntest2"); + TESTC(isalnum); + TESTC(isalpha); + TESTC(isdigit); + TESTC(isgraph); + TESTC(islower); + TESTC(isupper); + TESTC(isprint); + TESTC(ispunct); + TESTC(isxdigit); + TESTC(isdigit); + TESTW(iscntrl); + TESTW(isspace); + TESTEOF(isalpha); + TESTEOF(isdigit); + TESTEOF(isgraph); + TESTEOF(islower); + TESTEOF(isupper); + TESTEOF(isprint); + TESTEOF(ispunct); + TESTEOF(isxdigit); + TESTEOF(isdigit); + TESTEOF(iscntrl); + TESTEOF(isspace); +} + +void test3() +{ + int i, n; + + puts("\ntest3"); + TESTLU(tolower); + TESTLU(toupper); +} + +#undef tolower +#undef toupper + +void test4() +{ + int i, n; + + puts("\ntest4"); + TESTLU(tolower); + TESTLU(toupper); + assert(tolower(EOF) == EOF); + assert(toupper(EOF) == EOF); +} + +int +main() +{ + test1(); + test2(); + test3(); + test4(); + + return 0; +} + +/* +output: + +test1 +isalnum: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +isalpha: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +isdigit: 0123456789 +isgraph: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ +islower: abcdefghijklmnopqrstuvwxyz +isupper: ABCDEFGHIJKLMNOPQRSTUVWXYZ +isprint: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ +ispunct: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ +isxdigit: 0123456789ABCDEFabcdef +isdigit: 0123456789 +iscntrl: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127 +isspace: 9 10 11 12 13 32 +isalpha: !EOF +isdigit: !EOF +isgraph: !EOF +islower: !EOF +isupper: !EOF +isprint: !EOF +ispunct: !EOF +isxdigit: !EOF +isdigit: !EOF +iscntrl: !EOF +isspace: !EOF + +test2 +isalnum: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +isalpha: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +isdigit: 0123456789 +isgraph: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ +islower: abcdefghijklmnopqrstuvwxyz +isupper: ABCDEFGHIJKLMNOPQRSTUVWXYZ +isprint: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ +ispunct: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ +isxdigit: 0123456789ABCDEFabcdef +isdigit: 0123456789 +iscntrl: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127 +isspace: 9 10 11 12 13 32 +isalpha: !EOF +isdigit: !EOF +isgraph: !EOF +islower: !EOF +isupper: !EOF +isprint: !EOF +ispunct: !EOF +isxdigit: !EOF +isdigit: !EOF +iscntrl: !EOF +isspace: !EOF + +test3 +tolower: ! <-> ! +tolower: " <-> " +tolower: # <-> # +tolower: $ <-> $ +tolower: % <-> % +tolower: & <-> & +tolower: ' <-> ' +tolower: ( <-> ( +tolower: ) <-> ) +tolower: * <-> * +tolower: + <-> + +tolower: , <-> , +tolower: - <-> - +tolower: . <-> . +tolower: / <-> / +tolower: 0 <-> 0 +tolower: 1 <-> 1 +tolower: 2 <-> 2 +tolower: 3 <-> 3 +tolower: 4 <-> 4 +tolower: 5 <-> 5 +tolower: 6 <-> 6 +tolower: 7 <-> 7 +tolower: 8 <-> 8 +tolower: 9 <-> 9 +tolower: : <-> : +tolower: ; <-> ; +tolower: < <-> < +tolower: = <-> = +tolower: > <-> > +tolower: ? <-> ? +tolower: @ <-> @ +tolower: A <-> a +tolower: B <-> b +tolower: C <-> c +tolower: D <-> d +tolower: E <-> e +tolower: F <-> f +tolower: G <-> g +tolower: H <-> h +tolower: I <-> i +tolower: J <-> j +tolower: K <-> k +tolower: L <-> l +tolower: M <-> m +tolower: N <-> n +tolower: O <-> o +tolower: P <-> p +tolower: Q <-> q +tolower: R <-> r +tolower: S <-> s +tolower: T <-> t +tolower: U <-> u +tolower: V <-> v +tolower: W <-> w +tolower: X <-> x +tolower: Y <-> y +tolower: Z <-> z +tolower: [ <-> [ +tolower: \ <-> \ +tolower: ] <-> ] +tolower: ^ <-> ^ +tolower: _ <-> _ +tolower: ` <-> ` +tolower: a <-> a +tolower: b <-> b +tolower: c <-> c +tolower: d <-> d +tolower: e <-> e +tolower: f <-> f +tolower: g <-> g +tolower: h <-> h +tolower: i <-> i +tolower: j <-> j +tolower: k <-> k +tolower: l <-> l +tolower: m <-> m +tolower: n <-> n +tolower: o <-> o +tolower: p <-> p +tolower: q <-> q +tolower: r <-> r +tolower: s <-> s +tolower: t <-> t +tolower: u <-> u +tolower: v <-> v +tolower: w <-> w +tolower: x <-> x +tolower: y <-> y +tolower: z <-> z +tolower: { <-> { +tolower: | <-> | +tolower: } <-> } +tolower: ~ <-> ~ +toupper: ! <-> ! +toupper: " <-> " +toupper: # <-> # +toupper: $ <-> $ +toupper: % <-> % +toupper: & <-> & +toupper: ' <-> ' +toupper: ( <-> ( +toupper: ) <-> ) +toupper: * <-> * +toupper: + <-> + +toupper: , <-> , +toupper: - <-> - +toupper: . <-> . +toupper: / <-> / +toupper: 0 <-> 0 +toupper: 1 <-> 1 +toupper: 2 <-> 2 +toupper: 3 <-> 3 +toupper: 4 <-> 4 +toupper: 5 <-> 5 +toupper: 6 <-> 6 +toupper: 7 <-> 7 +toupper: 8 <-> 8 +toupper: 9 <-> 9 +toupper: : <-> : +toupper: ; <-> ; +toupper: < <-> < +toupper: = <-> = +toupper: > <-> > +toupper: ? <-> ? +toupper: @ <-> @ +toupper: A <-> A +toupper: B <-> B +toupper: C <-> C +toupper: D <-> D +toupper: E <-> E +toupper: F <-> F +toupper: G <-> G +toupper: H <-> H +toupper: I <-> I +toupper: J <-> J +toupper: K <-> K +toupper: L <-> L +toupper: M <-> M +toupper: N <-> N +toupper: O <-> O +toupper: P <-> P +toupper: Q <-> Q +toupper: R <-> R +toupper: S <-> S +toupper: T <-> T +toupper: U <-> U +toupper: V <-> V +toupper: W <-> W +toupper: X <-> X +toupper: Y <-> Y +toupper: Z <-> Z +toupper: [ <-> [ +toupper: \ <-> \ +toupper: ] <-> ] +toupper: ^ <-> ^ +toupper: _ <-> _ +toupper: ` <-> ` +toupper: a <-> A +toupper: b <-> B +toupper: c <-> C +toupper: d <-> D +toupper: e <-> E +toupper: f <-> F +toupper: g <-> G +toupper: h <-> H +toupper: i <-> I +toupper: j <-> J +toupper: k <-> K +toupper: l <-> L +toupper: m <-> M +toupper: n <-> N +toupper: o <-> O +toupper: p <-> P +toupper: q <-> Q +toupper: r <-> R +toupper: s <-> S +toupper: t <-> T +toupper: u <-> U +toupper: v <-> V +toupper: w <-> W +toupper: x <-> X +toupper: y <-> Y +toupper: z <-> Z +toupper: { <-> { +toupper: | <-> | +toupper: } <-> } +toupper: ~ <-> ~ + +test4 +tolower: ! <-> ! +tolower: " <-> " +tolower: # <-> # +tolower: $ <-> $ +tolower: % <-> % +tolower: & <-> & +tolower: ' <-> ' +tolower: ( <-> ( +tolower: ) <-> ) +tolower: * <-> * +tolower: + <-> + +tolower: , <-> , +tolower: - <-> - +tolower: . <-> . +tolower: / <-> / +tolower: 0 <-> 0 +tolower: 1 <-> 1 +tolower: 2 <-> 2 +tolower: 3 <-> 3 +tolower: 4 <-> 4 +tolower: 5 <-> 5 +tolower: 6 <-> 6 +tolower: 7 <-> 7 +tolower: 8 <-> 8 +tolower: 9 <-> 9 +tolower: : <-> : +tolower: ; <-> ; +tolower: < <-> < +tolower: = <-> = +tolower: > <-> > +tolower: ? <-> ? +tolower: @ <-> @ +tolower: A <-> a +tolower: B <-> b +tolower: C <-> c +tolower: D <-> d +tolower: E <-> e +tolower: F <-> f +tolower: G <-> g +tolower: H <-> h +tolower: I <-> i +tolower: J <-> j +tolower: K <-> k +tolower: L <-> l +tolower: M <-> m +tolower: N <-> n +tolower: O <-> o +tolower: P <-> p +tolower: Q <-> q +tolower: R <-> r +tolower: S <-> s +tolower: T <-> t +tolower: U <-> u +tolower: V <-> v +tolower: W <-> w +tolower: X <-> x +tolower: Y <-> y +tolower: Z <-> z +tolower: [ <-> [ +tolower: \ <-> \ +tolower: ] <-> ] +tolower: ^ <-> ^ +tolower: _ <-> _ +tolower: ` <-> ` +tolower: a <-> a +tolower: b <-> b +tolower: c <-> c +tolower: d <-> d +tolower: e <-> e +tolower: f <-> f +tolower: g <-> g +tolower: h <-> h +tolower: i <-> i +tolower: j <-> j +tolower: k <-> k +tolower: l <-> l +tolower: m <-> m +tolower: n <-> n +tolower: o <-> o +tolower: p <-> p +tolower: q <-> q +tolower: r <-> r +tolower: s <-> s +tolower: t <-> t +tolower: u <-> u +tolower: v <-> v +tolower: w <-> w +tolower: x <-> x +tolower: y <-> y +tolower: z <-> z +tolower: { <-> { +tolower: | <-> | +tolower: } <-> } +tolower: ~ <-> ~ +toupper: ! <-> ! +toupper: " <-> " +toupper: # <-> # +toupper: $ <-> $ +toupper: % <-> % +toupper: & <-> & +toupper: ' <-> ' +toupper: ( <-> ( +toupper: ) <-> ) +toupper: * <-> * +toupper: + <-> + +toupper: , <-> , +toupper: - <-> - +toupper: . <-> . +toupper: / <-> / +toupper: 0 <-> 0 +toupper: 1 <-> 1 +toupper: 2 <-> 2 +toupper: 3 <-> 3 +toupper: 4 <-> 4 +toupper: 5 <-> 5 +toupper: 6 <-> 6 +toupper: 7 <-> 7 +toupper: 8 <-> 8 +toupper: 9 <-> 9 +toupper: : <-> : +toupper: ; <-> ; +toupper: < <-> < +toupper: = <-> = +toupper: > <-> > +toupper: ? <-> ? +toupper: @ <-> @ +toupper: A <-> A +toupper: B <-> B +toupper: C <-> C +toupper: D <-> D +toupper: E <-> E +toupper: F <-> F +toupper: G <-> G +toupper: H <-> H +toupper: I <-> I +toupper: J <-> J +toupper: K <-> K +toupper: L <-> L +toupper: M <-> M +toupper: N <-> N +toupper: O <-> O +toupper: P <-> P +toupper: Q <-> Q +toupper: R <-> R +toupper: S <-> S +toupper: T <-> T +toupper: U <-> U +toupper: V <-> V +toupper: W <-> W +toupper: X <-> X +toupper: Y <-> Y +toupper: Z <-> Z +toupper: [ <-> [ +toupper: \ <-> \ +toupper: ] <-> ] +toupper: ^ <-> ^ +toupper: _ <-> _ +toupper: ` <-> ` +toupper: a <-> A +toupper: b <-> B +toupper: c <-> C +toupper: d <-> D +toupper: e <-> E +toupper: f <-> F +toupper: g <-> G +toupper: h <-> H +toupper: i <-> I +toupper: j <-> J +toupper: k <-> K +toupper: l <-> L +toupper: m <-> M +toupper: n <-> N +toupper: o <-> O +toupper: p <-> P +toupper: q <-> Q +toupper: r <-> R +toupper: s <-> S +toupper: t <-> T +toupper: u <-> U +toupper: v <-> V +toupper: w <-> W +toupper: x <-> X +toupper: y <-> Y +toupper: z <-> Z +toupper: { <-> { +toupper: | <-> | +toupper: } <-> } +toupper: ~ <-> ~ +end: +*/ diff --git a/tests/libc/execute/0006-limits.c b/tests/libc/execute/0006-limits.c @@ -0,0 +1,183 @@ +#include <limits.h> +#include <stdio.h> + +/* + * This test assumes that CHAR_BIT is the size of every + * unit returned by sizeof. It also assumes 2 complement. + */ + +/* +output: +test1 +test2 +test3 +end: +*/ + +void +test1() +{ + puts("test1"); + + if (CHAR_BIT < 8 || + CHAR_MAX < 127 || CHAR_MIN > 0 || + CHAR_MAX != SCHAR_MAX && CHAR_MAX != UCHAR_MAX) + puts("wrong char definition"); + + if (SCHAR_MAX < 127 || CHAR_MIN > -127) + puts("wrong signed char definition"); + + if (UCHAR_MAX < 255 || UCHAR_MAX <= 0) + puts("wrong unsigned char definition"); + + if (SHRT_MAX < 32767 || + SHRT_MIN > -32767 || + USHRT_MAX < 65535 || USHRT_MAX <= 0) + puts("wrong short definition"); + + if (INT_MAX < 32767 || + INT_MIN > -32767 || + UINT_MAX < 65535 || UINT_MAX <= 0 || + INT_MAX < SCHAR_MAX || INT_MIN > SCHAR_MIN || + UINT_MAX < UCHAR_MAX || + INT_MAX < SHRT_MAX || INT_MIN > SHRT_MIN || + UINT_MAX < USHRT_MAX) + puts("wrong int definition"); + + if (LONG_MAX < 2147483647 || + LONG_MIN > -2147483647 || + ULONG_MAX < 4294967295 || ULONG_MAX <= 0 || + LONG_MAX < SCHAR_MAX || LONG_MIN > SCHAR_MIN || + ULONG_MAX < UCHAR_MAX || + LONG_MAX < SHRT_MAX || LONG_MIN > SHRT_MIN || + ULONG_MAX < USHRT_MAX || + LONG_MAX < INT_MAX || LONG_MIN > INT_MIN || + ULONG_MAX < UINT_MAX) + puts("wrong long definition"); + + if (LONG_MAX < 9223372036854775807 || + LONG_MIN > -9223372036854775807 || + ULONG_MAX < 18446744073709551615 || ULONG_MAX <= 0 || + LONG_MAX < SCHAR_MAX || LONG_MIN > SCHAR_MIN || + ULONG_MAX < UCHAR_MAX || + LONG_MAX < SHRT_MAX || LONG_MIN > SHRT_MIN || + ULONG_MAX < USHRT_MAX || + LONG_MAX < LONG_MAX || LONG_MIN > LONG_MIN || + ULONG_MAX < ULONG_MAX) + puts("wrong long definition"); + + if (LLONG_MAX < 9223372036854775807 || + LLONG_MIN > -9223372036854775807 || + ULLONG_MAX < 18446744073709551615 || ULLONG_MAX <= 0 || + LLONG_MAX < SCHAR_MAX || LLONG_MIN > SCHAR_MIN || + ULLONG_MAX < UCHAR_MAX || + LLONG_MAX < SHRT_MAX || LLONG_MIN > SHRT_MIN || + ULLONG_MAX < USHRT_MAX || + LLONG_MAX < LONG_MAX || LLONG_MIN > LONG_MIN || + ULLONG_MAX < ULONG_MAX) + puts("wrong long long definition"); + + if (MB_LEN_MAX < sizeof(char)) + puts("wrong value for MB_LEN_MAX"); +} + + +void +test2() +{ + char c; + int i; + + puts("test2"); + if ('\xff' > 0) { + for (c = i = 0; i < CHAR_BIT; i++) { + c <<= 1; + c |= 1; + } + if (c != CHAR_MAX) + printf("wrong char max %d-%d", c, CHAR_MAX); + if (CHAR_MIN != 0) + printf("wrong char min %d-%d", c, CHAR_MIN); + } else { + for (c = i = 0; i < CHAR_BIT -1; i++) { + c <<= 1; + c |= 1; + } + if (c != CHAR_MAX) + printf("wrong char max %d-%d", c, CHAR_MAX); + c = -c - 1; + if (c != CHAR_MIN) + printf("wrong char min %d-%d", c, CHAR_MIN); + } +} + +#define SMAX(t) for (t = n = 0; n < sizeof(t)*CHAR_BIT -1; n++) {t <<= 1; t |= 1;} +#define UMAX(t) for (t = n = 0; n < sizeof(t)*CHAR_BIT; n++) {t <<= 1; t |= 1;} + +void +test3() +{ + signed char sc; + unsigned char uc; + int i, n; + unsigned u; + long l; + unsigned long ul; + long long ll; + unsigned long long ull; + + puts("test3"); + SMAX(sc); + if (sc != SCHAR_MAX) + printf("wrong signed char max %d %d\n", sc, SCHAR_MAX); + sc = -sc - 1; + if (sc != SCHAR_MIN) + printf("wrong signed char min %d %d\n", sc, SCHAR_MIN); + + UMAX(uc); + if (uc != UCHAR_MAX) + printf("wrong unsigned char max %u %u", uc, UCHAR_MAX); + + SMAX(i); + if (i != INT_MAX) + printf("wrong int max %d %d\n", i, INT_MAX); + i = -i - 1; + if (i != INT_MIN) + printf("wrong int min %d %d\n", i, INT_MIN); + + UMAX(u); + if (u != UINT_MAX) + printf("wrong unsigned int max %u %u\n", u, UINT_MAX); + + SMAX(l); + if (l != LONG_MAX) + printf("wrong long max %ld %ld\n", l, (long) LONG_MAX); + l = -l - 1; + if (l != LONG_MIN) + printf("wrong long max %ld %ld\n", l, (long) LONG_MIN); + + UMAX(ul); + if (ul != ULONG_MAX) + printf("wrong int max %lu %lu\n", ul, (unsigned long) ULONG_MAX); + + SMAX(ll); + if (ll != LLONG_MAX) + printf("wrong llong max %lld %lld\n", ll, (long long) LLONG_MAX); + ll = -ll - 1; + if (ll != LLONG_MIN) + printf("wrong llong min %lld %lld\n", ll, (long long) LLONG_MIN); + + UMAX(ull); + if (ull != ULLONG_MAX) + printf("wrong ullong max %llu %llu\n", ull, (unsigned long long) ULLONG_MAX); +} + +int +main() +{ + test1(); + test2(); + test3(); + + return 0; +} diff --git a/tests/libc/execute/0007-signal.c b/tests/libc/execute/0007-signal.c @@ -0,0 +1,168 @@ +#include <assert.h> +#include <setjmp.h> +#include <signal.h> +#include <stdio.h> + +sig_atomic_t abrt, fpe, iint, segv, term, def; +jmp_buf recover; + +/* +output: +test 1 +test 2 +test 3 +test 4 +end: +*/ + +void +handler1(int sig) +{ + switch (sig) { + case SIGABRT: + abrt = 1; + break; + case SIGFPE: + fpe = 1; + break; + case SIGINT: + iint = 1; + break; + case SIGSEGV: + segv = 1; + break; + case SIGTERM: + term = 1; + break; + default: + def = 1; + break; + } +} + +void +handler2(int sig) +{ + switch (sig) { + case SIGABRT: + abrt = 1; + break; + case SIGFPE: + fpe = 1; + break; + case SIGINT: + iint = 1; + break; + case SIGSEGV: + segv = 1; + break; + case SIGTERM: + term = 1; + break; + default: + def = 1; + break; + } + longjmp(recover, 1); +} + +void +test1() +{ + puts("test 1"); + assert(signal(SIGABRT, handler1) == SIG_DFL); + assert(signal(SIGFPE, handler1) == SIG_DFL); + assert(signal(SIGINT, handler1) == SIG_DFL); + assert(signal(SIGSEGV, handler1) == SIG_DFL); + assert(signal(SIGTERM, handler1) == SIG_DFL); +} + +void +test2() +{ + puts("test 2"); + term = abrt = fpe = iint = segv = 0; + assert(signal(SIGABRT, handler1) == handler1); + assert(signal(SIGFPE, handler1) == handler1); + assert(signal(SIGINT, handler1) == handler1); + assert(signal(SIGSEGV, handler1) == handler1); + assert(signal(SIGTERM, handler1) == handler1); + + assert(raise(SIGABRT) != -1); + assert(raise(SIGFPE) != -1); + assert(raise(SIGINT) != -1); + assert(raise(SIGSEGV) != -1); + assert(raise(SIGTERM) != -1); + + if (!abrt || !fpe || !iint || !segv || !term) + printf("a handled signal was missed: %d %d %d %d %d\n", + abrt, fpe, iint, segv, term); + if (def) + puts("a wrong signal was received"); +} + +void +test3() +{ + puts("test 3"); + def = abrt = term = fpe = iint = segv = 0; + assert(signal(SIGABRT, SIG_IGN) == handler1); + assert(signal(SIGFPE, SIG_IGN) == handler1); + assert(signal(SIGINT, SIG_IGN) == handler1); + assert(signal(SIGSEGV, SIG_IGN) == handler1); + assert(signal(SIGTERM, SIG_IGN) == handler1); + + assert(raise(SIGABRT) != -1); + assert(raise(SIGFPE) != -1); + assert(raise(SIGINT) != -1); + assert(raise(SIGSEGV) != -1); + assert(raise(SIGTERM) != -1); + + if (abrt || fpe || iint || segv || term) + printf("a handled signal was received: %d %d %d %d %d\n", + abrt, fpe, iint, segv, term); + if (def) + puts("a wrong signal was received"); +} + +void +test4() +{ + puts("test 4"); + def = abrt = term = fpe = iint = segv = 0; + assert(signal(SIGABRT, handler2) == SIG_IGN); + assert(signal(SIGFPE, handler2) == SIG_IGN); + assert(signal(SIGINT, handler2) == SIG_IGN); + assert(signal(SIGSEGV, handler2) == SIG_IGN); + assert(signal(SIGTERM, handler2) == SIG_IGN); + + if (!setjmp(recover)) + assert(raise(SIGABRT) != -1); + if (!setjmp(recover)) + assert(raise(SIGFPE) != -1); + if (!setjmp(recover)) + assert(raise(SIGINT) != -1); + if (!setjmp(recover)) + assert(raise(SIGSEGV) != -1); + if (!setjmp(recover)) + assert(raise(SIGTERM) != -1); + + if (!abrt || !fpe || !iint || !segv || !term) + printf("a handled signal was missed: %d %d %d %d %d\n", + abrt, fpe, iint, segv, term); + if (def) + puts("a wrong signal was received"); +} + +int +main() +{ + assert(SIG_ERR != SIG_IGN && SIG_ERR != SIG_DFL); + + test1(); + test2(); + test3(); + test4(); + + return; +} diff --git a/tests/libc/execute/0008-longjmp.c b/tests/libc/execute/0008-longjmp.c @@ -0,0 +1,45 @@ +#include <setjmp.h> +#include <stdio.h> + +/* +output: +test 1 +i = 1, v = 2 +test 2 +i = 2, v = 3 +end: +*/ + +jmp_buf recover; + +void +test(char *s, int val) +{ + puts(s); + longjmp(recover, val); +} + +int +main() +{ + static int i; + auto volatile int v; + + i = 0; + v = 1; + if (!setjmp(recover)) { + i = 1; + v = 2; + test("test 1", 1); + } + printf("i = %d, v = %d\n", i, v); + + if (!setjmp(recover)) { + i = 2; + v = 3; + test("test 2", 0); + } + printf("i = %d, v = %d\n", i, v); + + return 0; +} diff --git a/tests/libc/execute/0009-stdarg.c b/tests/libc/execute/0009-stdarg.c @@ -0,0 +1,79 @@ +#include <assert.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> + +/* +output: +test 1 +test 2 +end: +*/ + +void +test(char *s, char *fmt, ...) +{ + va_list va; + int cnt = 1; + long long *p; + + puts(s); + + va_start(va, fmt); + while (*fmt) { + printf("fmt = '%c'\n", *fmt); + switch (*fmt++) { + case 'c': + assert(va_arg(va, int) == cnt++); + break; + case 's': + assert(va_arg(va, int) == cnt++); + break; + case 'i': + assert(va_arg(va, int) == cnt++); + break; + case 'l': + assert(va_arg(va, long) == cnt++); + break; + case 'q': + assert(va_arg(va, long long) == cnt++); + break; + case 'p': + p = va_arg(va, void *); + assert(*p == cnt++); + break; + case 'f': + assert(va_arg(va, double) == cnt++); + break; + default: + abort(); + } + } + va_end(va); +} + +int +main() +{ + char c; + short s; + int i; + long l; + long long ll; + float f; + + c = 1; + i = 2; + l = 3; + ll = 4; + test("test 1", "cilp", c, i, l, (void *) &ll); + + + c = 1; + s = 2; + ll = 3; + f = 4.0; + test("test 2", "csqf", c, s, ll, f); + + return 0; +} diff --git a/tests/libc/execute/0010-stddef.c b/tests/libc/execute/0010-stddef.c @@ -0,0 +1,43 @@ +#include <assert.h> +#include <stddef.h> +#include <stdio.h> + +/* +output: +NULL = 0 +end: +*/ + +typedef struct test Test; + +struct test { + int a, b, c; + char d; +} test = { + .a = 1, + .b = 2, + .c = 3, + .d = 4, +}; + +int +main() +{ + wchar_t wc = L'c'; + char *q, *p = (char *) &test; + + printf("NULL = %p\n", NULL); + + p += offsetof(Test, d); + + assert(sizeof(size_t) == sizeof(ptrdiff_t)); + assert(wc == L'c'); + assert(*p == 4); + assert(offsetof(Test, d) > offsetof(Test, a)); + assert(offsetof(Test, d) > offsetof(Test, b)); + assert(offsetof(Test, d) > offsetof(Test, c)); + assert(sizeof(sizeof(int)) == sizeof(size_t)); + assert(sizeof(p - q) == sizeof(ptrdiff_t)); + + return 0; +} diff --git a/tests/libc/execute/Makefile b/tests/libc/execute/Makefile @@ -0,0 +1,13 @@ +.POSIX: + +ROOT = ../../../rootdir +CFLAGS = +CC = SCCPREFIX=$(ROOT) ./cc.sh + +all: tests + +tests: + @CFLAGS='' SCCPREFIX=$(ROOT) ./chktest.sh libc-tests.lst + +clean: + rm -f *.o *core a.out test.log diff --git a/tests/libc/execute/cc.sh b/tests/libc/execute/cc.sh @@ -0,0 +1,50 @@ +#!/bin/sh + +set -e + +for i +do + case "$i" in + -r) + root=$2 + shift 2 + ;; + -a) + abi=$2 + shift 2 + ;; + -s) + sys=$2 + shift 2 + ;; + -o) + out=$2 + shift 2 + ;; + -*) + echo usage: cc.sh [-t target] file + exit 1 + ;; + esac +done + +sys=${sys:-`uname | tr 'A-Z' 'a-z'`} +abi=${abi:-amd64-sysv} +out=${out:-a.out} +root=${root:-$SCCPREFIX} +inc=$root/include/scc +arch_inc=$root/include/scc/bits/$abi +sys_inc=$root/include/scc/bits/$sys +lib=$root/lib/scc/${abi}-${sys} +obj=${1%.c}.o + +includes="-nostdinc -I$inc -I$arch_inc -I$sys_inc" +flags="-std=c99 -g -w -fno-stack-protector --freestanding -static" + +if ! gcc -nopie 2>&1 | grep unrecogn >/dev/null +then + pie=-nopie +fi + +gcc $flags $pie $includes -c $1 +ld -g $pie -z nodefaultlib -static -L$lib $lib/crt.o $obj -lc -o $out diff --git a/tests/libc/execute/chktest.sh b/tests/libc/execute/chktest.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +file=${1?' empty input file'} +tmp1=`mktemp` +tmp2=`mktemp` +trap "rm -f a.out *.o $tmp1 $tmp2; exit" 0 1 2 3 15 +ulimit -c 0 +rm -f test.log + +while read i state +do + rm -f a.out *.o $tmp1 $tmp2 + + (echo $i + ./cc.sh $CFLAGS $i.c + echo '/^output:$/+;/^end:$/-'w $tmp1 | ed -s $i.c + ./a.out > $tmp2 + diff -u $tmp1 $tmp2) >> test.log 2>&1 && + printf '[PASS]' || printf '[FAIL]' + printf '%s: %s\n' "$state" "$i" +done < $file diff --git a/tests/libc/execute/libc-tests.lst b/tests/libc/execute/libc-tests.lst @@ -0,0 +1,10 @@ +0001-abort +0002-assert +0003-assert +0004-abort +0005-ctype +0006-limits +0007-signal +0008-longjmp +0009-stdarg [TODO] +0010-stddef diff --git a/tests/nm/Makefile b/tests/nm/Makefile @@ -1,9 +0,0 @@ -.POSIX: - -PROJECTDIR = ../.. -include $(PROJECTDIR)/rules.mk - -DIRS=execute - -all clean: - $(FORALL) diff --git a/tests/nm/execute/0001-z80.sh b/tests/nm/execute/0001-z80.sh @@ -4,7 +4,7 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f $tmp1 $tmp2" 0 2 3 +trap "rm -f $tmp1 $tmp2; exit" 0 2 3 nm z80.out > $tmp1 diff --git a/tests/nm/execute/0002-z80-u.sh b/tests/nm/execute/0002-z80-u.sh @@ -4,7 +4,7 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f $tmp1 $tmp2" 0 2 3 +trap "rm -f $tmp1 $tmp2; exit" 0 2 3 nm -u z80.out > $tmp1 diff --git a/tests/nm/execute/0003-z80-g.sh b/tests/nm/execute/0003-z80-g.sh @@ -4,7 +4,7 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f $tmp1 $tmp2" 0 2 3 +trap "rm -f $tmp1 $tmp2; exit" 0 2 3 nm -g z80.out > $tmp1 diff --git a/tests/nm/execute/0004-z80-v.sh b/tests/nm/execute/0004-z80-v.sh @@ -4,7 +4,7 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f $tmp1 $tmp2" 0 2 3 +trap "rm -f $tmp1 $tmp2; exit" 0 2 3 nm -v z80.out > $tmp1 diff --git a/tests/nm/execute/0005-z80-A.sh b/tests/nm/execute/0005-z80-A.sh @@ -4,7 +4,7 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f f.out f.a $tmp1 $tmp2" 0 2 3 +trap "rm -f f.out f.a $tmp1 $tmp2; exit" 0 2 3 rm -f f.a ar -qv f.a z80.out diff --git a/tests/nm/execute/0006-z80-o.sh b/tests/nm/execute/0006-z80-o.sh @@ -4,7 +4,7 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f $tmp1 $tmp2" 0 2 3 +trap "rm -f $tmp1 $tmp2; exit" 0 2 3 nm -t o z80.out > $tmp1 diff --git a/tests/nm/execute/0007-z80-d.sh b/tests/nm/execute/0007-z80-d.sh @@ -4,7 +4,7 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f $tmp1 $tmp2" 0 2 3 +trap "rm -f $tmp1 $tmp2; exit" 0 2 3 nm -t d z80.out > $tmp1 diff --git a/tests/nm/execute/0008-z80-x.sh b/tests/nm/execute/0008-z80-x.sh @@ -4,7 +4,7 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f $tmp1 $tmp2" 0 2 3 +trap "rm -f $tmp1 $tmp2; exit" 0 2 3 nm -t x z80.out > $tmp1 diff --git a/tests/nm/execute/0009-z80-P-o.sh b/tests/nm/execute/0009-z80-P-o.sh @@ -4,7 +4,7 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f $tmp1 $tmp2" 0 2 3 +trap "rm -f $tmp1 $tmp2; exit" 0 2 3 nm -P -t o z80.out > $tmp1 diff --git a/tests/nm/execute/0010-z80-P-d.sh b/tests/nm/execute/0010-z80-P-d.sh @@ -4,7 +4,7 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f $tmp1 $tmp2" 0 2 3 +trap "rm -f $tmp1 $tmp2; exit" 0 2 3 nm -P -t x z80.out > $tmp1 diff --git a/tests/nm/execute/0011-z80-P-x.sh b/tests/nm/execute/0011-z80-P-x.sh @@ -4,7 +4,7 @@ set -e tmp1=`mktemp` tmp2=`mktemp` -trap "rm -f $tmp1 $tmp2" 0 2 3 +trap "rm -f $tmp1 $tmp2; exit" 0 2 3 nm -P -t x z80.out > $tmp1 diff --git a/tests/nm/execute/Makefile b/tests/nm/execute/Makefile @@ -1,14 +1,13 @@ .POSIX: -PROJECTDIR=$$PWD/../../.. -ROOTDIR=$(PROJECTDIR)/rootdir +ROOT=$(PROJECTDIR)/rootdir OUT = z80.out all: tests tests: $(OUT) - @PATH=$(ROOTDIR)/bin:$$PATH ./chktest.sh + @PATH=$(ROOT)/bin:$$PATH ./chktest.sh z80.out: master.s z80-unknown-coff-as -o $@ master.s diff --git a/tests/nm/execute/chktest.sh b/tests/nm/execute/chktest.sh @@ -1,16 +1,12 @@ -#!/bin//sh +#!/bin/sh -ttyflags=`stty -g` -trap "stty $ttyflags;tabs -8; rm -f a.out" 0 2 3 15 -stty tabs -tabs 40 +trap "rm -f a.out; exit" 0 2 3 15 ulimit -c 0 rm -f test.log - for i in *-*.sh do printf "Test: %s\n\n" $i >> test.log - printf "%s\t" $i - ./$i >> test.log 2>&1 && echo [OK] || echo [FAIL] + ./$i >> test.log 2>&1 && printf '[PASS]: ' || printf '[FAIL]: ' + echo "$i" done diff --git a/tests/scc/Makefile b/tests/scc/Makefile @@ -1,7 +0,0 @@ -.POSIX: -include ../../config.mk - -DIRS=error execute - -all clean: - $(FORALL) diff --git a/tests/scc/error/Makefile b/tests/scc/error/Makefile @@ -1,10 +1,11 @@ .POSIX: +ROOT=../../../rootdir + all: tests tests: - CFLAGS='' SCCEXECPATH=../../bin PATH=../../bin:$$PATH ./chktest.sh < scc-tests.lst + @CFLAGS='' SCCPREFIX=$(ROOT) PATH=$(ROOT)/bin:$$PATH ./chktest.sh scc-tests.lst clean: rm -f *.as *.o *.ir *.qbe *core test.log - diff --git a/tests/scc/error/chktest.sh b/tests/scc/error/chktest.sh @@ -1,20 +1,20 @@ #!/bin/sh +file=${1?' empty input file'} err=/tmp/$$.err chk=/tmp/$$.chk -trap "tabs -8;rm -f a.out *.o $chk $err" 0 1 2 3 15 -tabs 40 +trap "rm -f a.out *.o $chk $err; exit" 0 1 2 3 15 ulimit -c 0 rm -f test.log while read i state do echo $i >> test.log - printf "%s\t%s" $i $state scc $CFLAGS -w -c $i 2> $err echo "/^PATTERN/+;/^\./-w $chk" | ed -s $i - diff -c $chk $err >> test.log && echo [OK] || echo [FAILED] + diff -c $chk $err >> test.log && printf '[PASS]' || echo '[FAIL]' + printf "%s: %s\n" "$state" "$i" rm -f *.o -done +done < $file diff --git a/tests/scc/execute/0137-int-cast.c b/tests/scc/execute/0137-int-cast.c @@ -1,137 +1,3 @@ -/* -name: TEST013 -description: Basic test of integer types and integer conversions -comments: This test depends of the configuration in the type system. - With the current configuration char is equal to unsigned char, - short is equal to int, and unsigned short is equal to unsigned. -error: -output: -G1 I "a -G2 N "b -G3 K "c -G4 C "d -G5 K "e -G6 W "f -G7 Z "g -G8 Q "h -G9 O "i -G10 I "j -G11 N "k -G13 I F "main -{ -\ - G1 G2 gI :I - G1 G3 gI :I - G1 G4 gI :I - G1 G5 gI :I - G1 G6 gI :I - G1 G7 gI :I - G1 G8 gI :I - G1 G9 gI :I - G1 G10 :I - G1 G11 gI :I - G2 G1 gN :N - G2 G3 gN :N - G2 G4 gN :N - G2 G5 gN :N - G2 G6 gN :N - G2 G7 gN :N - G2 G8 gN :N - G2 G9 gN :N - G2 G10 gN :N - G2 G11 :N - G3 G1 gK :K - G3 G2 gK :K - G3 G4 gK :K - G3 G5 :K - G3 G6 gK :K - G3 G7 gK :K - G3 G8 gK :K - G3 G9 gK :K - G3 G10 gK :K - G3 G11 gK :K - G4 G1 gC :C - G4 G2 gC :C - G4 G3 gC :C - G4 G5 gC :C - G4 G6 gC :C - G4 G7 gC :C - G4 G8 gC :C - G4 G9 gC :C - G4 G10 gC :C - G4 G11 gC :C - G5 G1 gK :K - G5 G2 gK :K - G5 G3 :K - G5 G4 gK :K - G5 G6 gK :K - G5 G7 gK :K - G5 G8 gK :K - G5 G9 gK :K - G5 G10 gK :K - G5 G11 gK :K - G6 G1 gW :W - G6 G2 gW :W - G6 G3 gW :W - G6 G4 gW :W - G6 G5 gW :W - G6 G7 gW :W - G6 G8 gW :W - G6 G9 gW :W - G6 G10 gW :W - G6 G11 gW :W - G7 G1 gZ :Z - G7 G2 gZ :Z - G7 G3 gZ :Z - G7 G4 gZ :Z - G7 G5 gZ :Z - G7 G6 gZ :Z - G7 G8 gZ :Z - G7 G9 gZ :Z - G7 G10 gZ :Z - G7 G11 gZ :Z - G8 G1 gQ :Q - G8 G2 gQ :Q - G8 G3 gQ :Q - G8 G4 gQ :Q - G8 G5 gQ :Q - G8 G6 gQ :Q - G8 G7 gQ :Q - G8 G9 gQ :Q - G8 G10 gQ :Q - G8 G11 gQ :Q - G9 G1 gO :O - G9 G2 gO :O - G9 G3 gO :O - G9 G4 gO :O - G9 G5 gO :O - G9 G6 gO :O - G9 G7 gO :O - G9 G8 gO :O - G9 G10 gO :O - G9 G11 gO :O - G10 G1 :I - G10 G2 gI :I - G10 G3 gI :I - G10 G4 gI :I - G10 G5 gI :I - G10 G6 gI :I - G10 G7 gI :I - G10 G8 gI :I - G10 G9 gI :I - G10 G11 gI :I - G11 G1 gN :N - G11 G2 :N - G11 G3 gN :N - G11 G4 gN :N - G11 G5 gN :N - G11 G6 gN :N - G11 G7 gN :N - G11 G8 gN :N - G11 G10 gN :N - G11 G9 gN :N -} -*/ int a; unsigned b; diff --git a/tests/scc/execute/0141-int-iden.c b/tests/scc/execute/0141-int-iden.c @@ -28,10 +28,18 @@ main(void) i = i * 1; i = 1 * i; i = i / 1; - i = 1 / i; + + if (i) + i = 1 / i; + i = i & ~0; i = ~0 & i; i = i % 1; - i = i / 0; - i = i % 0; + + if (0) + i = i / 0; + if (0) + i = i % 0; + + return 0; } diff --git a/tests/scc/execute/0154-if-defined b/tests/scc/execute/0154-if-defined @@ -1,15 +0,0 @@ -#if defined(FOO) -int a; -#elif !defined(FOO) && defined(BAR) -int b; -#elif !defined(FOO) && !defined(BAR) -int c; -#else -int d; -#endif - -int -main(void) -{ - return c; -} diff --git a/tests/scc/execute/0154-if-defined.c b/tests/scc/execute/0154-if-defined.c @@ -0,0 +1,15 @@ +#if defined(FOO) +int a; +#elif !defined(FOO) && defined(BAR) +int b; +#elif !defined(FOO) && !defined(BAR) +int c; +#else +int d; +#endif + +int +main(void) +{ + return c; +} diff --git a/tests/scc/execute/0172-hexa.c b/tests/scc/execute/0172-hexa.c @@ -1,10 +1,13 @@ int main(void) { - return 0xa == 0xA && - 0xb == 0xB && - 0xc == 0xC && - 0xd == 0xD && - 0xe == 0xE && - 0xf == 0xF; + if (0xa != 0xA || + 0xb != 0xB || + 0xc != 0xC || + 0xd != 0xD || + 0xe != 0xE || + 0xf != 0xF) { + return 1; + } + return 0; } diff --git a/tests/scc/execute/0179-sizeof.c b/tests/scc/execute/0179-sizeof.c @@ -0,0 +1,7 @@ + +int +main(void) +{ + sizeof((int) 1); + return 0; +} diff --git a/tests/scc/execute/0180-incomplete.c b/tests/scc/execute/0180-incomplete.c @@ -0,0 +1,14 @@ + +struct dummy; + +void * +fun(struct dummy p[]) +{ + return p; +} + +int +main() +{ + return fun(0) != 0; +} diff --git a/tests/scc/execute/0181-stringize.c b/tests/scc/execute/0181-stringize.c @@ -0,0 +1,17 @@ + +#define XSTR(x) #x +#define STR(x) XSTR(x) +#define S y = "str" + +int +main() +{ + char *s, *t = STR(S); + + for (s = "y = \"str\""; *s && *t; ++s, ++t) { + if (*s != *t) + return 1; + } + + return 0; +} diff --git a/tests/scc/execute/Makefile b/tests/scc/execute/Makefile @@ -1,9 +1,11 @@ .POSIX: +ROOT=../../../rootdir + all: tests tests: - CFLAGS='' SCCPREFIX=../../rootdir/ PATH=../../rootdir/bin:$$PATH ./chktest.sh scc-tests.lst + @CFLAGS='' SCCPREFIX=$(ROOT) PATH=$(ROOT)/bin:$$PATH ./chktest.sh scc-tests.lst clean: rm -f *.as *.o *.ir *.qbe *core test.log diff --git a/tests/scc/execute/chktest.sh b/tests/scc/execute/chktest.sh @@ -1,20 +1,23 @@ #!/bin/sh file=${1?' empty input file'} -ttyflags=`stty -g` -trap "stty $ttyflags;tabs -8;rm -f a.out" 0 1 2 3 15 -stty tabs -tabs 40 +trap "rm -f a.out; exit" 0 1 2 3 15 ulimit -c 0 rm -f test.log -cat $file | +SYS=`uname | tr A-Z a-z` +FORMAT=elf +ABI=sysv +ARCH=amd64 + +export SYS FORMAT ABI ARCH + while read i state do echo $i >>test.log - printf "%s\t" $i - printf "%s" $state rm -f a.out - (scc -Isysinclude $CFLAGS "$i" && ./a.out) 2>test.log && - echo "[OK]" || echo "[FAILED]" -done + + (scc -Isysinclude $CFLAGS "$i" && ./a.out) 2>>test.log && + printf '[PASS]' || printf '[FAIL]' + printf '%s: %s\n' "$state" "$i" +done < $file diff --git a/tests/scc/execute/scc-tests.lst b/tests/scc/execute/scc-tests.lst @@ -125,24 +125,24 @@ 0132-forward.c [TODO] 0133-ftn-ptr.c [TODO] 0134-arith.c [TODO] -0135-unary.c [TODO] -0136-if.c [TODO] +0135-unary.c +0136-if.c 0137-int-cast.c [TODO] -0138-namespace.c [TODO] +0138-namespace.c 0139-ptr-ary.c [TODO] 0140-int-fold.c [TODO] 0141-int-iden.c [TODO] 0142-char-const.c [TODO] -0143-int-const.c [TODO] -0144-long-const.c [TODO] +0143-int-const.c +0144-long-const.c 0145-llong-const.c [TODO] -0146-ifdef.c [TODO] -0147-intern-cpp.c [TODO] -0148-cpp-string.c [TODO] -0149-define.c [TODO] -0150-define.c [TODO] +0146-ifdef.c +0147-intern-cpp.c +0148-cpp-string.c +0149-define.c +0150-define.c 0151-vararg.c [TODO] -0152-cat.c [TODO] +0152-cat.c 0153-cpp-string.c [TODO] 0154-if-defined [TODO] 0155-struct-compl.c [TODO] @@ -152,7 +152,7 @@ 0159-typedef.c [TODO] 0160-cpp-if.c [TODO] 0161-struct.c [TODO] -0162-array.c [TODO] +0162-array.c 0163-array.c [TODO] 0164-struct.c [TODO] 0165-struct.c [TODO] @@ -162,10 +162,13 @@ 0169-string.c [TODO] 0170-line.c [TODO] 0171-macros.c [TODO] -0172-hexa.c [TODO] -0173-macro.c [TODO] +0172-hexa.c +0173-macro.c 0174-decay.c [TODO] -0175-defined.c [TODO] +0175-defined.c 0176-macro.c [TODO] 0177-literal.c [TODO] 0178-include.c [TODO] +0179-sizeof.c [TODO] +0180-incomplete.c +0181-stringize.c [TODO]