mirror of
https://github.com/cc65/cc65.git
synced 2024-06-12 12:29:32 +00:00
Merge pull request #1679 from spiro-trikaliotis/testsuite-ca65
Reorganized test/asm
This commit is contained in:
commit
fffb4c3b40
|
@ -1,77 +1,34 @@
|
||||||
# Makefile for the assembler regression tests
|
# top-level Makefile for the regression tests
|
||||||
|
|
||||||
ifneq ($(shell echo),)
|
ifneq ($(shell echo),)
|
||||||
CMD_EXE = 1
|
CMD_EXE = 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CMD_EXE
|
ifdef CMD_EXE
|
||||||
EXE = .exe
|
RMDIR = -rmdir /s /q $(subst /,\,$1)
|
||||||
MKDIR = mkdir $(subst /,\,$1)
|
|
||||||
RMDIR = -rmdir /q /s $(subst /,\,$1)
|
|
||||||
else
|
else
|
||||||
EXE =
|
|
||||||
MKDIR = mkdir -p $1
|
|
||||||
RMDIR = $(RM) -r $1
|
RMDIR = $(RM) -r $1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef QUIET
|
WORKDIR = ../testwrk/asm
|
||||||
.SILENT:
|
|
||||||
endif
|
|
||||||
|
|
||||||
CA65 := $(if $(wildcard ../../bin/ca65*),../../bin/ca65,ca65)
|
SUBDIRS = cpudetect opcodes listing
|
||||||
LD65 := $(if $(wildcard ../../bin/ld65*),../../bin/ld65,ld65)
|
|
||||||
|
|
||||||
WORKDIR = ../../testwrk/asm
|
.PHONY: all continue mostlyclean clean
|
||||||
|
|
||||||
ISEQUAL = ../../testwrk/isequal$(EXE)
|
all: mostlyclean continue
|
||||||
|
|
||||||
CC = gcc
|
define CALL_template
|
||||||
CFLAGS = -O2
|
|
||||||
|
|
||||||
.PHONY: all clean
|
continue::
|
||||||
|
@$(MAKE) -C $1 all
|
||||||
|
|
||||||
OPCODE_REFS := $(wildcard *-opcodes.ref)
|
mostlyclean::
|
||||||
OPCODE_BINS = $(OPCODE_REFS:%.ref=$(WORKDIR)/%.bin)
|
@$(MAKE) -C $1 clean
|
||||||
OPCODE_CPUS = $(OPCODE_REFS:%-opcodes.ref=%)
|
|
||||||
|
|
||||||
CPUDETECT_REFS := $(wildcard *-cpudetect.ref)
|
endef
|
||||||
CPUDETECT_BINS = $(CPUDETECT_REFS:%.ref=$(WORKDIR)/%.bin)
|
|
||||||
CPUDETECT_CPUS = $(CPUDETECT_REFS:%-cpudetect.ref=%)
|
|
||||||
|
|
||||||
all: $(OPCODE_BINS) $(CPUDETECT_BINS) $(WORKDIR)/paramcount.o
|
$(foreach subdir,$(SUBDIRS),$(eval $(call CALL_template,$(subdir))))
|
||||||
|
|
||||||
$(WORKDIR):
|
clean: mostlyclean
|
||||||
$(call MKDIR,$(WORKDIR))
|
|
||||||
|
|
||||||
$(ISEQUAL): ../isequal.c | $(WORKDIR)
|
|
||||||
$(CC) $(CFLAGS) -o $@ $<
|
|
||||||
|
|
||||||
define OPCODE_template
|
|
||||||
|
|
||||||
$(WORKDIR)/$1-opcodes.bin: $1-opcodes.s $(ISEQUAL)
|
|
||||||
$(if $(QUIET),echo asm/$1-opcodes.bin)
|
|
||||||
$(CA65) -t none --cpu $1 -l $$(@:.bin=.lst) -o $$(@:.bin=.o) $$<
|
|
||||||
$(LD65) -t none -o $$@ $$(@:.bin=.o) none.lib
|
|
||||||
$(ISEQUAL) $1-opcodes.ref $$@
|
|
||||||
|
|
||||||
endef # OPCODE_template
|
|
||||||
|
|
||||||
$(foreach cpu,$(OPCODE_CPUS),$(eval $(call OPCODE_template,$(cpu))))
|
|
||||||
|
|
||||||
define CPUDETECT_template
|
|
||||||
|
|
||||||
$(WORKDIR)/$1-cpudetect.bin: cpudetect.s $1-cpudetect.ref $(ISEQUAL)
|
|
||||||
$(if $(QUIET),echo asm/$1-cpudetect.bin)
|
|
||||||
$(CA65) -t none --cpu $1 -l $$(@:.bin=.lst) -o $$(@:.bin=.o) $$<
|
|
||||||
$(LD65) -t none -o $$@ $$(@:.bin=.o) none.lib
|
|
||||||
$(ISEQUAL) $1-cpudetect.ref $$@
|
|
||||||
|
|
||||||
endef # CPUDETECT_template
|
|
||||||
|
|
||||||
$(foreach cpu,$(CPUDETECT_CPUS),$(eval $(call CPUDETECT_template,$(cpu))))
|
|
||||||
|
|
||||||
$(WORKDIR)/%.o: %.s | $(WORKDIR)
|
|
||||||
$(CA65) -l $(@:.o=.lst) -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@$(call RMDIR,$(WORKDIR))
|
@$(call RMDIR,$(WORKDIR))
|
||||||
|
|
61
test/asm/cpudetect/Makefile
Normal file
61
test/asm/cpudetect/Makefile
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
# Makefile for the assembler regression tests
|
||||||
|
|
||||||
|
ifneq ($(shell echo),)
|
||||||
|
CMD_EXE = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef CMD_EXE
|
||||||
|
EXE = .exe
|
||||||
|
MKDIR = mkdir $(subst /,\,$1)
|
||||||
|
RMDIR = -rmdir /q /s $(subst /,\,$1)
|
||||||
|
else
|
||||||
|
EXE =
|
||||||
|
MKDIR = mkdir -p $1
|
||||||
|
RMDIR = $(RM) -r $1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef QUIET
|
||||||
|
.SILENT:
|
||||||
|
endif
|
||||||
|
|
||||||
|
CA65 := $(if $(wildcard ../../../bin/ca65*),../../../bin/ca65,ca65)
|
||||||
|
LD65 := $(if $(wildcard ../../../bin/ld65*),../../../bin/ld65,ld65)
|
||||||
|
|
||||||
|
WORKDIR = ../../../testwrk/asm/cpudetect
|
||||||
|
|
||||||
|
ISEQUAL = ../../../testwrk/isequal$(EXE)
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -O2
|
||||||
|
|
||||||
|
.PHONY: all clean
|
||||||
|
|
||||||
|
CPUDETECT_REFS := $(wildcard *-cpudetect.ref)
|
||||||
|
CPUDETECT_BINS = $(CPUDETECT_REFS:%.ref=$(WORKDIR)/%.bin)
|
||||||
|
CPUDETECT_CPUS = $(CPUDETECT_REFS:%-cpudetect.ref=%)
|
||||||
|
|
||||||
|
all: $(CPUDETECT_BINS)
|
||||||
|
|
||||||
|
$(WORKDIR):
|
||||||
|
$(call MKDIR,$(WORKDIR))
|
||||||
|
|
||||||
|
$(ISEQUAL): ../../isequal.c | $(WORKDIR)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
define CPUDETECT_template
|
||||||
|
|
||||||
|
$(WORKDIR)/$1-cpudetect.bin: cpudetect.s $1-cpudetect.ref $(ISEQUAL)
|
||||||
|
$(if $(QUIET),echo asm/$1-cpudetect.bin)
|
||||||
|
$(CA65) -t none --cpu $1 -l $$(@:.bin=.lst) -o $$(@:.bin=.o) $$<
|
||||||
|
$(LD65) -t none -o $$@ $$(@:.bin=.o) none.lib
|
||||||
|
$(ISEQUAL) $1-cpudetect.ref $$@
|
||||||
|
|
||||||
|
endef # CPUDETECT_template
|
||||||
|
|
||||||
|
$(foreach cpu,$(CPUDETECT_CPUS),$(eval $(call CPUDETECT_template,$(cpu))))
|
||||||
|
|
||||||
|
$(WORKDIR)/%.o: %.s | $(WORKDIR)
|
||||||
|
$(CA65) -l $(@:.o=.lst) -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@$(call RMDIR,$(WORKDIR))
|
15
test/asm/cpudetect/readme.txt
Normal file
15
test/asm/cpudetect/readme.txt
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
CPU Detect Tests
|
||||||
|
----------------
|
||||||
|
|
||||||
|
These tests all assemble the same file "cpudetect.s" which contains several
|
||||||
|
conditionals for several CPUs, only using every option known to the "--cpu"
|
||||||
|
command-line switch of ca65/cl65.
|
||||||
|
|
||||||
|
Reference (".ref") Files
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Some hints about creating new files:
|
||||||
|
Make an empty file with the CPU's name prepended to "-cpudetect.ref". Run the
|
||||||
|
tests; one of them will fail due to a mismatch. Review the output of the
|
||||||
|
".lst" file pedantically, then copy the ".bin" over the empty ".ref" file.
|
||||||
|
|
89
test/asm/listing/Makefile
Normal file
89
test/asm/listing/Makefile
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
# Makefile for the assembler regression tests
|
||||||
|
|
||||||
|
ifneq ($(shell echo),)
|
||||||
|
CMD_EXE = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef CMD_EXE
|
||||||
|
EXE = .exe
|
||||||
|
MKDIR = mkdir $(subst /,\,$1)
|
||||||
|
RMDIR = -rmdir /q /s $(subst /,\,$1)
|
||||||
|
else
|
||||||
|
EXE =
|
||||||
|
MKDIR = mkdir -p $1
|
||||||
|
RMDIR = $(RM) -r $1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef QUIET
|
||||||
|
.SILENT:
|
||||||
|
endif
|
||||||
|
|
||||||
|
CA65 := $(if $(wildcard ../../../bin/ca65*),../../../bin/ca65,ca65)
|
||||||
|
LD65 := $(if $(wildcard ../../../bin/ld65*),../../../bin/ld65,ld65)
|
||||||
|
|
||||||
|
WORKDIR = ../../../testwrk/asm/listing
|
||||||
|
|
||||||
|
ISEQUAL = ../../../testwrk/isequal$(EXE)
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -O2
|
||||||
|
|
||||||
|
.PHONY: all clean
|
||||||
|
|
||||||
|
LISTING_SRC := $(wildcard *.s)
|
||||||
|
LISTING_TESTS = $(LISTING_SRC:%.s=%)
|
||||||
|
LISTING_BINS = $(LISTING_SRC:%.s=$(WORKDIR)/%.bin)
|
||||||
|
|
||||||
|
all: $(LISTING_BINS)
|
||||||
|
|
||||||
|
$(WORKDIR):
|
||||||
|
$(call MKDIR,$(WORKDIR))
|
||||||
|
|
||||||
|
$(ISEQUAL): ../../isequal.c | $(WORKDIR)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
|
||||||
|
define LISTING_template
|
||||||
|
|
||||||
|
$(WORKDIR)/$1.bin: $1.s $(ISEQUAL)
|
||||||
|
$(if $(QUIET),echo asm/$1.bin)
|
||||||
|
|
||||||
|
# compile without generating listing
|
||||||
|
$(CA65) -t none -o $$(@:.bin=.o) $$<
|
||||||
|
$(LD65) -t none -o $$@ $$(@:.bin=.o) none.lib
|
||||||
|
|
||||||
|
ifneq ($(wildcard $1.bin-ref),)
|
||||||
|
$(ISEQUAL) $1.bin-ref $$@
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(CA65) -t none -l $$(@:.bin=.list.orig) -o $$(@:.bin=.list-o) $$<
|
||||||
|
$(LD65) -t none -o $$(@:.bin=.list-bin) $$(@:.bin=.list-o) none.lib
|
||||||
|
|
||||||
|
# check if the result bin is the same as without listing file
|
||||||
|
$(ISEQUAL) $$@ $$(@:.bin=.list-bin)
|
||||||
|
|
||||||
|
ifneq ($(wildcard $1.list-ref),)
|
||||||
|
# we have a reference file, compare that, too
|
||||||
|
|
||||||
|
# remove first line which contains a version number
|
||||||
|
tail -n +2 $$(@:.bin=.lst.orig) > $$(@:.bin=.lst)
|
||||||
|
$(ISEQUAL) $1.list-ref $$(@:.bin=.lst)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# $(CA65) -t none -f -l $$(@:.bin=.flist.orig) -o $$(@:.bin=.flist-o) $$<
|
||||||
|
# $(LD65) -t none -o $$(@:.bin=.flist-bin) $$(@:.bin=.flist-o) none.lib
|
||||||
|
|
||||||
|
# # check if the result bin is the same as without listing file
|
||||||
|
# $(ISEQUAL) $$@ $$(@:.bin=.flist-bin)
|
||||||
|
|
||||||
|
endef # LISTING_template
|
||||||
|
|
||||||
|
|
||||||
|
$(foreach listing,$(LISTING_TESTS),$(eval $(call LISTING_template,$(listing))))
|
||||||
|
|
||||||
|
|
||||||
|
$(WORKDIR)/%.o: %.s | $(WORKDIR)
|
||||||
|
$(CA65) -l $(@:.o=.lst) -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@$(call RMDIR,$(WORKDIR))
|
27
test/asm/listing/readme.txt
Normal file
27
test/asm/listing/readme.txt
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
Overall test:
|
||||||
|
-------------
|
||||||
|
|
||||||
|
These testcases can be used to test different aspects of the assembler.
|
||||||
|
The name of a test is everything in the form <test>.s.
|
||||||
|
|
||||||
|
The following reference files can be added:
|
||||||
|
|
||||||
|
- <test>.bin-ref:
|
||||||
|
This is a reference for the resulting binary.
|
||||||
|
The binary as binary tested against this file.
|
||||||
|
If they are not equal, the test fails.
|
||||||
|
|
||||||
|
- <test>.list-ref
|
||||||
|
This is a reference for the resulting listing output
|
||||||
|
This file *must* have the first line of the listing removed, as that
|
||||||
|
contains a ca65 version string, and almost always this will be changed!
|
||||||
|
|
||||||
|
|
||||||
|
Note that the resulting .bin file is generated twice: Once with no listing
|
||||||
|
file, and once with listing file. This way, one can find out if the listing
|
||||||
|
file generation changes anything with the resulting binary output.
|
||||||
|
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
- add the possibility to test for specific error output that are to be
|
||||||
|
expected
|
61
test/asm/opcodes/Makefile
Normal file
61
test/asm/opcodes/Makefile
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
# Makefile for the assembler regression tests
|
||||||
|
|
||||||
|
ifneq ($(shell echo),)
|
||||||
|
CMD_EXE = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef CMD_EXE
|
||||||
|
EXE = .exe
|
||||||
|
MKDIR = mkdir $(subst /,\,$1)
|
||||||
|
RMDIR = -rmdir /q /s $(subst /,\,$1)
|
||||||
|
else
|
||||||
|
EXE =
|
||||||
|
MKDIR = mkdir -p $1
|
||||||
|
RMDIR = $(RM) -r $1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef QUIET
|
||||||
|
.SILENT:
|
||||||
|
endif
|
||||||
|
|
||||||
|
CA65 := $(if $(wildcard ../../../bin/ca65*),../../../bin/ca65,ca65)
|
||||||
|
LD65 := $(if $(wildcard ../../../bin/ld65*),../../../bin/ld65,ld65)
|
||||||
|
|
||||||
|
WORKDIR = ../../../testwrk/asm/opcodes
|
||||||
|
|
||||||
|
ISEQUAL = ../../../testwrk/isequal$(EXE)
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -O2
|
||||||
|
|
||||||
|
.PHONY: all clean
|
||||||
|
|
||||||
|
OPCODE_REFS := $(wildcard *-opcodes.ref)
|
||||||
|
OPCODE_BINS = $(OPCODE_REFS:%.ref=$(WORKDIR)/%.bin)
|
||||||
|
OPCODE_CPUS = $(OPCODE_REFS:%-opcodes.ref=%)
|
||||||
|
|
||||||
|
all: $(OPCODE_BINS)
|
||||||
|
|
||||||
|
$(WORKDIR):
|
||||||
|
$(call MKDIR,$(WORKDIR))
|
||||||
|
|
||||||
|
$(ISEQUAL): ../../isequal.c | $(WORKDIR)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
define OPCODE_template
|
||||||
|
|
||||||
|
$(WORKDIR)/$1-opcodes.bin: $1-opcodes.s $(ISEQUAL)
|
||||||
|
$(if $(QUIET),echo asm/$1-opcodes.bin)
|
||||||
|
$(CA65) -t none --cpu $1 -l $$(@:.bin=.lst) -o $$(@:.bin=.o) $$<
|
||||||
|
$(LD65) -t none -o $$@ $$(@:.bin=.o) none.lib
|
||||||
|
$(ISEQUAL) $1-opcodes.ref $$@
|
||||||
|
|
||||||
|
endef # OPCODE_template
|
||||||
|
|
||||||
|
$(foreach cpu,$(OPCODE_CPUS),$(eval $(call OPCODE_template,$(cpu))))
|
||||||
|
|
||||||
|
$(WORKDIR)/%.o: %.s | $(WORKDIR)
|
||||||
|
$(CA65) -l $(@:.o=.lst) -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@$(call RMDIR,$(WORKDIR))
|
29
test/asm/opcodes/readme.txt
Normal file
29
test/asm/opcodes/readme.txt
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
Opcode Tests:
|
||||||
|
-------------
|
||||||
|
|
||||||
|
These testcases are inspired by the ones now removed from test/assembler.
|
||||||
|
The main purpose is to have each possible opcode generated at least once,
|
||||||
|
either by an Assembly instruction or a ".byte"-placeholder. Typically
|
||||||
|
generated by disassembling a binary dump that contains data in the form
|
||||||
|
of the pattern that each opcode is stated once in order followed by easy
|
||||||
|
to recognise:
|
||||||
|
|
||||||
|
00 00 EA 00
|
||||||
|
01 00 EA 00
|
||||||
|
02 00 EA 00
|
||||||
|
[...]
|
||||||
|
fe 00 EA 00
|
||||||
|
ff 00 EA 00
|
||||||
|
|
||||||
|
The disassembly is then put in a better readable form by replacing the
|
||||||
|
leftover dummy opcode parameters with something more recognizable.
|
||||||
|
|
||||||
|
The testcases for 6502, 6502x, 65sc02, 65c02, 4510, and huc6280 have been
|
||||||
|
put together by Sven Oliver ("SvOlli") Moll, as well as a template for the
|
||||||
|
m740 instructions set. Later 6502dtv support was also added.
|
||||||
|
|
||||||
|
Still to do is to find a way to implement an opcode testcase for the 65816
|
||||||
|
processor, since it's capable of executing instructions with an 8-bit and
|
||||||
|
a 16-bit operator alike, distinguished by only one processor flag.
|
||||||
|
|
||||||
|
|
|
@ -4,44 +4,16 @@ Assembler Testcases
|
||||||
Opcode Tests:
|
Opcode Tests:
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
These testcases are inspired by the ones now removed from test/assembler.
|
these go into opcodes/. Refer to opcodes/readme.txt
|
||||||
The main purpose is to have each possible opcode generated at least once,
|
|
||||||
either by an Assembly instruction or a ".byte"-placeholder. Typically
|
|
||||||
generated by disassembling a binary dump that contains data in the form
|
|
||||||
of the pattern that each opcode is stated once in order followed by easy
|
|
||||||
to recognise:
|
|
||||||
|
|
||||||
00 00 EA 00
|
|
||||||
01 00 EA 00
|
|
||||||
02 00 EA 00
|
|
||||||
[...]
|
|
||||||
fe 00 EA 00
|
|
||||||
ff 00 EA 00
|
|
||||||
|
|
||||||
The disassembly is then put in a better readable form by replacing the
|
|
||||||
leftover dummy opcode parameters with something more recognizable.
|
|
||||||
|
|
||||||
The testcases for 6502, 6502x, 65sc02, 65c02, 4510, and huc6280 have been
|
|
||||||
put together by Sven Oliver ("SvOlli") Moll, as well as a template for the
|
|
||||||
m740 instructions set. Later 6502dtv support was also added.
|
|
||||||
|
|
||||||
Still to do is to find a way to implement an opcode testcase for the 65816
|
|
||||||
processor, since it's capable of executing instructions with an 8-bit and
|
|
||||||
a 16-bit operator alike, distinguished by only one processor flag.
|
|
||||||
|
|
||||||
|
|
||||||
CPU Detect Tests
|
CPU Detect Tests
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
These tests all assemble the same file "cpudetect.s" which contains several
|
these go into cpudetect/. Refer to cpudetect/readme.txt
|
||||||
conditionals for several CPUs, only using every option known to the "--cpu"
|
|
||||||
command-line switch of ca65/cl65.
|
|
||||||
|
|
||||||
|
|
||||||
Reference (".ref") Files
|
Overall tests:
|
||||||
------------------------
|
--------------
|
||||||
|
|
||||||
Some hints about creating new files:
|
These go into listing/. Refer to listing/readme.txt
|
||||||
Make an empty file with the CPU's name prepended to "-cpudetect.ref". Run the
|
|
||||||
tests; one of them will fail due to a mismatch. Review the output of the
|
|
||||||
".lst" file pedantically, then copy the ".bin" over the empty ".ref" file.
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user