Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
vbcc [2024/06/01 14:07] – [Bugs] pulkomandyvbcc [2024/08/27 17:20] (current) – [The configuration file] Fix typos, add missing asv pulkomandy
Line 50: Line 50:
     * lib/     * lib/
       * startup.o       * startup.o
 +      * libvc.a
 +    * include/
 +      * ctype.h
 +      * stdlib.h
 +      * string.h
     * vlink.cmd     * vlink.cmd
  
 +The content of each file or how to generate them is detailed below.
 ===== The configuration file ===== ===== The configuration file =====
  
Line 59: Line 65:
 -cc=vbccunsp -I"$VBCC"/targets/unsp-vsmile/include -quiet %s -o= %s %s -O=%ld -cc=vbccunsp -I"$VBCC"/targets/unsp-vsmile/include -quiet %s -o= %s %s -O=%ld
 -ccv=vbccunsp -I"$VBCC"/targets/unsp-vsmile/include %s -o= %s %s -O=%ld -ccv=vbccunsp -I"$VBCC"/targets/unsp-vsmile/include %s -o= %s %s -O=%ld
--as=vasmunsp_std -quiet -Fvobj %s -o %s+-as=vasmunsp_std -quiet -ile -Fvobj %s -o %s 
 +-asv=vasmunsp_std -ile -Fvobj %s -o %s
 -rm=rm %s -rm=rm %s
 -rmv=rm %s -rmv=rm %s
--ld=vlink -ole -b rawbin1 -Cvbcc -T"$VBCC"/targets/unsp-vsmile/vlink.cmd -L"$VBCC"/targets/unsp-vmsile/lib "$VBCC"/targets/unsp-vsmile/lib/startup.o %s %s -o %s +-ld=vlink -ole -b rawbin1 -Cvbcc -T"$VBCC"/targets/unsp-vsmile/vlink.cmd -L"$VBCC"/targets/unsp-vsmile/lib "$VBCC"/targets/unsp-vsmile/lib/startup.o %s %s -o %s -lvc 
--ldv=vlink -ole -b rawbin1 -Cvbcc -T"$VBCC"/targets/unsp-vsmile/vlink.cmd -L"$VBCC"/targets/unsp-vmsile/lib "$VBCC"/targets/unsp-vsmile/lib/startup.o %s %s -o %s -Mmapfile +-ldv=vlink -ole -b rawbin1 -Cvbcc -T"$VBCC"/targets/unsp-vsmile/vlink.cmd -L"$VBCC"/targets/unsp-vsmile/lib "$VBCC"/targets/unsp-vsmile/lib/startup.o %s %s -o %s -lvc -Mmapfile 
--l2=vlink -ole -b rawbin1 -Cvbcc -T"$VBCC"/targets/unsp-vsmile/vlink.cmd -L"$VBCC"/targets/unsp-vmsile/lib %s %s -o %s +-l2=vlink -ole -b rawbin1 -Cvbcc -T"$VBCC"/targets/unsp-vsmile/vlink.cmd -L"$VBCC"/targets/unsp-vsmile/lib %s %s -o %s 
--l2v=vlink -ole -b rawbin1 -Cvbcc -T"$VBCC"/targets/unsp-vsmile/vlink.cmd -L"$VBCC"/targets/unsp-vmsile/lib %s %s -o %s -Mmapfile+-l2v=vlink -ole -b rawbin1 -Cvbcc -T"$VBCC"/targets/unsp-vsmile/vlink.cmd -L"$VBCC"/targets/unsp-vsmile/lib %s %s -o %s -Mmapfile
 </code> </code>
  
Line 111: Line 118:
         __BL = SIZEOF(.bss);         __BL = SIZEOF(.bss);
         __DS = ADDR(.data);         __DS = ADDR(.data);
 +        __DD = LOADADDR(.data);
         __DL = SIZEOF(.data);         __DL = SIZEOF(.data);
  
Line 185: Line 193:
         ; Copy the initialized variables into RAM         ; Copy the initialized variables into RAM
         ; __DL = length of variables section         ; __DL = length of variables section
-        ; __DS = start of variables section in ROM +        ; __DS = start of variables section in RAM 
-        LD R1, 0x0000 +        ; __DD = start of variables section in ROM 
-        LD R2, __DS+        LD R1, __DS 
 +        LD R2, __DD
         LD R3, __DL         LD R3, __DL
         JZ gomain         JZ gomain
Line 201: Line 210:
 gomain: gomain:
         GOTO main         GOTO main
 +
 +; Handlers for indirect calls. Used by VBCC to handle function pointers, because unSP does not have
 +; an indirect call (CALL R1 or similar) operation and it is not trivial to emulate one.
 +.globl __indirect_R1
 +.globl __indirect_R2
 +.globl __indirect_R3
 +.globl __indirect_R4
 +__indirect_R1:
 +        LD PC,R1
 +__indirect_R2:
 +        LD PC,R2
 +__indirect_R3:
 +        LD PC,R3
 +__indirect_R4:
 +        LD PC,R4
  
 ; The interrupt vectors section, contains pointers to the interrupt handlers ; The interrupt vectors section, contains pointers to the interrupt handlers
Line 239: Line 263:
  
 Note: the -ile option tells vasm that files included using the incbin directive are in little endian. This gives the same results as the official unSP toolchain when importing binary files. Note: the -ile option tells vasm that files included using the incbin directive are in little endian. This gives the same results as the official unSP toolchain when importing binary files.
 +
 +===== The C library =====
 +
 +vbcc does not come with an open source C library. A full one from other sources could be compiled, but we don't need a complete C library.
 +
 +So here is a very minimal one with enough support to run the compiler and to run Contiki, which has minimal needs from the C library (just a few string functions).
 +
 +<code c>
 +/*
 + * Copyright (C) 2024 Adrien Destugues <pulkomandy@pulkomandy.tk>
 + *
 + * Distributed under terms of the MIT license.
 + */
 +
 +int strlen(const char* str)
 +{
 +        int i = 0;
 +        while(*str++) i++;
 +        return i;
 +}
 +
 +int isprint(char c)
 +{
 +        return c >= 32;
 +}
 +
 +void strcpy(const char* src, char* dst)
 +{
 +        char c;
 +        while (c = *src++)
 +                *dst++ = c;
 +        *dst = 0;
 +}
 +
 +void memset(int* s, int v, int n)
 +{
 +        while(--n >= 0)
 +                *s++ = v;
 +}
 +
 +int strncmp(const char* a, const char* b, int n)
 +{
 +        while(--n >= 0) {
 +                if (*a != *b)
 +                        return *a - *b;
 +                if (*a == 0)
 +                        return *b;
 +                if (*b == 0)
 +                        return -*a;
 +        }
 +}
 +
 +int __div(int a, int b)
 +{
 +        int c = 0;
 +        while (a >= b) {
 +                a -= b;
 +                c++;
 +        }
 +        return c;
 +}
 +
 +int __mod(int a, int b)
 +{
 +        while (a >= b) {
 +                a -= b;
 +        }
 +        return a;
 +}
 +</code>
 +
 +To generate the libc.a file:
 +
 +<code sh>
 +vc +vsmile -nostdlib -O3 -c libc.c
 +ar cru libvc.a libc.o
 +</code>
 +
 +We also need some include files. ctype.h and stdlib.h can be empty, but they are used by Contiki so they must exist.
 +
 +string.h has some basic functions declarations and type definitions:
 +
 +<code c>
 +#ifndef __STRING_H
 +#define __STRING_H 1
 +
 +/*
 +  Adapt according to stddef.h.
 +*/
 +#ifndef __SIZE_T
 +#define __SIZE_T 1
 +typedef unsigned int size_t;
 +#endif
 +
 +#undef NULL
 +#define NULL ((void *)0)
 +
 +/*
 +  Many of these functions should perhaps be implemented as
 +  inline-assembly or assembly-functions.
 +
 +  Most suitable are:
 +  - memcpy
 +  - strcpy
 +  - strlen
 +  - strcmp
 +  - strcat
 +*/
 +void *memcpy(void *,const void *,size_t n);
 +void *memmove(void *,const void *,size_t);
 +void *memset(void *,int,size_t);
 +int memcmp(const void *,const void *,size_t);
 +void *memchr(const void *,int,size_t);
 +char *strcat(char *,const char *);
 +char *strncat(char *,const char *,size_t);
 +char *strchr(const char *,int);
 +size_t strcspn(const char *,const char *);
 +char *strpbrk(const char *,const char *);
 +char *strrchr(const char *,int);
 +size_t strspn(const char *,const char *);
 +char *strstr(const char *,const char *);
 +char *strtok(char *,const char *);
 +char *strerror(int);
 +size_t strlen(const char *);
 +char *strcpy(char *,const char *);
 +char *strncpy(char *,const char *,size_t);
 +int strcmp(const char *,const char *);
 +int strncmp(const char *,const char *,size_t);
 +int strcoll(const char *,const char *);
 +size_t strxfrm(char *,const char *,size_t);
 +
 +#endif
 +</code>
 ====== Running the compiler ====== ====== Running the compiler ======
 +
 +Note: make sure you have set the VBCC environment variable as explained earlier, otherwise the compiler will not find the target configuration and will complain and not compile anything.
  
 To compile a .c file into a .o file: To compile a .c file into a .o file:
Line 269: Line 428:
   * <del>There is an internal compiler error when compiling the sound demo</del>   * <del>There is an internal compiler error when compiling the sound demo</del>
   * long int values are mostly untested and broken in various places (code is missing, they will be handled the same as 1-byte values)   * long int values are mostly untested and broken in various places (code is missing, they will be handled the same as 1-byte values)
-  * Contiki crashes when trying to call a function pointer +  * <del>Contiki crashes when trying to call a function pointer</del> 
-  * Probably more problems waiting in Contiki once that is fixed+  * <del>Probably more problems waiting in Contiki once that is fixed</del>
   * Try to compile larger projects such as Copyright Infringement to find more bugs   * Try to compile larger projects such as Copyright Infringement to find more bugs
  
Line 281: Line 440:
 ===== Startup and library ===== ===== Startup and library =====
  
-  * The startup script should clear the bss segment to 0 +  * The startup script should clear the bss segment to 0 (MAME will do this on first start, but not on reset) 
-  * Move the implementation of ''__div'' and ''__mod'' into libvc and implement them also for "long" types+  * Implement division and modulo for "long" types, signed vs unsigned, etc.
   * Floating point support routines   * Floating point support routines
   * Move font.bin outside of crt0/startup, and provide a more convenient way to handle resources (some Makefile rules maybe?)   * Move font.bin outside of crt0/startup, and provide a more convenient way to handle resources (some Makefile rules maybe?)
vbcc.1717250872.txt.gz · Last modified: 2024/06/01 14:07 by pulkomandy
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0