Giter Site home page Giter Site logo

pcawte / agdev Goto Github PK

View Code? Open in Web Editor NEW
43.0 11.0 10.0 1.97 MB

Port to Agon Light of TI-84-CE C/C++ Toolchain which uses LLVM and generates eZ80 ADL code

License: GNU Lesser General Public License v3.0

Makefile 5.91% C 84.79% Pascal 1.16% C++ 6.57% Assembly 0.09% Shell 0.75% Batchfile 0.72%
agon-light agonlight agonlight2 c-language compiler cpp ez80 programming ti-84-plus-ce

agdev's Introduction

AgDev - a port of the CEdev C/C++ Toolchain to the Agon Platform

Overview

The Agon Light and other Agon Platform revisions are based on the Zilog eZ80 processor. The eZ80 has a 24 bit address space supporting 16 megabytes of memory, compared to the 64 kilobytes of the original Z80. The eZ80 has two modes of operation: the standard Z80 mode, which has 16-bit registers making it easy to address 64k of memory, but requiring the use of "banking" to access more than 64k of memory; and ADL (address data long) mode of operation, which extends the registers to 24 bits, making the whole address space readily accessible.

When we consider high-level programming languages, there are a number available for the Z80, but they are limited to 64k of memory or have awkward bank switching methods to access greater memory.

Considering the C-programming languages, there are a number of Z80 C-compilers available. To date, the Agon community has focused on two:

  • Zilog ZDS II development environment which can produce eZ80 ADL code. This was the original set of tools used by the developers of Agon, but it is closed source, runs on Windows only, and only supports the data C89 standard

  • SDCC (small devices C-compiler), a popular choice for 8-bit computers, and adapting this for Agon has been a focus of a number of people in the Agon computer. This is a good compiler for Z80, but it only supports Z80 and not ADL mode.

As an alternative, the CEdev C/C++ toolchain is an open-source compiler that can produce ADL code. It targets the TI-84 Plus CE calculator (based on the eZ80 processor) and has a reasonably sized community. CEdev is based on eZ80 versions of the LLVM compiler and fasmg assembler. It produces ADL code with 24 bit pointers, 24 bit integers, 32 bit longs, 16 bit shorts, and 32 bit floats. There is also quite an extensive library for C and C++ programs (though it is not ISO compliant... yet).

AgDev is the result of an effort to modify CEdev to accommodate the feature set and hardware design of the Agon Platform. The result is a more powerful, and C++ capable, toolchain, compared to other options for the Agon.

Installation

Download a release build or build from source yourself. Place the build in a directory of your choosing.

Afterward, make sure the /bin folder can be found in PATH; if you're on Windows, follow this guide, or you can run cedev.bat and execute commands from there instead. On Linux, run export PATH=/<insert path here>/bin:$PATH in a terminal window.

Building programs

This follows the same approach as the original CE Toolchain (see bottom of the CEdev getting started page). The build process had been modified to stop on the generation of the .bin file. This is the Agon Light executable.

I recommend to use:

make clean
make V=1

The make clean command can be used to delete the results of previous compilations and thereby force a recompilation.

The build process goes through the following steps:

  1. Compilation of .c source files to LLVM bitcode (.bc) using ez80-clang

  2. Linking of LLVM bitcode using ez80-link. This includes link time optimization

  3. Generation of eZ80 assembly code (.src) for the source programs using ez80-clang

  4. Assembling and linking of the of the generated assembly code (from step 3) with the libraries and compiler run-time using fasmg - this includes building the executable targeted at a specific memory location. This is the main part of the build process that needs to be adjusted.

C Calling Conventions (for interfacing with ASM applications)

See Zilog application note "Calling C from asm.pdf".

Only IX register and stack need to be preserved by called functions.

Arguments

Arguments are pushed from last to first corresponding to the C prototype. In eZ80, 3 bytes are always pushed to the stack regardless of the actual size. However, the assembly function must be careful to only use the valid bytes that are pushed. For example, if a short type is used, the upper byte of the value pushed on the stack will contain arbitrary data. This table lists the locations relative to sp from within the called function. Note that sp + [0,2] contains the return address.

C/C++ Type Size Stack Location
char 1 byte sp + [3]
short 2 bytes sp + [3,4]
int 3 bytes sp + [3,5]
long 4 bytes sp + [3,6]
long long 8 bytes sp + [3,10]
float 4 bytes sp + [3,6]
double 4 bytes sp + [3,6]
pointer 3 bytes sp + [3,5]

Note that eZ80 is little endian - i.e. the least significant byte is stored first.

Returns

This table lists which registers are used for return values from a function. The type’s sign does not affect the registers used, but may affect the value returned. The LSB is located in the register on the far right of the expression, e.g. E:UHL indicates register L stores the LSB.

C/C++ Type Return Register
char A
short HL
int UHL
long E:UHL
long long BC:UDE:UHL
float E:UHL
double E:UHL
pointer UHL

Standard IO Library

Not ISO compliant!

Consists of the following:

File IO:

  • fopen(), freopen(), fclose()

  • fputc(), fputs()

  • fgetc(), ungetc(), fgets()

  • feof(), ferror(), fflush()

  • fread(), fwrite()

  • fseek(), rewind(), ftell()

  • clearerr()

  • remove()

Stdin / stdout IO:

  • putchar(), puts()

  • getchar(), gets_s()

Formatted output

  • printf() (and vprintf())

  • sprintf() (and vsprintf())

  • snprintf() (and vsnprintf())

Formatted input

  • scanf()

  • sscanf()

There's some other stuff in here - like stdint and such - but it should mostly match expectations for the normal standard library. Mostly.

stdio Redirection

Can redirect output by using freopen() on stdout or stderr:

  • putchar() - outputs to outchar() unless the output is redirected, in which case outputs to fputc()

  • puts() - calls putchar()

  • printf() (and vprintf()) - calls npf_putc_std(), which calls putchar() in nanoprintf.c

  • fputc() - calls mos_fputc() unless called on stdout when calls outchar() - avoids calling putchar() so that no risk of function call loops

Can redirect input by using freopen() on stdin:

  • getchar() - calls inchar() to get the character and outchar() to echo the character (even if the output has been redirected). If output has not been re-directed calls fgetc() and does not echo the character.

  • gets_s() - calls getchar() if input has not been redirected (line are terminated with CR). Callsfgets() of input has been redirected (lines are terminated with CR/LF pair).

  • scanf() - calls getchar() in uscan.c (doesn't need updating)

  • fgetc() - calls mos_fgetc() unless called on stdin when calls inchar() and echos with outchar() - avoids calling getchar() so that no risk of function call loops

Requires FILE *, which is a pointer to a file handle returned by fopen and passed to the file IO routines to indicate the file the action is to be performed upon.

Other related files:

stdio.h - normal header files, which defines the various functions and the typedef for FILE

files.c- instantiates the storage for files handles including: stdout, stderr, stdin.

The following standard file handles are defined:

  • stdout - default output

  • stderr - default output for error message

  • stdin - default input

MOS does not implement input / output redirection, so by default these all use the console.

Command Line Processing and Input / Output Redirection

Two options are available for command line processing.

Simple Command Line Processing

This is automatically included if the main function is defined as

int main( int argc, char* argv[] )

the splits the command line up using space as a delimiter. The command line options are available in the argv[] array as normal.

Complex Command Line Processing - for Redirection & Quoting

This is optionally included if the application makefile includes:

LDHAS_ARG_PROCESSING = 1

This supports

  • Quoting with double quotes

  • Input / output redirection

    • >out_file.txt - redirects stdout to out_file.txt, creating a new file

    • >>out_file.txt - redirects stdout to out_file.txt, appending to the end of the file

    • <in_file.txt - redirects stdin to be from in_file.txt

MOS Commands

For current documentation on MOS commands, see the Agon Console8 Documentation.

The MOS (machine operating system) provides an interface to the Agon file system and some hardware peripherals, like the mouse. It keeps information on system variables in a large SYSVAR struct that can be accessed on the Z80 side. Generally your C code will declare a pointer to this struct, initialized like so:

static volatile SYSVAR* sv; 
sv = vdp_vdu_init();

For more information see <mos_api.h>.

VDP / VDU Commands

For current documentation on VDU commands, see the Agon Console8 Documentation.

The VDP (video display processor) accepts a text stream from MOS, acting like a text / graphics terminal. The text stream can contain:

  • Normal text

  • Escape sequences / commands to control the display and send graphics/sound/etc commands

When results are returned by MOS as a result of sending a command, these are stored in the SYSVAR's and not returned directly in response to the command. The response is asynchronous - to check that a result has been returned:

  • Set vdp_pflags in SYSVAR to zero

  • Issue the VDU command

  • Wait for the relevant bit into in vdp_pflags to be set - see <mos_api.h> for the bit masks

Commands can be sent by:

  • putch() - single character (this is not part of the C standard library)

  • mos_puts() - multi-character string

Both of these output directly to MOS/VDP - note that they are not part of STDIO library and not subject to CR/LF translation or redirection.

Convenience functions for many VDU commands are supplied in AgDev. For example, to change the screen MODE to 3, the C call vdp_mode(3); will send 22,3 as single bytes to the output, equivalent to putch(22); putch(3); For a list of these functions see <vdp_vdu.h>. Additional functions related to keyboard handling are found in <vdp_key.h>.

agdev's People

Contributors

astralaster avatar blastbrothers avatar calc84maniac avatar envenomator avatar heathenuk avatar pcawte avatar robogeek42 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

agdev's Issues

fgets fails to detect EOF

Found this when using fgets to read the config file in the 'mc' program.

When fgets reaches the end of file, it should return a NULL pointer. This works in the fab-agon-emulator, but it does not work on real hardware. The file has CRLF line endings and the last line ends with CRLF too.

fgets can read thousands of spurious lines before it finally thinks the end of file is reached for real. This increased the startup time of mc for some users to 2 minutes.

Temporary work-around: use my own function to read lines, based on fread(). fread() is known to reliably detect end of file.

FILE was opened using fopen with "r" mode ("r" for read access, text files). This converts CRLF on input to LF.

Timers (or revising clock)

Hi Paul,

Really appreciate all the work you've put into bringing this toolchain up, it's made my work (as someone who prefers C to BASIC or ASM but who struggles with the dated Zilog toolchain) much, much more productive.

At the moment you make use of the MOS centisecond timer (which is at half resolution) in order to provide the underlying "millis" for time.h, which is a neat way of using an existing resource and works perfectly for many uses. However, I'm working on porting my audio demo code to your toolchain and that depends on much tighter timers (for me, it needs to be at least ~50us per tick).

Would you be willing to consider adapting Jeroen's existing ez80f92 timer code (here and here) to offer a higher resolution underlying timebase? Being selfish as I say it'd be great if clock() could return a figure based around the microsecond range (albeit at a lowish resolution ticking up by 25 every 25us or similar).

Regards,

Greg

FatFs

it would be good to add the FatFs api in AgDev

Won't Build on MacOS

I can get HelloWorld.c to almost build after copying some files from

  • CEdev/src/libc/include/
    to
  • CEdev/include/

I get the same error building

  • sprite_demos/invaders/

I get this error from the
-linker_script

  • % make
    [linking] bin/DEMO.bin
    eval [9] /Users/snake/CEdev/meta/linker_script [27]:
    order .header, .libs, .init, .fini, .init.args, .init.bss, .text, .data, .rodata
    Processed: order .header, .libs, .init, .fini, .init.args, .init.bss, .text, .data, .rodata
    Error: illegal instruction.
    make: *** [bin/DEMO.bin] Error 2

MacOS support

CEdev can be built for this, so no technical reason why we can't target it as well.

The main problem is that I don't have a way to test MacOS builds or build actions.

win32

hello,
can you add win32 executables?

Missing cdefs.h when compiling the example (Macos)

When I run make on hello_world:

[compiling] src/main.c
In file included from src/main.c:10:
/Users/chrisg/Agdev/include/stdio.h:4:10: fatal error: 'cdefs.h' file not found
#include <cdefs.h>
         ^~~~~~~~~
1 error generated.
make: *** [obj/src/main.c.bc] Error 1

Did I miss a step?

Add redirection for stderr

pcawte mentioned wanting to do this in the old README. I don't know who actually uses redirection currently but this feels like a nice-to-have.

Suggest bringing back directory read functions.

AgDev versions <2.0.0 contained two versions of mos_api.h

  • One in include. It contains the ffs_dopen/ffs_dread/ffs_dclose functions. Plus some related structs.
  • One in src/libc/include. It does NOT contain the directory stuff.

AgDev version 2.0.x dropped to include directory at the top-level of the project (which was a good thing I think), but thereby lost the directory related definitions in mos_api.h. Can they be brought back in the mos_api.h file that is still there?

Programs containing fgetc get a linker error.

This used to work on previous versions <2.0.0 of AgDev.
When trying to link a program containing fgetc, I get the following error.

[linking] bin/ez80asm.bin
/home/lennartb/AgDev/AgDev_build/meta/ld.alm [1568] macro ? [1295] :read? [14] /home/lennartb/AgDev/AgDev_build/meta/../lib/libc/fgetc.c.src [121]:
extern _ungetc
extern? [12] (CALM)
Error: symbol ':globals._ungetc' is undefined or out of scope.
make: *** [/home/lennartb/AgDev/AgDev_build/meta/makefile.mk:259: bin/ez80asm.bin] Error 2

Definition of ':globals._printf' in conflict with already defined symbol

Issue

AgDev examples don't build due to _printf symbol confilct, other symbols are missing or duplicated.

Output

  1. Testing the tests/args example:
/home/chandler/Documentos/agon-ce-c-toolchain/tests/args $ make V=1
mkdir -p 'bin'
echo [linking] bin/args.bin
[linking] bin/args.bin
/home/chandler/CEDev/bin/fasmg -v1 '/home/chandler/CEDev/meta/ld.alm' -i 'DEBUG := 0' -i 'HAS_PRINTF := 1' -i 'HAS_LIBC := 1' -i 'HAS_LIBCXX := 1' -i 'PREFER_OS_CRT := 0' -i 'PREFER_OS_LIBC := 1' -i 'ALLOCATOR_STANDARD := 1' -i 'include "/home/chandler/CEDev/meta/linker_script"' -i 'range .bss $D052C6 : $D13FD8' -i 'provide __stack = $D1A87E' -i 'locate .header at $D1A87F' -i map -i 'source "obj/icon.src", "/home/chandler/CEDev/lib/crt/crt0.src", "obj/lto.src"' -i 'library "/home/chandler/CEDev/lib/libload/fatdrvce.lib", "/home/chandler/CEDev/lib/libload/fileioc.lib", "/home/chandler/CEDev/lib/libload/fontlibc.lib", "/home/chandler/CEDev/lib/libload/graphx.lib", "/home/chandler/CEDev/lib/libload/keypadc.lib", "/home/chandler/CEDev/lib/libload/msddrvce.lib", "/home/chandler/CEDev/lib/libload/srldrvce.lib", "/home/chandler/CEDev/lib/libload/usbdrvce.lib"'  bin/args.bin
flat assembler  version g.kaqg
/home/chandler/CEDev/meta/ld.alm [1568]:
	
macro ? [1295]:
	read source
:read? [14] (CALM)
assemble :temp [1]:
	include?! '../lib/libc/printf.src'
/home/chandler/CEDev/meta/../lib/libc/printf.src [8]:
	public _printf
public? [26] (CALM)
Error: definition of ':globals._printf' in conflict with already defined symbol.
make: *** [/home/chandler/CEDev/meta/makefile.mk:293: bin/args.bin] Error 2
  1. Testing the tests/vdu example:
/home/chandler/Documentos/agon-ce-c-toolchain/tests/vdu $ make V=1
mkdir -p 'obj/src'
echo [compiling] src/vdp_vdu.c
[compiling] src/vdp_vdu.c
/home/chandler/CEDev/bin/ez80-clang -MD -c -emit-llvm -nostdinc -isystem /home/chandler/CEDev/include -Isrc -fno-threadsafe-statics -Xclang -fforce-mangle-main-argc-argv -mllvm -profile-guided-section-prefix=false -DNDEBUG  -g0 -Wall -Wextra -Oz 'src/vdp_vdu.c' -o 'obj/src/vdp_vdu.c.bc'
mkdir -p 'obj/src'
echo [compiling] src/vdu.c
[compiling] src/vdu.c
/home/chandler/CEDev/bin/ez80-clang -MD -c -emit-llvm -nostdinc -isystem /home/chandler/CEDev/include -Isrc -fno-threadsafe-statics -Xclang -fforce-mangle-main-argc-argv -mllvm -profile-guided-section-prefix=false -DNDEBUG  -g0 -Wall -Wextra -Oz 'src/vdu.c' -o 'obj/src/vdu.c.bc'
echo [lto opt] obj/lto.bc
[lto opt] obj/lto.bc
/home/chandler/CEDev/bin/ez80-link '/home/chandler/Documentos/agon-ce-c-toolchain/tests/vdu/obj/src/vdp_vdu.c.bc' '/home/chandler/Documentos/agon-ce-c-toolchain/tests/vdu/obj/src/vdu.c.bc' -o '/home/chandler/Documentos/agon-ce-c-toolchain/tests/vdu/obj/lto.bc'
/home/chandler/CEDev/bin/ez80-clang -S -mllvm -profile-guided-section-prefix=false -Wall -Wextra -Oz '/home/chandler/Documentos/agon-ce-c-toolchain/tests/vdu/obj/lto.bc' -o '/home/chandler/Documentos/agon-ce-c-toolchain/tests/vdu/obj/lto.src'
mkdir -p 'obj'
echo [convimg] description
[convimg] description
/home/chandler/CEDev/bin/convimg --icon-output 'obj/icon.src' --icon-format asm --icon-description "Ag C Toolchain Demo"
mkdir -p 'bin'
echo [linking] bin/vdu.bin
[linking] bin/vdu.bin
/home/chandler/CEDev/bin/fasmg -v1 '/home/chandler/CEDev/meta/ld.alm' -i 'DEBUG := 0' -i 'HAS_PRINTF := 1' -i 'HAS_LIBC := 1' -i 'HAS_LIBCXX := 1' -i 'PREFER_OS_CRT := 0' -i 'PREFER_OS_LIBC := 1' -i 'ALLOCATOR_STANDARD := 1' -i 'include "/home/chandler/CEDev/meta/linker_script"' -i 'range .bss $060000 : $09FFFF' -i 'provide __stack = $D1A87E' -i 'locate .header at $D1A87F' -i map -i 'source "obj/icon.src", "/home/chandler/CEDev/lib/crt/crt0.src", "obj/lto.src"' -i 'library "/home/chandler/CEDev/lib/libload/fatdrvce.lib", "/home/chandler/CEDev/lib/libload/fileioc.lib", "/home/chandler/CEDev/lib/libload/fontlibc.lib", "/home/chandler/CEDev/lib/libload/graphx.lib", "/home/chandler/CEDev/lib/libload/keypadc.lib", "/home/chandler/CEDev/lib/libload/msddrvce.lib", "/home/chandler/CEDev/lib/libload/srldrvce.lib", "/home/chandler/CEDev/lib/libload/usbdrvce.lib"'  bin/vdu.bin
flat assembler  version g.kaqg
/home/chandler/CEDev/meta/ld.alm [1568]:
	
macro ? [1295]:
	read source
:read? [14] (CALM)
assemble :temp [1]:
	include?! '../lib/libc/fclose.c.src'
/home/chandler/CEDev/meta/../lib/libc/fclose.c.src [43]:
	extern _mos_fclose
extern? [12] (CALM)
Error: symbol ':globals._mos_fclose' is undefined or out of scope.
make: *** [/home/chandler/CEDev/meta/makefile.mk:293: bin/vdu.bin] Error 2
  1. Testing the tests/exit example:
/home/chandler/Documentos/agon-ce-c-toolchain/tests/exit $ make V=1
mkdir -p 'obj/src'
echo [compiling] src/exit.c
[compiling] src/exit.c
/home/chandler/CEDev/bin/ez80-clang -MD -c -emit-llvm -nostdinc -isystem /home/chandler/CEDev/include -Isrc -fno-threadsafe-statics -Xclang -fforce-mangle-main-argc-argv -mllvm -profile-guided-section-prefix=false -DNDEBUG  -g0 -Wall -Wextra -Oz 'src/exit.c' -o 'obj/src/exit.c.bc'
src/exit.c:21:8: error: use of undeclared identifier 'EXIT_ABORT'
        exit( EXIT_ABORT );
              ^
1 error generated.
make: *** [/home/chandler/CEDev/meta/makefile.mk:340: obj/src/exit.c.bc] Error 1

How to Reproduce

  1. Download, build and install ez80-clang, ez80-link and fasmg
  2. Make a Symbolic Link to /home/$USER/CEDev/bin folder
  3. Add the directory to $PATH environment variable
  4. Clone the CE C/C++ Toolchain
  5. Clone AgDev repository
  6. Copy the root folder contents from AgDev repository to the CE C/C++ Toolchain folder
  7. Build the CE C/C++ Toolchain
  8. Install to /home/$USER/CEDev folder
  9. Build any example from tests folder

System Specs

                   -`                    chandler@pc-quarto 
                  .o+`                   ------------------ 
                 `ooo/                   OS: Arch Linux x86_64 
                `+oooo:                  Host: B450 I AORUS PRO WIFI 
               `+oooooo:                 Kernel: 6.7.1-arch1-1 
               -+oooooo+:                Uptime: 2 days, 3 hours, 22 mins 
             `/:-:++oooo+:               Packages: 1871 (pacman) 
            `/++++/+++++++:              Shell: zsh 5.9 
           `/++++++++++++++:             Resolution: 3840x2160 
          `/+++ooooooooooooo/`           DE: GNOME 45.3 
         ./ooosssso++osssssso+`          WM: Mutter 
        .oossssso-````/ossssss+`         WM Theme: Adwaita 
       -osssssso.      :ssssssso.        Theme: HighContrastInverse [GTK2/3] 
      :osssssss/        osssso+++.       Icons: Adwaita [GTK2/3] 
     /ossssssss/        +ssssooo/-       Terminal: kgx 
   `/ossssso+/:-        -:/+osssso+-     CPU: AMD Ryzen 7 3700X (16) @ 3.600GHz 
  `+sso+:-`                 `.-/+oso:    GPU: AMD ATI Radeon RX 6600/6600 XT/6600M 
 `++:.                           `-/+/   Memory: 5750MiB / 15912MiB 
 .`                                 `/

Parameter order in vdp_cursor_tab does different from what header file suggests.

In include/agon/vdp_vdu.h

void vdp_cursor_tab( int row, int col );

This implies first parameter is row, second parameter is column. AgDev 1.2.0 did implement the function that way, therefore consistent with the header file.

AgDev. 2.0.0 implements the parameter order reversed (first parameter is now column, second parameter is now row), but the header file has not changed. Breaking changes like this are never a good idea, especially when they are not documented. The header file must be consistent with the implementation..

The column, row order may be more consistent with the VDU command sequence (and BBC Basic TAB(x,y)), but please document it if this change was intentional. And keep it the same from now on!

Invalid executable in the fab-agon-emulator

Following the directions in the Readme.md to install the toolchain everything seems to be ok.
When compiling some code (args demo) it gives me (with the fab-agon-Emulator 0.9.11) Invalid executable.
I am using it in the following procedure:
1- Start the Emulator with: fab-agon-emulator --firmware quark (I am using the Official Quark VDP emulator as well) 2- Type *BYE to exit from BBC Basic 3- load args.bin 4-run &040000 Hello World Invalid executable

The code is compiling simply invoking the command: make
[compiling] src/args.c [lto opt] obj/lto.bc [convimg] description [linking] bin/args.bin [success] bin/args.8xp, 8462 bytes.

The same problem is with the bin or 8xp file.

Can you help me out?
Regards,
Gianluca

Clean up AgDev examples

There are four directories for these, and a few of them broke on newer VDP updates. In addition, some of them contain local (and outdated) copies of AgDev library files like vdp_vdu; this kind of defeats the point of having a toolchain in the first place!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.