etchedpixels / fuzix Goto Github PK
View Code? Open in Web Editor NEWFuzixOS: Because Small Is Beautiful
License: Other
FuzixOS: Because Small Is Beautiful
License: Other
How do you would like a hybrid of a MMU/bank switch that could be used on nearly any Z80/8080 machine ?
Some time ago, we had and idea to allow to plug an 8/16 bit CPU to the Trillek computer (an virtual "toy" computer with an 24 bit address bus). This :
Well, looks that Mcleod_idefix had make an implementation on a CPLD
The concept is an little board with the CPLD, a Z80 and a RAM module or a bus connector that allow to expand the RAM of any Z80 computer with a very flexible bank scheme with 4 KiB banks, and is controlled by four I/O ports.
I think that FUZIX could exploit this idea very well if it is build. What do you think ?
There is a CP/M emulator for Z80 target. DOS emulator for x86 target would be good idea. FreeDOS is native to 8086 and under GPLv2, thus, only needed piece remaining is a loader and TSR to access FUZIX services.
Mega 65 (information http://mega65.org ) (HDL sources: https://github.com/gardners/c65gs/ ), implemented in VHDL, is a new Commodore 64 compatible target and supports some usable extensions, such as:
We can't optimise switchout in this case (we don't know who will run next) but we can avoid the copy back IFF it turns out that the next process is the one we ran last.
So I'm porting Fuzix to a modern microcontroller which has issues with unaligned accesses. I've found that _uputw and _ugetw are both implemented as a simple read of a uint16_t*. The argv and envp structure laid out by create_init() are placed at an unaligned address, causing failure.
(What actually happens on my platform is that the value is read/written to (address & ~1), with hilarious results.)
This is easy enough to fix --- I just rearranged the structure so that the argv and envp pointers go before the string. But I've noticed some other alignment issues elsewhere --- the most egregious is the FZX1 binary format, where the entire header is at an offset of 3 due to the leading jump instruction. Might it be worth changing this to be more alignment-friendly? I take it the reason for the leading jmp instruction is CP/M compatibility; is that still desirable?
sfdisk is to fdisk how sed is to ed. As it has no interactive operation, its code is simpler and smaller than fdisk.
The code in _rd_memcpy needs to be taught how to handle user pages so we can kill off CONFIG_LEGACY_EXEC
To work on a small box with potentially very slow disk (eg floppies) we need a version of /usr/games/fortune that
FUZIX currently supports English only. GNU gettext supports localisation using .po and .mo files. With gettext, we will get proper message translation.
This seems to treat the bit patterns in the reverse of the other ports. It ought to be fixed so that the KBGETMAP ioctl always returns a mask of down bits.
There is a little of documentations on FUZIX. More documentation will make fork and distribution maintainers' job easier.
I am observing the same source might compile to a binary that crashes in different places during boot depending on max-allocs-per-node build option and on the placement of kprintf's (a build with debug enable in process runs further than one without debug enabled).
do you also see this?
mount reports things like mount: Not a typewriter, or mount: /etc/mtab: not a typewriter, but in fact works
From a straight boot doing "mkdir /mnt" gives an error and creates an empty file with 0 perms.
Doing a follow up rm /mnt and mkdir /mnt re-creates it correctly as a directory
Logo and nicely typesetted documentation needed.
The C128 has 128k RAM and a Z80 CPU with 4MHz (on newer models with VIC-II disabled), backed by a 6502-compatible "co-processor" in Z80/CPM mode, so it should theoretically be possible to run FUZIX on it.
Need a script to build a minimalist file system. Some of our machines only have 40 track floppies.
I don't like edit directly "Platafom Notes" without asking first :
I did some changes on my fork that adds extra information of the Spectrum models. On particular, about banking schemes and the most common floppy interfaces.
On the TRS80 mounting /dev/fd0 and then doing "df" crashes
Reproducable if you try and build a Memotech 40 track image or similar
First of all, thanks for all your efforts!
I'm trying to prepare a nc100 card image for playing around with it in nc100em. I will also try it on my real NC100 once I get my hands on one of these expensive PCMCIA memory cards. I'm relatively new to z80 programming and the FUZIX build process is very poorly documented, so please excuse any stupid mistakes on my side.
I am running Ubuntu 10.04 with a hand-built SDCC:
SDCC : z80/z180/gbz80 3.4.3 #9201 (Mar 29 2015) (Linux)
So far I think I've managed to build the kernel "image" (fuzix.bin). First a few remarks on the nc100 kernel build process:
nc100.def
is missing. Given the commit log, I assume it must contain something like VIDEO_BASE .equ 0x7000
, VIDEO_BASEH .equ 0x7000
(what's that for, anyway?) and VIDEO_SIZE .equ 0x1000
. You should also add the corresponding nc200.def
.Kernel/platform-nc100/Makefile
image-target refers to bootblock.cim
. This looks like it must be generated from bootblock.s
with zmac
. Any reason for not adding this step as a Makefile rule?dd if=bootblock.cim of=../fuzix.bin bs=1 seek=256 conv=notrunc
If I understand correctly, the fuzix.bin
is already a PCMCIA card image, albeit incomplete. Something like a rootfs should be added. I see that this can be done with the mkfs
and ucp
tools from the Standalone
subdirectory. But in reality I assume that the Standalone/filesystem-src/build-filesystem
script should be used instead of doing it manually. This needs all of the user space tools of course. Unfortunately, the Applications/util/Makefile
won't just work. Right, we need a toolchain first! It appears to be hidden in Library/
. Just making it however does not appease the Applications/util
build proces as it's referring to files in /opt/fcc/
. So I followed the not-so-outdated instructions from the wiki. I think it should be renamed to "Building the toolchain". But now I get the following build errors from Applications/util/Makefile
:
$ make
../../Library/tools/fcc -O2 -c banner.c
../../Library/tools/fcc -O2 banner.rel -o banner
?ASlink-Warning-Undefined Global '_strcpy' referenced by module 'vfprintf'
?ASlink-Warning-Undefined Global '_strcpy' referenced by module 'ltostr'
?ASlink-Warning-Undefined Global '__modulong' referenced by module 'ltostr'
?ASlink-Warning-Undefined Global '__divulong' referenced by module 'ltostr'
?ASlink-Warning-Undefined Global '___sdcc_call_hl' referenced by module 'atexit'
?ASlink-Warning-Undefined Global '_strcat' referenced by module 'vfprintf'
?ASlink-Warning-Undefined Global '_strlen' referenced by module 'banner'
?ASlink-Warning-Undefined Global '_strlen' referenced by module 'vfprintf'
?ASlink-Warning-Undefined Global '___sdcc_enter_ix' referenced by module 'banner'
?ASlink-Warning-Undefined Global '___sdcc_enter_ix' referenced by module 'printf'
?ASlink-Warning-Undefined Global '___sdcc_enter_ix' referenced by module 'stat'
?ASlink-Warning-Undefined Global '___sdcc_enter_ix' referenced by module 'atexit'
?ASlink-Warning-Undefined Global '___sdcc_enter_ix' referenced by module 'vfprintf'
?ASlink-Warning-Undefined Global '___sdcc_enter_ix' referenced by module 'fflush'
?ASlink-Warning-Undefined Global '___sdcc_enter_ix' referenced by module 'lseek'
?ASlink-Warning-Undefined Global '___sdcc_enter_ix' referenced by module 'ltostr'
?ASlink-Warning-Undefined Global '___sdcc_enter_ix' referenced by module 'fputc'
?ASlink-Warning-Undefined Global '__modsint' referenced by module 'banner'
make: *** [banner] Error 1
Seems like it doesn't properly link against FUZIX' libc. Any idea why?
Once I get the user space utilities to build and assembled them with build-filesystem
, I guess I will have to write it into the fuzix.bin
as explained by the nc100 README:
dd if=myfs of=mycard.img bs=16384 seek=20 conv=notrunc
The resulting image should be suitable as a nc100.card
image for nc100em, right?
The nc100emu.s
can then be assembled and used a "boot script" as in
xnc100em nc100emu.cim
Btw. nc100emu.s cannot be assembled with zmac
as claimed in the README. But I got it to compile with SDCC's assembler (see bcec50f), linked with sdcc and converted the intel hex file:
sdasz80 nc100emu.s
sdcc --no-std-crt0 -mz80 nc100emu.rel
objcopy -Iihex -Obinary nc100emu.ihx nc100emu.cim
In case that's right, there should be a Makefile rule for it.
A few questions remain:
Once I get this sorted out I can also fork and send you a pull-request with the changes discussed above.
Scrub the 3 clause BSD functions from libc
Most inits have a way to set up boot up services in either the imperative (shellscripts) or the declarative way. FUZIX init lacks this. I had made a PR about this along with a security patch on login #70.
Pre-emption hangs switching back to the shell side of a fork in certain cases
(may be linked to swap fail ? but seen without swapping)
Possibly in/out of kernel value incorrect ??
On m68k platform, FUZIX and Linux can coexist. We will need either of those:
a)Chainloader which loads FUZIX
b)Boot manager to choose among Linux and FUZIX plus (a)
c)GRUB compatible kernel image
mkfs -X creates a big endian file system (or seems to)
fsck should automatically switch endianness when checking it and work but is reported to fail
ucp does not support 'wrong endian' operation
Probably what we want is not to fix ucp (which is really hard) but to add a 'swapendian' tool which switches the endianness of all superblock multi-byte fields, all inode multi-byte fields, and then walks the block free list and the blocks and indirects off each inode that is a file or directory and fixes those up too as well as block 0 of device nodes.
The start.c code should have an accompanying platform/discard.c which parses non standard devices by name.
It should also pass any further argument string onto init so you can do things like boot "hd0 s"
The current argument array is also not 16bit aligned so will cause problems on some future ports and wants realigning
SDCC is single-pass and cannot perform optimisations. Z80 targets may have smaller and faster binaries if we switch to LLVM toolchain for Z80.
See: https://github.com/earl1k/llvm-z80
I am trying to build a kernel image for z80pack. There seems to be some error from the sdcc compiler and I'm not sure what to do about it.
$ make
rm platform
ln -sf platform-z80pack platform
/Applications/Xcode.app/Contents/Developer/usr/bin/make -C platform-z80pack
make[1]: Nothing to be done for `all'.
sdcc -c --std-sdcc99 --no-std-crt0 -mz80 -I/Users/n6il/Development/Fusix/FUZIX/Kernel/cpu-z80 -I/Users/n6il/Development/Fusix/FUZIX/Kernel/platform-z80pack -I/Users/n6il/Development/Fusix/FUZIX/Kernel/include --max-allocs-per-node 30000 --opt-code-size --Werror --stack-auto --constseg CONST --codeseg CODE2 syscall_proc.c
Internal error: validateLink failed in SPEC_NOUN(type) @ /Users/sdcc-builder/build/sdcc-build/orig/sdcc/src/SDCCcse.c:1667: expected SPECIFIER, got DECLARATOR
make: *** [syscall_proc.rel] Error 1
I played around a bit and figured out it is line 257 of the waitpid function in syscall_pid.c
252 int16_t _waitpid(void)
253 {
254 ptptr p;
255 int retval;
256
257 if (statloc && !valaddr((char *) statloc, sizeof(int))) {
258 udata.u_error = EFAULT;
259 return (-1);
260 }
261
This is so simple I have no idea why the compiler is barfing on this.
#define statloc (int *)udata.u_argn1
if (statloc
if ((int *)udata.u_argn1
I have the 11/04 snapshot of SDCC
$ sdcc -v
SDCC : mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8 3.4.1 #9093 (Nov 4 2014) (Mac OS X i386)
published under GNU General Public License (GPL)
and just pulled the latest FUZIX code.
commit 3faa2dff49c39b2a9fa59009b84a398912dd1be0
Author: Alan Cox <[email protected]>
Date: Fri Nov 7 20:51:12 2014 +0000
msx1: memory mapping and other logic
The game which displays speech bubbles, companion of fortune. A version written in C preferred.
We now have proper monotonic system time, so sleep() should use this but that means making sure the libc code discovers the platform HZ value nicely and stuffs it somewhere at setup.
Currently we don't guarantee that any buffers are flushed on the final umount of a disk. If you change floppies the only thing avoiding disaster is that fact we have so few buffers.
I have seen 16-bit address type in 8086 test code, probably remnant of 8-bit code. As you know, x86 has four overlappable segment selectors. We should document our kernel code segment and free space. malloc()/mmap() needs to be reworked to return "far" pointers on 8086 because sometimes 8086 programs use more than 64K. What about other system calls and stack segment? Are there any plans for common stack allocator?
Review this for Z80 and 6502 platforms
I tried building FUZIX for zhe z80pack simulator by following this guide
However, it looks like the boot floppies are not built correctly:
root@kubuntu:/usr/src/FUZIX/Kernel/platform-z80pack# ./createdrives
Making filesystem on device drivea.cpm with isize 8 fsize 390.
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Making filesystem on device drivei.cpm with isize 64 fsize 8192.
Opening drivei.cpm sd0
fd=3, dev_offset = 0
Opening drivea.cpm sd0
Opening drivea.cpm sd0
Opening drivea.cpm sd0
fd=3, dev_offset = 0
fd=3, dev_offset = 0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
Fuzix UCP version 1.1ac. Type ? for help.
Fuzix UCP version 1.1ac. Type ? for help.
Opening drivea.cpm sd0
Opening drivea.cpm sd0
fd=3, dev_offset = 0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
i_open: bad disk inode
mkdir: mknod error 0
Fuzix UCP version 1.1ac. Type ? for help.
i_open: bad disk inode
mkdir: mknod error 0
Opening drivea.cpm sd0
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
cd: error number 20
chmod cat to 755
chmod: can't stat file 'cat': 2
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
cd: error number 20
i_open: bad disk inode
Can't open destination file './../../Applications/util/cp'; error 0
Opening drivea.cpm sd0
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Opening drivea.cpm sd0
Fuzix UCP version 1.1ac. Type ? for help.
cd: error number 20
chmod df to 755
chmod: can't stat file 'df': 2
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
Opening drivea.cpm sd0
Opening drivea.cpm sd0
Opening drivea.cpm sd0
fd=3, dev_offset = 0
fd=3, dev_offset = 0
Opening drivea.cpm sd0
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
cd: error number 20
chmod cp to 755
chmod: can't stat file 'cp': 2
Opening drivea.cpm sd0
fd=3, dev_offset = 0
fd=3, dev_offset = 0
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
cd: error number 20
Opening drivea.cpm sd0
fd=3, dev_offset = 0
fd=3, dev_offset = 0
cd: error number 20
Fuzix UCP version 1.1ac. Type ? for help.
Fuzix UCP version 1.1ac. Type ? for help.
i_open: bad disk inode
mkdir: mknod error 0
cd: error number 2
i_open: bad disk inode
_mknod: error 0
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
cd: error number 20
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
Opening drivea.cpm sd0
cd: error number 20
Opening drivea.cpm sd0
Opening drivea.cpm sd0
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Opening drivea.cpm sd0
Opening drivei.cpm sd0
fd=3, dev_offset = 0
Opening drivei.cpm sd0
Opening drivei.cpm sd0
fd=3, dev_offset = 0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
Fuzix UCP version 1.1ac. Type ? for help.
cd: error number 2
chmod mkfs to 755
chmod: can't stat file 'mkfs': 2
cd: error number 2
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Opening drivea.cpm sd0
Fuzix UCP version 1.1ac. Type ? for help.
cd: error number 20
i_open: bad disk inode
Can't open destination file './../../Applications/util/df'; error 0
Fuzix UCP version 1.1ac. Type ? for help.
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
cd: error number 20
Fuzix UCP version 1.1ac. Type ? for help.
Fuzix UCP version 1.1ac. Type ? for help.
Opening drivea.cpm sd0
chmod init to 755
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
cd: error number 20
Fuzix UCP version 1.1ac. Type ? for help.
cd: error number 20
i_open: bad disk inode
Can't open destination file './../../Applications/util/ln'; error 0
Opening drivei.cpm sd0
chmod fdisk to 755
fd=3, dev_offset = 0
...
Can't open destination file './../../Applications/util/ed'; error 0
Can't open destination file './../../Applications/util/patchcpm'; error 0
i_open: bad disk inode
chmod passwd to 755
Can't open destination file './../../Applications/util/sed'; error 0
chmod: can't stat file 'passwd': 2
chmod mkdir to 755
Can't open destination file './../../Applications/util/grep'; error 0
Can't open destination file './../../Applications/util/passwd'; error 0
chmod: can't stat file 'grep': 2
chmod: can't stat file 'mkdir': 2
45346+0 records in
45346+0 records out
45346 bytes (45 kB) copied, 0,127427 s, 356 kB/s
390+0 records in
390+0 records out
199680 bytes (200 kB) copied, 0,00152064 s, 131 MB/s
0+1 records in
0+1 records out
128 bytes (128 B) copied, 0,00019373 s, 661 kB/s
z80pack drives "drivea.cpm" and "drivei.cpm" successfully generated
Trying to run the images on the emulator gives the following:
root@kubuntu:/usr/src/z80pack-1.26/cpmsim# ./cpmsim
####### ##### ### ##### ### # #
# # # # # # # # ## ##
# # # # # # # # # # #
# ##### # # ##### ##### # # # #
# # # # # # # # #
# # # # # # # # # #
####### ##### ### ##### ### # #
Release 1.26, Copyright (C) 1987-2015 by Udo Munk
CPU speed is unlimited
Booting...
-
FUZIX version 0.1
Copyright (c) 1988-2002 by H.F.Bower, D.Braun, S.Nitschke, H.Peraza
Copyright (c) 1997-2001 by Arcady Schekochikhin, Adriano C. R. da Cunha
Copyright (c) 2013-2015 Will Sowerbutts <[email protected]>
Copyright (c) 2014-2015 Alan Cox <[email protected]>
Devboot
480kB total RAM, 416kB available to processes (15 processes max)
Enabling interrupts ... ok.
bootdev: 0
Mounting root fs (root_dev=0): OK
Starting /init
panic: no /init
System halted, bye.
The files in Applications/util get built correctly, in fact everything up to the createdrives
script runs without errors.
Any ideas what's going wrong? I tried using ucp directly:
root@kubuntu:/usr/src/FUZIX/Kernel/platform-z80pack# ../../Standalone/ucp drivea.cpm
Opening drivea.cpm sd0
fd=3, dev_offset = 0
Fuzix UCP version 1.1ac. Type ? for help.
unix: ?
UCP commands:
?|help
exit|quit
dir|ls [path]
cd path
mkdir dirname
mknod name mode dev#
chmod mode path
[b]get sourcefile [destfile]
[b]put uzifile
type|cat filename
dump filename
rm path
rmdir dirname
df
mount dev# path
umount path
unix: ls
drwxrwxrwx 6 1 512 Apr 27 115 8:54 ./
drwxrwxrwx 6 1 512 Apr 27 115 8:54 ../
---------- 1 46 0 bin
drwxrwxrwx 2 44 512 Apr 27 115 8:54 root/
drwxrwxrwx 2 43 512 Apr 27 115 8:54 usr/
-rw-rw-rw- 1 42 7000 Apr 27 115 8:54 init
-rwxr-xr-x 1 41 14221 Apr 27 115 8:54 fdisk
brw-r--r-- 1 40 256 Apr 27 115 8:54 hda
crw--w--w- 1 37 1026 Apr 27 115 8:54 zero
unix: cd bin
cd: error number 20
unix: rm bin
unix: mkdir bin
unix: cd bin
unix: bget ../../Applications/util/init
i_open: bad disk inode
Can't open destination file '../../Applications/util/init'; error 0
unix: ls
drwxrwxrwx 2 46 512 Apr 27 115 8:55 ./
drwxrwxrwx 7 1 512 Apr 27 115 8:55 ../
unix: cd ..
panic: inode freed.
root@kubuntu:/usr/src/FUZIX/Kernel/platform-z80pack#
Hi! I'm SirCmpwn, from the KnightOS project, which is another operating system for z80.
We have a fork of SDCC that only supports z80 and that we're hoping to use as the foundation for a better C compiler for z80. You can check it out here: https://github.com/KnightOS/kcc
We are also working on replacing our home-grown assembler with a better home-grown assembler. The new assembler will aim to replace sdas and sdld, both of which are pretty gross. I think there's a good chance for collaboration between us! Want to switch to kcc and help us improve it?
FUZIX currently lacks an utility to shutdown or reboot the system safely. I understand, we have no APM on most of the targets, yet anyway could we implement a utility that does:
Figure out which we are using as the default binding (^H seems favoured), standardize it in the keymaps and fix the default tty termios accordingly
I'm trying to load the fuzix.bin, obtained by platform-pcw8256 compilation, in Joyce but it says "bad format".
I suppose that I should create some boot disk in dsk format with fuzix.bin as kernel and some tools and libs in the rest of the disk.
Do you have a recipe to make such an image?
Thanks
Which one is the FUZIX model? Release when ready or release at a certain interval?
Something in the swap changes probably broke TRS80 swapping
tcflow is a stub in libc and needs implementing
We need to distinguish between 'busy', 'flow controlled' and 'empty'
We need to look at switching between polled and sleeping intelligently based on system speed and baud rate
We need tty_putc to lock so that vt_foo doesn't have to hold IRQs off (we can pick up the 'stray' byte in the unlock and process it there)
POSIX 1:2008 has posix_spawn() as a means to create new processes from scratch without the copy overhead of fork(). It has a parameter list like exec(), but acts on a new process instead of manipulating current one. Spawning is less resource intensive than forking. So we should use spawn internally, however, continue providing fork to external users for compatibility.
Tormod's keyboard fixes need to be propogated to all relevant platforms
Keyboard layout is hardcoded as QWERTY on zx128 code. I want to add Turkish F layout, but it does not fit.
Reads all the entries then shows only init
Made pull request.
It would be nice to find a way to avoid this, more likely however we need a way to make ps either
build to match the kernel or pick up the needed property info from somewhere at runtime
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.