Giter Club home page Giter Club logo

winuae's Introduction

WinUAE

  1. Requirements: Windows 7 32-bit/64-bit or newer.

  2. Visual Studio 2017 Community with the following feature: "Desktop Development with C++" with follow option: -"Support Windows XP for C++" -"Windows 8.1 SDK UCRT SDK" -"Windows 10 SDK 10.0.17763.0"

  3. Download and Install the Windows Driver Kit (WDK). 16299 (1709) or newer.

    Download Link -> https://docs.microsoft.com/en-us/windows-hardware/drivers/other-wdk-downloads

  4. Download the zip packages include and lib "winuaeinclibs.zip" and create the directory "c:\dev" and extract all. When finished you have "c:\dev\include" and "c:\dev\lib"

    Download Link -> https://download.abime.net/winuae/files/b/winuaeinclibs.zip

  5. Download WinUAE source packages and extract all (anywhere you want).

    Download Link -> https://github.com/tonioni/WinUAE/archive/.zip or (preferably) use git client.

  6. Download the zip package aros.rom.cpp.zip and extract into WinUAE source directory.

    Download Link -> https://download.abime.net/winuae/files/b/aros.rom.cpp.zip

  7. Download and Install Nasm (Assembler Compiler) and put it in PATH

    https://www.nasm.us/

  8. In Visual Studio click on "File"->"Open"->"Project/Solution" select the folder \od-win32\winuae_msvc15\winuae_msvc.sln (Ignore error message "Unsupported" and click ok)

  9. In The solution 'winuae_msvc' you can unload or delete the following projects (and all others not needed in step 12): -uaeunp -consolewrapper -decompess -fdrawcmd -ipctester -resourcedll -singlefilehelper -wix

  10. Change to 32-bit Release mode.

  11. Build following projects in following order: build68k genlinetoscr genblitter gencpu gencomp prowizard unpackers

  12. Switch to Test (debug build) or FullRelease (full optimized) and select either 32-bit or 64-bit. Compile.

Finished. In "D:\Amiga" you find winuae.exe and winuae64.exe

winuae's People

Contributors

dimitris-norce avatar emoon avatar falcon35180 avatar frodesolheim avatar germanaizek avatar huth avatar liv2 avatar michalsc avatar midwan avatar mikrosk avatar retrofun avatar rofl0r avatar skeetor avatar tonioni avatar vware avatar waccoon 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  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  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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

winuae's Issues

fs-uae relation

Hi,
Are there any plans to merge WinUAE and fs-uae into single repository? Or at least unify emulation core? For example, make some "libuae", which can be reused by both projects? I've raised similar question on fs-uae repo: FrodeSolheim/fs-uae#180

Handle NAN in fp_from_exten()

For systems without long double and if SOFTFLOAT_CONVERSIONS is not an option, I would like to extend the function
fp_from_exten(...) to handle NAN:

if(v == 0.0) {
...
} else if (fp_is_nan(v)) {
*wrd1 = 0x7fff0000;
*wrd2 = 0xffffffff;
*wrd3 = 0xffffffff;
return;
}

Possible crash at this point

WinUAE/memory.cpp

Line 1386 in fe78a1c

if (!memcmp (buffer, "KICK", 4)) {

This point has caused crashes in some cases, if the Kickstart file could not be opened.

I've implemented a small fix in Amiberry as follows, to overcome that:

BlitterStudio/amiberry@647f573

It would be great if you could add this upstream (unless you have a better solution of course) so we don't have to keep fixing it with future merges :)

Cannot compile without JIT define

LNK2019 unresolved external symbol "bool __fastcall check_prefs_changed_comp(bool)" (?check_prefs_changed_comp@@YI_N_N@Z) referenced in function "void __fastcall prefs_changed_cpu(void)" (?prefs_changed_cpu@@YIXXZ) winuae in newcpu.obj

winuae doesnt survive resizing of a vm window

i'm running winuae 2.4.1 in virtual box inside a winxpsp2 vm, and as soon as i resize the vbox window, the winuae screen gets black and stays that way.
winuae is run in windowed mode with 800x600.

Remote Debugger Support

Hi,

I posted this FrodeSolheim/fs-uae#63 over at fs-uae but after looking around a bit I noticed that you @tonioni has been doing some changes in debug.cpp so I thought you might have some ideas on how I should go about implementing this.

Cheers!

No access to click OK on dump screen

It's not possible to click OK on the crash/minidump screen when a crash has occured.
Win10 64bit
WinUAE 3.4.0 Beta 10 32bit (also happens in 3.3 release)

Invalid Joystick Axis handling for speedlink joystick

I've bought a speedlink Rocketeer Joystick recently and tried using it with WinUAE.
Unfortunately, no matter how i tried reconfiguring it, it only allowed me to move left and up - right and down movement was impossible.
At first I thought, that the joystick was damaged during the delivery, but then I tested it both with Windows USB Game Controllers Setup and also a few PC games native to Windows - it worked normally.

I took a peek at the code (inputdevice.cpp) and realized, that it assumes the following:

The joystick axis input (variable name: state) will either be a negative or a positive number. Negative numbers go left or up, positive numbers go down or right.

This assumption may not be true for all devices. As I tested the joystick in USB Game Controllers, it would show a value around 0 when the joystick was tilted left , 75 when it was centered and 150 when it was tilted fully right.

Proposed fix:
Adding an axis bias (or two, for X and Y separately) to input configuration added to the state variable would enable the user to calibrate such devices, greatly increasing the spectrum of supported joysticks.

inputdevice.cpp
else { /* "normal" joystick axis */ state += BIAS;

_wpgmptr is NULL

WinUAE crashes because of compare with _wpgmptr which is null. MSDN tells that this variable is deprecated now.

The V flag is cleared on the 68000 in some NBCD scenarios

it is:     [C:1; Z:0] -7a = 1f; XnzvC
should be: [C:1; Z:0] -7a = 1f; XnzVC
it is:     [C:1; Z:1] -7a = 1f; XnzvC
should be: [C:1; Z:1] -7a = 1f; XnzVC
it is:     [C:0; Z:0] -7b = 1f; XnzvC
should be: [C:0; Z:0] -7b = 1f; XnzVC
it is:     [C:0; Z:1] -7b = 1f; XnzvC
should be: [C:0; Z:1] -7b = 1f; XnzVC
it is:     [C:1; Z:0] -7b = 1e; XnzvC
should be: [C:1; Z:0] -7b = 1e; XnzVC
it is:     [C:1; Z:1] -7b = 1e; XnzvC
should be: [C:1; Z:1] -7b = 1e; XnzVC
it is:     [C:0; Z:0] -7c = 1e; XnzvC
should be: [C:0; Z:0] -7c = 1e; XnzVC
it is:     [C:0; Z:1] -7c = 1e; XnzvC
should be: [C:0; Z:1] -7c = 1e; XnzVC
it is:     [C:1; Z:0] -7c = 1d; XnzvC
should be: [C:1; Z:0] -7c = 1d; XnzVC
it is:     [C:1; Z:1] -7c = 1d; XnzvC
should be: [C:1; Z:1] -7c = 1d; XnzVC
it is:     [C:0; Z:0] -7d = 1d; XnzvC
should be: [C:0; Z:0] -7d = 1d; XnzVC
it is:     [C:0; Z:1] -7d = 1d; XnzvC
should be: [C:0; Z:1] -7d = 1d; XnzVC
it is:     [C:1; Z:0] -7d = 1c; XnzvC
should be: [C:1; Z:0] -7d = 1c; XnzVC
it is:     [C:1; Z:1] -7d = 1c; XnzvC
should be: [C:1; Z:1] -7d = 1c; XnzVC
it is:     [C:0; Z:0] -7e = 1c; XnzvC
should be: [C:0; Z:0] -7e = 1c; XnzVC
it is:     [C:0; Z:1] -7e = 1c; XnzvC
should be: [C:0; Z:1] -7e = 1c; XnzVC
it is:     [C:1; Z:0] -7e = 1b; XnzvC
should be: [C:1; Z:0] -7e = 1b; XnzVC
it is:     [C:1; Z:1] -7e = 1b; XnzvC
should be: [C:1; Z:1] -7e = 1b; XnzVC
it is:     [C:0; Z:0] -7f = 1b; XnzvC
should be: [C:0; Z:0] -7f = 1b; XnzVC
it is:     [C:0; Z:1] -7f = 1b; XnzvC
should be: [C:0; Z:1] -7f = 1b; XnzVC
it is:     [C:1; Z:0] -7f = 1a; XnzvC
should be: [C:1; Z:0] -7f = 1a; XnzVC
it is:     [C:1; Z:1] -7f = 1a; XnzvC
should be: [C:1; Z:1] -7f = 1a; XnzVC

v = cleared, V = set, C = input carry flag, Z = input zero flag

I.e. in those situations is the V flag incorrectly cleared. Please note that this applies only to the 68000, as mentioned in #127 the V flag must be ignored on 030+.

CD LED not working?

Hi.
I dont understand what i must do to get the CDRom LED working.
I tried to mount an ISO, also select Auto detect etc.
I tried to create a CD32 with an inserted CD but the LED doesn't work.
Also i try to boot an ccd Image. Winuae dont boot from ccd, only from the Image of the ccd file.

A README file about the project and compiling the source code

I suggest creating a little README.md text file about compiling the source code: what libs are needed, how to prepare compiling environment etc., because currently provided .sln files for VS aren't working OOTB and it's not intuitive to set up everything correctly (like ./configure && make in Linux).

I'm fighting with this repo around 5h and I get some basic errors like syntax error : missing ';' before '*' in sysdeps.h. I installed DirectX SDK, WDK, VS2010, all dependencies I could find for WinUAE, set includes... and I still can't manage basic errors. I don't mind modifying the source code.

Compiling this should be easy, but is a pain in the... rear.

Just look at FS-UAE repo, everything is described with a set of instructions.

fp debugger command doesn't work

Subj.
After entering command like "fp "program.exe"", debugger window should be closed, but it isn't.
And every following commands cannot be entered without debugger closing.

Then, debugger cannot be stopped at program.exe entry.

Seamless mode

JanusUAE (just for morphOS) has seamless mode. It would be great if this was available on other platforms so amiga apps such as deluxe paint could be ran as normal apps.

Bug in custom.cpp, immediate_copper()

I think, the line
if (cop_state.ip >= currprefs.chipmem_size && cop_state.ip < currprefs.z3chipmem_start && cop_state.ip >= currprefs.z3chipmem_start + currprefs.z3chipmem_size)
break;
should be replaced by
if ((cop_state.ip >= currprefs.chipmem_size && cop_state.ip < currprefs.z3chipmem_start) || cop_state.ip >= currprefs.z3chipmem_start + currprefs.z3chipmem_size)
break;
Otherwise, the result is always false and the intended check (ip inside of chipmem) wasn't done.

audio.cpp: wrong order when writing left/right channel

Comment says:
/* Always put the right word before the left word. */
and code in put_sound_word_right() just stores the sample (if mixedon) and the code in put_sound_word_left() handles the samples.
But in all sample handlers (i.e. sample16s_handler()), put_sound_word_left() is called before put_sound_word_right().
I think, correct calls are
put_sound_word_right (data2);
put_sound_word_left (data3);
instead of
put_sound_word_left (data2);
put_sound_word_right (data3);
(switch of data2 and data3 required, otherwise channels are switched).

Bug in ne2000.cpp

static addrbank ariadne2_bank = {
ariadne2_lget, ariadne2_wget, ariadne2_bget,
ariadne2_lput, ariadne2_wput, ariadne2_bput,
default_xlate, default_check, NULL, _T("*"), _T("NE2000"),
ariadne2_wget, ariadne2_lget, // <--------------- this should be ariadne2_lget,ariadne2_wget,
ABFLAG_IO | ABFLAG_PPCIOSPACE, S_READ, S_WRITE
};

CD32 - Changing CD and Resetting doesn't load the new CD

I found a bug in Amiberry, which seems to exist in WinUAE as well.

Steps to recreate:

  • Change Quickstart to CD32
  • Insert a CD32 game and start the emulator
  • After the game is loaded and starts, enter the GUI and change the CD to another one (e.g. another game)
  • Click Reset from the GUI
  • Instead of rebooting and loading the other game, it reboots and shows the CD32 boot screen instead
  • If you enter the GUI again, and click Reset one more time, the new game is loaded.

This seems to happen regardless of game chosen.
All settings were left at their defaults, just using Quickstart CD32 as mentioned above, to keep things simple.

Switch JIT and cycle-exact Chipset on/off via Hotkey/Joypad

Hi!
I would love to have a fast Workbench with the ability to switch the option JIT and cycle-exact chipset (DMA/Memopry-Accesses) AND/OR cycle-exact chipset (FULL) on and off with my Joypad while CPU Emulation speed stays at "fastest possible".
I do this manually all the time without any crashes and use it to have a fast Workbench with full WHD-LOAD compatibility. Having this option on a hotkey would be great!

cheers!

segfault when changing chipmemsize

happens in latest PUAE when changing chipmem size to 2048 kb from first call to gui_display

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7d659cc in free (p=0x7ffff5e9d020) at src/malloc/malloc.c:486
486             if (IS_MMAPPED(self)) {
(gdb) bt
#0  0x00007ffff7d659cc in free (p=0x7ffff5e9d020) at src/malloc/malloc.c:486
#1  0x00000000005659b6 in mapped_free (
    p=0x7ffff5e9d020 <Address 0x7ffff5e9d020 out of bounds>)
    at src/memory.c:1573
#2  0x0000000000565dbb in allocate_memory () at src/memory.c:1871
#3  0x0000000000566c63 in memory_reset () at src/memory.c:2176
#4  0x00000000005611a0 in reset_all_systems () at src/main.c:916
#5  0x0000000000483c2f in custom_reset (hardreset=true, keyboardreset=false)
    at src/custom.c:7798
#6  0x000000000057cb92 in m68k_go (may_quit=1) at src/newcpu.c:4218

1869            if (bogomem_bank.allocated != currprefs.bogomem_size) {
1870                    if (!(bogomem_bank.allocated == 0x200000 && currprefs.bogomem_size == 0x180000)) {
1871                            mapped_free (bogomem_bank.baseaddr);
1872                            bogomem_bank.baseaddr = NULL;
1873                            bogomem_bank.allocated = 0;

memory.cpp around line 1750 does

chipmem_bank.allocated = memsize1 + memsize2;
mapped_malloc (&chipmem_bank);
chipmem_bank.allocated = currprefs.chipmem_size;
bogomem_bank.baseaddr = chipmem_bank.baseaddr + memsize1;

so bogomem gets an offset into the mem allocated for chipmem.

however other parts of the code malloc the memory for bogomem directly:

1881                            if (bogomem_bank.allocated) {
1882                                    bogomem_bank.baseaddr = mapped_malloc (bogomem_bank.allocated, _T("bogo"));
1883                                    if (bogomem_bank.baseaddr == 0) {

so it seems that the code free'ing the bogomem cant be sure whether it deals with a chunk pointing into the middle of chipmem or a separate chunk. in the first case, calling free on the bogomem address is UB.

Add Beam Racing Algorithm for lagless VSYNC ON

UPDATE: Toni has released a WinUAE beta with this! Click here

The algorithm simple diagram:
Image

The algorithm documentation:
https://www.blurbusters.com/blur-busters-lagless-raster-follower-algorithm-for-emulator-developers/

Basically, ultra-high-page-flip-rate raster-synchronized VSYNC OFF with no tearing artifacts, to achieve a lagless VSYNC ON. Achievable using standard Direct 3D calls.

Ideally rendering to front buffer is preferred, but modern graphics cards can now do thousands of buffer swaps per second of redundant frame buffers (to simulate front buffer rendering) -- so this is achievable within the sphere of standard graphics APIs utilizing VSYNC OFF and access to the graphics card's current raster.

You'd map the real raster (e.g. #540 of 1080p) to the emulated raster (e.g. #120 of 240p) for beam chasing of scaled resolutions.

Basically, works with raster-accurate emulators (line-accurate or cycle-accurate) to simulate a rolling-window frame slice buffer, for synchronizing emulator raster to real world raster (tight beam racing).

EDIT: After I posted this, I have learned at least one other have simultaneously invented a (formerly-before-unreleased) jitter-forgiving beam-chasing algorithm, I'm happy to share due credit. I'm open sourcing a raster demo soon, keep tuned. (see subsequent posts)

custom.cpp

minfirstline = vsstop > vsstop ? vbstop : vsstop;

(vsstop) self compare = always false

Bug in lowres_set()

int old = lores;

Shouldn't this line be int old = lores_shift; instead?
Like this, the pfield_set_linetoscr(); will never be hit since the values are always equal to each other...

disk.cpp

typedef enum { DRV_NONE = -1, DRV_35_DD = 0, DRV_35_HD, DRV_525_SD, DRV_35_DD_ESCOM } drive_type;

but in disk_creatediskfile, we check if adftype == 4 (which we don't have)
old types = /* adftype: 0=DD,1=HD,2=DD PC,3=HD PC,4=525SD */

blitter.cpp - do_blitter2()

I think the line
blit_firstline_cycles = blit_first_cycle + (blit_diag[0] * blt_info.hblitsize + cpu_cycles) * CYCLE_UNIT;
should be replaced by
blit_firstline_cycles = blit_first_cycle + (blit_diag[0] * blt_info.hblitsize) * CYCLE_UNIT + cpu_cycles;
because cpu_cycles are already scaled by CYCLE_UNIT.

adide.cpp doesnt compile

  • struct ide_hdf is not defined in gayle.h
  • if one makes it available (by moving it from gayle.cpp to gayle.h), there's no member called "status"
    should this file be removed ? it seems unused.

Bug in fill_line_16()

if (((uintptr_t)&b[start]) & 1)
should be
if (((uintptr_t)&b[start]) & 3)
and
if (((uintptr_t)&b[stop]) & 1) {
should be
if (((uintptr_t)&b[stop]) & 3) {

Otherwise you write one pixel too much if start is even and stop is odd.
If you are at the end of the buffer, you write in not allocated mem.

ReSource launch error

I'm using AmiKit with WinUAE. I have installed ReSource 6.06.
But, after launching it, I'm getting such screen:
2016-05-16_124659

What should I check for, to launch it normally?

Crash when changing JIT settings and rebooting

I have a crash I can recreate always, along with some "strange" behavior regarding the JIT settings.

WinUAE version 3.5.0 x64, from the official installer package. Running on Windows 10 x64 with the latest updates.

I have a config to emulate a CStormPPC (though I only use the 060 part), boot in a default Workbench 3.1 installation with no extras. I use it to run Lightwave.

Here's a screenshot of my CPU and FPU settings:
image

Booting into Workbench works fine, but opening up the WinUAE window again shows that "Direct" mode has been changed to "Indirect". Changing it back to Direct, does not stick (it switches back).
However, disabling JIT completely and then re-enabling it, allows Direct to stay on.
That's one part of the strange behavior.

Part two, is that if right after disabling/enabling JIT and enabling Direct, you try to reboot the Amiga with the keyboard (Ctrl-A-A), then WinUAE crashes. Every time.

Let me know if you'd like more info to help troubleshoot this (e.g. config file, other system details, etc)

Bug in record_color_change2()

I think the lines
if (value & 0xff00)
thisline_decision.xor_seen = true;
should be placed inside of
if (regno == 0x1000 + 0x10c) {
...
}
Otherwise the flag xor_seen is set for each register with bits set in 0xff00 and not only for BPLCON4.

Breakpoints are breaking execution context

"z" or "t" command after landing at some breakpoint, doesn't work. It throws many exceptions in debugger console, looses current state, and program continues executes without a debugger, then finishes its execution.

After some investigation:

/* ORSR.W #<data>.W */
uae_u32 REGPARAM2 CPUFUNC(op_007c_11)(uae_u32 opcode)
{
    int count_cycles = 0;
    {if (!regs.s) { Exception (8); goto l_110018; }

It is strange, that on the same commands, stepping doesn't execute "uae_u32 REGPARAM2 CPUFUNC(op_007c_11)(uae_u32 opcode)" function. It looks like the execution context of other threads breaks with execution context of my program.

'z' debugger command works incorrect

case 'z':
			skipaddr_start = nextpc;
			skipaddr_doskip = 1;
			do_skip = 1;
			exception_debugging = 1;
			return true;

in case of branches, or returns skipaddr_start will point at the next (in listing) instruction, but not at actual next address.
This case should be rewritten to skip branches, jumps, and returns and execute them as the regular step.

Concatenating mismatched strings (expansion.cpp)

When compiling with Visual Studio, I'm getting an error C2308 here (line 2568):
{ // 16 - 18
_T("Memory\0""1M\0""2M\0""4M\0""8M\0""16M\0""32M\0"),
_T("memory\0""1M\0""2M\0""4M\0""8M\0""16M\0""32M\0"),
true, false, 0
},

Maybe it will be better to refactor these lines with getting every part of string in _T() macros like this?
_T("Memory\0") _T("1M\0") _T("2M\0") _T("4M\0") _T("8M\0") _T("16M\0") _T("32M\0"),
_T("memory\0") _T("1M\0") _T("2M\0") _T("4M\0") _T("8M\0") _T("16M\0") _T("32M\0"),

Bug in disk.cpp, save_disk2(...)

The line
dstbak = dst = xmalloc (uae_u8, 2 + 4 + 2 + 4 + 4 + size);
should be replaced by
dstbak = dst = xmalloc (uae_u8, 4 + 2 + 4 + 2 + 4 + 4 + size + 2);
to get real size of required memory.

zfile_archive.cpp: Possible issue in function archive_directory_tar

Sorry, I might be wrong about this but the block array in function "archive_directory_tar" does not necessarily contain a null byte after reading contents from a file. Therefore the call of "strcat (name, (char*)block);" might call a segmentation fault. At least it did for me :) I have tried to resolve the problem using "memcpy(name, (char*)block, 512);" and it seems to work.

Bug in inputdevice.cpp, read_inputdevice_config(...)

In part
if (!strcasecmp (p, _T("keyboard_type"))) {
cfgfile_strval (option, value, NULL, &pr->input_analog_joystick_offset, kbtypes, 0);
keyboard_default = keyboard_default_table[pr->input_keyboard_type];
inputdevice_default_kb_all (pr);
}
should "&pr->input_analog_joystick_offset" be replaced by "&pr->input_keyboard_type".

Bug in m68k_divl() ?

I think you should call Exception_cpu(5) instead of Exception(5) in case of div by zero.

Bugs in fpp_native.cpp (?)

In functions fp_div(...) and fp_sqrt(...)
fp_reset_prec(b);
should be replaced by
fp_reset_prec(a);

Otherwise, the argument gets rounded, not the result.

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.