Add basic test program

This adds a test program which can be loaded and executed by the host.
It simply returns a value in the `a` register.

The linker script is modified so that it will output an o65 file, and
the memory sgments are changed as well. There is no STARTUP segment
defined, so it uses the default `none` crt0, which sets up the stack
and does initialization and deconstruction.

The Makefile is modified to not turn the output into an intel hex file,
and instead keep it as the o65 file.
This commit is contained in:
Byron Lathi
2022-04-16 14:05:33 -05:00
parent 0cecf166c7
commit 59da06c509
6 changed files with 864 additions and 0 deletions

41
sw/test_exec/Makefile Normal file
View File

@@ -0,0 +1,41 @@
CC=~/Software/cc65/bin/cl65
CFLAGS=-v -T -t none -I. --cpu "65C02"
test: CFLAGS=-T -t sim65c02 -I.
LDFLAGS=-v -C link.ld -m $(NAME).map
SIM=sim65
SIMARGS=-v -c -x 1000000
NAME=test
BIN=$(NAME).o65
HEX=$(NAME).hex
LISTS=lists
SRCS=$(wildcard *.s) $(wildcard *.c)
OBJS+=$(patsubst %.s,%.o,$(filter %s,$(SRCS)))
OBJS+=$(patsubst %.c,%.o,$(filter %c,$(SRCS)))
all: $(BIN)
$(HEX): $(BIN)
objcopy --input-target=binary --output-target=ihex $(BIN) $(HEX)
$(BIN): $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $@
%.o: %.c $(LISTS)
$(CC) $(CFLAGS) -l $(LISTS)/$<.list -c $< -o $@
%.o: %.s $(LISTS)
$(CC) $(CFLAGS) -l $(LISTS)/$<.list -c $< -o $@
$(LISTS):
mkdir -p $(addprefix $(LISTS)/,$(sort $(dir $(SRCS))))
.PHONY: clean
clean:
rm -rf $(OBJS) $(BIN) $(HEX) $(LISTS) $(NAME).map
rm -rf $(TEST_OBJS) $(TEST_BIN)

43
sw/test_exec/link.ld Normal file
View File

@@ -0,0 +1,43 @@
MEMORY
{
ZP: start = $0, size = $100, type = rw, define = yes;
SDRAM: start = $1000, size = $6ef0, type = rw, define = yes;
}
FILES {
%O: format = o65;
}
SEGMENTS {
ZEROPAGE: load = ZP, type = zp, define = yes;
DATA: load = SDRAM, type = rw, define = yes, run = SDRAM;
BSS: load = SDRAM, type = bss, define = yes;
HEAP: load = SDRAM, type = bss, optional = yes;
STARTUP: load = SDRAM, type = ro;
ONCE: load = SDRAM, type = ro, optional = yes;
CODE: load = SDRAM, type = ro;
RODATA: load = SDRAM, type = ro;
}
FEATURES {
CONDES: segment = STARTUP,
type = constructor,
label = __CONSTRUCTOR_TABLE__,
count = __CONSTRUCTOR_COUNT__;
CONDES: segment = STARTUP,
type = destructor,
label = __DESTRUCTOR_TABLE__,
count = __DESTRUCTOR_COUNT__;
}
SYMBOLS {
# Define the stack size for the application
__STACKSIZE__: value = $0200, type = weak;
__STACKSTART__: type = weak, value = $0800; # 2k stack
}
FORMATS {
o65: os = 5, version = 0, type = small,
export = _main;
}

3
sw/test_exec/main.c Normal file
View File

@@ -0,0 +1,3 @@
int main() {
return 0x41;
}

289
sw/test_exec/out.txt Normal file
View File

@@ -0,0 +1,289 @@
mkdir -p lists/./
~/Software/cc65/bin/cl65 -T -t none -I. --cpu "65C02" -l lists/main.c.list -c main.c -o main.o
~/Software/cc65/bin/cl65 -T -t none -I. --cpu "65C02" -C link.ld -m test.map main.o -o test.o65
Writing a bunch of data!
1 0 6f 36 35
Writing size value 1025
Writing size value 0
Writing size value 1000
Writing size value 0
Writing size value 1025
Writing size value 0
Writing size value 0
Writing size value 0
Writing size value 0
Writing a bunch of data!
74 65 73 74 2e 6f 36 35 0
Writing a bunch of data!
6c 64 36 35 20 56 32 2e 31 39 20 2d 20 47 69 74 20 30 38 35 31 34 37 34 37 35 0
Writing a bunch of data!
46 72 69 20 41 70 72 20 31 35 20 31 36 3a 30 34 3a 30 31 20 32 30 32 32 0
Writing a bunch of data!
5 0
WRITING TEXT SEGWrite seg count: 4, dowrite: 1
Writing a bunch of data!
a9
Writing a bunch of data!
a2
Writing a bunch of data!
85
Writing a bunch of data!
86
Writing a bunch of data!
20
Writing a bunch of data!
20
Writing a bunch of data!
20
Writing a bunch of data!
48
Writing a bunch of data!
20
Writing a bunch of data!
68
Writing a bunch of data!
60
Writing a bunch of data!
a0
Writing a bunch of data!
f0
Writing a bunch of data!
7
Writing a bunch of data!
a9
Writing a bunch of data!
a2
Writing a bunch of data!
4c
Writing a bunch of data!
60
Writing a bunch of data!
a2 cc
Writing a bunch of data!
a9 dd
Writing a bunch of data!
4c
Writing a bunch of data!
60
Writing a bunch of data!
a0
Writing a bunch of data!
f0
Writing a bunch of data!
7
Writing a bunch of data!
a9
Writing a bunch of data!
a2
Writing a bunch of data!
4c
Writing a bunch of data!
60
Writing a bunch of data!
a9
Writing a bunch of data!
85
Writing a bunch of data!
a9
Writing a bunch of data!
85
Writing a bunch of data!
a9 0
Writing a bunch of data!
a8
Writing a bunch of data!
a2
Writing a bunch of data!
f0
Writing a bunch of data!
a
Writing a bunch of data!
91
Writing a bunch of data!
c8
Writing a bunch of data!
d0
Writing a bunch of data!
fb
Writing a bunch of data!
e6
Writing a bunch of data!
ca
Writing a bunch of data!
d0
Writing a bunch of data!
f6
Writing a bunch of data!
c0
Writing a bunch of data!
f0
Writing a bunch of data!
5
Writing a bunch of data!
91
Writing a bunch of data!
c8
Writing a bunch of data!
d0
Writing a bunch of data!
f7
Writing a bunch of data!
60
Text count: 4
Text Size: 90
WRITING DATA SEGWrite seg count: 1, dowrite: 1
Writing a bunch of data!
8d
Writing a bunch of data!
8e
Writing a bunch of data!
8d
Writing a bunch of data!
8e
Writing a bunch of data!
88
Writing a bunch of data!
b9 ff ff
Writing a bunch of data!
8d
Writing a bunch of data!
88
Writing a bunch of data!
b9 ff ff
Writing a bunch of data!
8d
Writing a bunch of data!
8c
Writing a bunch of data!
20 ff ff
Writing a bunch of data!
a0 ff
Writing a bunch of data!
d0
Writing a bunch of data!
e8
Writing a bunch of data!
60
Data count: 1
Data Size: 37
Write seg count: 1, dowrite: 0
Writing zp seg (this should just be a few)Write seg count: 1, dowrite: 0
WRITING IMPORTSWriting size value 0
ExtSymCount: 0
WRITING TEXT RELOCATION
Writing a bunch of data!
6 25 2 25 2 82 3 82 3 82 4 82 9 22 2 42 3c 2 83 8 82 8 22 2 42 3c 2 83 4 24 2 25 2 44 0 2 25 9 25 5 25 9 25 0
Writing a bunch of data!
2 83 3 83 3 83 3 83 7 83 7 83 3 83 0
Writing size value 1
Writing a bunch of data!
5f 6d 61 69 6e 0
Writing size value 1048
Writing a bunch of data!
1 0 6f 36 35
Writing size value 1025
Writing size value 5a
Writing size value 1000
Writing size value 25
Writing size value 1025
Writing size value 0
Writing size value 0
Writing size value 1a
Writing size value 0
Writing a bunch of data!
74 65 73 74 2e 6f 36 35 0
Writing a bunch of data!
6c 64 36 35 20 56 32 2e 31 39 20 2d 20 47 69 74 20 30 38 35 31 34 37 34 37 35 0
Writing a bunch of data!
46 72 69 20 41 70 72 20 31 35 20 31 36 3a 30 34 3a 30 31 20 32 30 32 32 0
Writing a bunch of data!
5 0
Text Base: 1025
Text Size: 5a
Data Base: 1000
Data Size: 25

488
sw/test_exec/out2.txt Normal file
View File

@@ -0,0 +1,488 @@
mkdir -p lists/./
~/Software/cc65/bin/cl65 -v -T -t none -I. --cpu "65C02" -l lists/main.c.list -c main.c -o main.o
0 errors and 0 warnings generated.
Opened output file 'main.s'
Wrote output to 'main.s'
Closed output file 'main.s'
~/Software/cc65/bin/cl65 -v -T -t none -I. --cpu "65C02" -v -C link.ld -m test.map main.o -o test.o65
Module 'main.o': Found segment 'CODE', size = 8, alignment = 1, type = 2
Module 'main.o': Found segment 'RODATA', size = 0, alignment = 1, type = 2
Module 'main.o': Found segment 'BSS', size = 0, alignment = 1, type = 2
Module 'main.o': Found segment 'DATA', size = 0, alignment = 1, type = 2
Module 'main.o': Found segment 'ZEROPAGE', size = 0, alignment = 1, type = 1
Module 'main.o': Found segment 'NULL', size = 0, alignment = 1, type = 2
Module 'condes.o': Found segment 'CODE', size = 12, alignment = 1, type = 2
Module 'condes.o': Found segment 'RODATA', size = 0, alignment = 1, type = 2
Module 'condes.o': Found segment 'BSS', size = 0, alignment = 1, type = 2
Module 'condes.o': Found segment 'DATA', size = 37, alignment = 1, type = 2
Module 'condes.o': Found segment 'ZEROPAGE', size = 0, alignment = 1, type = 1
Module 'condes.o': Found segment 'NULL', size = 0, alignment = 1, type = 2
Module 'condes.o': Found segment 'ONCE', size = 12, alignment = 1, type = 2
Module 'crt0.o': Found segment 'CODE', size = 0, alignment = 1, type = 2
Module 'crt0.o': Found segment 'RODATA', size = 0, alignment = 1, type = 2
Module 'crt0.o': Found segment 'BSS', size = 0, alignment = 1, type = 2
Module 'crt0.o': Found segment 'DATA', size = 0, alignment = 1, type = 2
Module 'crt0.o': Found segment 'ZEROPAGE', size = 0, alignment = 1, type = 1
Module 'crt0.o': Found segment 'NULL', size = 0, alignment = 1, type = 2
Module 'crt0.o': Found segment 'STARTUP', size = 23, alignment = 1, type = 2
Module 'zerobss.o': Found segment 'CODE', size = 35, alignment = 1, type = 2
Module 'zerobss.o': Found segment 'RODATA', size = 0, alignment = 1, type = 2
Module 'zerobss.o': Found segment 'BSS', size = 0, alignment = 1, type = 2
Module 'zerobss.o': Found segment 'DATA', size = 0, alignment = 1, type = 2
Module 'zerobss.o': Found segment 'ZEROPAGE', size = 0, alignment = 1, type = 1
Module 'zerobss.o': Found segment 'NULL', size = 0, alignment = 1, type = 2
Module 'zeropage.o': Found segment 'CODE', size = 0, alignment = 1, type = 2
Module 'zeropage.o': Found segment 'RODATA', size = 0, alignment = 1, type = 2
Module 'zeropage.o': Found segment 'BSS', size = 0, alignment = 1, type = 2
Module 'zeropage.o': Found segment 'DATA', size = 0, alignment = 1, type = 2
Module 'zeropage.o': Found segment 'ZEROPAGE', size = 26, alignment = 1, type = 1
Module 'zeropage.o': Found segment 'NULL', size = 0, alignment = 1, type = 2
Opened 'test.o65'...
Writing size value 1025
Writing size value 0
Writing size value 1000
Writing size value 0
Writing size value 1025
Writing size value 0
Writing size value 0
Writing size value 0
Writing size value 0
WRITING TEXT SEG Writing 'STARTUP'
Section from "crt0.o"
Filling 0x0 bytes with 0x00
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Section from "[linker generated]"
Filling 0x0 bytes with 0x00
Section from "[linker generated]"
Filling 0x0 bytes with 0x00
Writing 'ONCE'
Section from "condes.o"
Filling 0x0 bytes with 0x00
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Writing 'CODE'
Section from "main.o"
Filling 0x0 bytes with 0x00
Fragment with 0x2 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Section from "condes.o"
Filling 0x0 bytes with 0x00
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Section from "crt0.o"
Filling 0x0 bytes with 0x00
Section from "zerobss.o"
Filling 0x0 bytes with 0x00
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Section from "zeropage.o"
Filling 0x0 bytes with 0x00
Writing 'RODATA'
Section from "main.o"
Filling 0x0 bytes with 0x00
Section from "condes.o"
Filling 0x0 bytes with 0x00
Section from "crt0.o"
Filling 0x0 bytes with 0x00
Section from "zerobss.o"
Filling 0x0 bytes with 0x00
Section from "zeropage.o"
Filling 0x0 bytes with 0x00
Text count: 4
Text Size: 90
WRITING DATA SEG Writing 'DATA'
Section from "main.o"
Filling 0x0 bytes with 0x00
Section from "condes.o"
Filling 0x0 bytes with 0x00
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Fragment with 0x3 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Fragment with 0x3 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Fragment with 0x2 bytes
Fragment with 0x3 bytes
Fragment with 0x2 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Fragment with 0x1 bytes
Section from "crt0.o"
Filling 0x0 bytes with 0x00
Section from "zerobss.o"
Filling 0x0 bytes with 0x00
Section from "zeropage.o"
Filling 0x0 bytes with 0x00
Data count: 1
Data Size: 37
Writing 'BSS'
Writing zp seg (this should just be a few) Writing 'ZEROPAGE'
WRITING IMPORTSWriting size value 0
ExtSymCount: 0
WRITING TEXT RELOCATION
Writing size value 1
Writing size value 1048
Writing size value 1025
Writing size value 5a
Writing size value 1000
Writing size value 25
Writing size value 1025
Writing size value 0
Writing size value 0
Writing size value 1a
Writing size value 0
Text Base: 1025
Text Size: 5a
Data Base: 1000
Data Size: 25
Segment: CODE (55)
Section:
Literal (2 bytes):
A2 CC
Literal (2 bytes):
A9 DD
Literal (1 bytes):
4C
Expression (2 bytes):
SEC $0007 +
Literal (1 bytes):
60
Section:
Literal (1 bytes):
A0
Expression (1 bytes):
SYM() $0002 * BYTE0
Literal (1 bytes):
F0
Literal (1 bytes):
07
Literal (1 bytes):
A9
Expression (1 bytes):
SYM() BYTE0
Literal (1 bytes):
A2
Expression (1 bytes):
SYM() BYTE1
Literal (1 bytes):
4C
Expression (2 bytes):
SEC
Literal (1 bytes):
60
Section:
Section:
Literal (1 bytes):
A9
Expression (1 bytes):
SYM() BYTE0
Literal (1 bytes):
85
Expression (1 bytes):
SYM()
Literal (1 bytes):
A9
Expression (1 bytes):
SYM() BYTE1
Literal (1 bytes):
85
Expression (1 bytes):
SYM() $0001 +
Literal (2 bytes):
A9 00
Literal (1 bytes):
A8
Literal (1 bytes):
A2
Expression (1 bytes):
SYM() BYTE1
Literal (1 bytes):
F0
Literal (1 bytes):
0A
Literal (1 bytes):
91
Expression (1 bytes):
SYM()
Literal (1 bytes):
C8
Literal (1 bytes):
D0
Literal (1 bytes):
FB
Literal (1 bytes):
E6
Expression (1 bytes):
SYM() $0001 +
Literal (1 bytes):
CA
Literal (1 bytes):
D0
Literal (1 bytes):
F6
Literal (1 bytes):
C0
Expression (1 bytes):
SYM() BYTE0
Literal (1 bytes):
F0
Literal (1 bytes):
05
Literal (1 bytes):
91
Expression (1 bytes):
SYM()
Literal (1 bytes):
C8
Literal (1 bytes):
D0
Literal (1 bytes):
F7
Literal (1 bytes):
60
Section:
Segment: RODATA (0)
Section:
Section:
Section:
Section:
Section:
Segment: BSS (0)
Section:
Section:
Section:
Section:
Section:
Segment: DATA (37)
Section:
Section:
Literal (1 bytes):
8D
Expression (2 bytes):
SEC $000D + $0001 +
Literal (1 bytes):
8E
Expression (2 bytes):
SEC $000D + $0002 +
Literal (1 bytes):
8D
Expression (2 bytes):
SEC $0014 + $0001 +
Literal (1 bytes):
8E
Expression (2 bytes):
SEC $0014 + $0002 +
Literal (1 bytes):
88
Literal (3 bytes):
B9 FF FF
Literal (1 bytes):
8D
Expression (2 bytes):
SEC $001D + $0002 +
Literal (1 bytes):
88
Literal (3 bytes):
B9 FF FF
Literal (1 bytes):
8D
Expression (2 bytes):
SEC $001D + $0001 +
Literal (1 bytes):
8C
Expression (2 bytes):
SEC $0020 + $0001 +
Literal (3 bytes):
20 FF FF
Literal (2 bytes):
A0 FF
Literal (1 bytes):
D0
Literal (1 bytes):
E8
Literal (1 bytes):
60
Section:
Section:
Section:
Segment: ZEROPAGE (26)
Section:
Section:
Section:
Section:
Section:
Empty space (2 bytes)
Empty space (2 bytes)
Empty space (4 bytes)
Empty space (2 bytes)
Empty space (2 bytes)
Empty space (2 bytes)
Empty space (2 bytes)
Empty space (1 bytes)
Empty space (1 bytes)
Empty space (1 bytes)
Empty space (1 bytes)
Empty space (6 bytes)
Segment: NULL (0)
Section:
Section:
Section:
Section:
Section:
Segment: ONCE (12)
Section:
Literal (1 bytes):
A0
Expression (1 bytes):
SYM() $0002 * BYTE0
Literal (1 bytes):
F0
Literal (1 bytes):
07
Literal (1 bytes):
A9
Expression (1 bytes):
SYM() BYTE0
Literal (1 bytes):
A2
Expression (1 bytes):
SYM() BYTE1
Literal (1 bytes):
4C
Expression (2 bytes):
SEC
Literal (1 bytes):
60
Segment: STARTUP (23)
Section:
Literal (1 bytes):
A9
Expression (1 bytes):
SYM() BYTE0
Literal (1 bytes):
A2
Expression (1 bytes):
SYM() BYTE1
Literal (1 bytes):
85
Expression (1 bytes):
SYM()
Literal (1 bytes):
86
Expression (1 bytes):
SYM() $0001 +
Literal (1 bytes):
20
Expression (2 bytes):
SYM()
Literal (1 bytes):
20
Expression (2 bytes):
SYM()
Literal (1 bytes):
20
Expression (2 bytes):
SYM()
Literal (1 bytes):
48
Literal (1 bytes):
20
Expression (2 bytes):
SYM()
Literal (1 bytes):
68
Literal (1 bytes):
60
Section:
Section:
CONDES(0): 0 symbols
CONDES(1): 0 symbols
CONDES(2): 0 symbols
CONDES(3): 0 symbols
CONDES(4): 0 symbols
CONDES(5): 0 symbols
CONDES(6): 0 symbols

BIN
sw/test_exec/test.o65 Normal file

Binary file not shown.