tomm / fab-agon-emulator Goto Github PK
View Code? Open in Web Editor NEWAgon Light, Agon Light 2, Agon Console8 Emulator for Linux, Windows, any system with libSDL
License: GNU General Public License v3.0
Agon Light, Agon Light 2, Agon Console8 Emulator for Linux, Windows, any system with libSDL
License: GNU General Public License v3.0
Do you plan to support the VGADirectController? Would love to use the emulator during development of ElectronHAL/OS. I use VGADirectController to implement the virtual TMS9918 videochip in HAL.
The build works ok but the binary crashes with this massage
If you copy the 0.9.4 binary over it works fine over all these releases.
After getting your last changes I noticed that on my Mac the emulator was crashing at startup:
I noticed this was due to SDL::initialisation is now happening on a separate UI thread. According to the SDL folks this is not recommended.
When reverting back to running on the main thread everything works again:
It's quite useful to have the option to put a breakpoint in your source code. Saves faffing about looking up addresses, you can just inline in code.
One option is to break on an opcode e.g. $76 (HALT). Another way (the TI84 CEmu emulator does it this way) is to trigger it with a write to $FFFFFF
Many thanks, Paul.
AgonLight Emulator only launchs from terminal
agonlight.desktop
entry into /usr/share/applications
or ~/.local/share/applications
folders with:[Desktop Entry]
Type=Application
Name=Fab Agon Light Emulator
GenericName=Agon Light 2 Emulator
Path=$USER/Documents/fab-agon-emulator
Exec=$USER/Documents/fab-agon-emulator/fab-agon-emulator --fullscreen
Comment=Agon Light 2 Emulator
Icon=$USER/Images/icons/agonlight2.png
Terminal=true
.desktop
entry to:[Desktop Entry]
Type=Application
Name=Fab Agon Light Emulator
GenericName=Agon Light 2 Emulator
Path=$USER/Documents/fab-agon-emulator
Exec=$USER/Documents/fab-agon-emulator/fab-agon-emulator --fullscreen
Comment=Agon Light 2 Emulator
Icon=$USER/Images/icons/agonlight2.png
Terminal=false
The app should launch with option Terminal=false
-` 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: 15 hours, 31 mins
`/:-:++oooo+: Packages: 1868 (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: 6802MiB / 15912MiB
.` `/
Hi,
sysvar_mouseX & sysvar_mouseY return random values on the 0.9.2 emulator version.
; get mouse data
; outputs:
; de: x
; hl: y
; a: buttons
get_mouse:
; get the mouse position
vdu 23
vdu 0
vdu $89
vdu 0
; moscall to get data
moscall mos_sysvars
; get mouse data
ld de,$000000
ld hl,$000000
ld e,(ix+sysvar_mouseX)
ld d,(ix+sysvar_mouseX+1)
ld l,(ix+sysvar_mouseY)
ld h,(ix+sysvar_mouseY+1)
ld a,(ix+sysvar_mouseButtons)
ret
Well, that was a short-lived joy. The emulator cannot be built on a Linux box. Firstly, the funky error 'GIT_DISCOVERY_ACROSS_FILESYSTEM not set' and a 'git init' will not save the day. Secondly, manually downloading the zip files will not help because it will crash the make program.
A zip file containing everything to build is far easier than messing around with git.
If you do log in on "git" you will be able to solve the problem with the GIT_DISCOVIRY_ โฆ' error there is the next surprise waiting for you:
make -C userspace-vdp-gl/src
make[1]: *** userspace-vdp-gl/src: No such file or directory. Stop.
make: *** [Makefile:15: userspace-vdp-gl/vdp_gl.a] Error 2
Now building ok with my update Makefile
App crashes @rpath LC_RPATH issue.
% ./fab-agon-emulator
dyld[3076]: Library not loaded: @rpath/libSDL2-2.0.0.dylib
Referenced from: /Users/snake/Documents/GitHub/tomm/fab-agon-emulator/fab-agon-emulator
Reason: no LC_RPATH's found
zsh: abort ./fab-agon-emulator
thread 'main' panicked at src/vdp_interface.rs:42:77:
called Result::unwrap()
on an Err
value: LoadLibraryExW { source: Os { code: 193, kind: Uncategorized, message: "%1 is not a valid Win32 application." } }
note: run with RUST_BACKTRACE=1
environment variable to display a backtrace
when I try to execute, I get this error:
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: DlOpen { desc: "./firmware/vdp_console8.so: cannot open shared object file: No such file or directory" }', src/vdp_interface.rs:42:77
stack backtrace:
0: rust_begin_unwind
1: core::panicking::panic_fmt
2: core::result::unwrap_failed
3: fab_agon_emulator::vdp_interface::init
4: fab_agon_emulator::main```
Compiling fab-agon-emulator v0.7.5 (C:\Users\busyr\Downloads\fab-agon-emulator-main\fab-agon-emulator-main)
error: failed to run custom build command for fab-agon-emulator v0.7.5 (C:\Users\busyr\Downloads\fab-agon-emulator-main\fab-agon-emulator-main)
Caused by:
process didn't exit successfully: C:\Users\busyr\Downloads\fab-agon-emulator-main\fab-agon-emulator-main\target\release\build\fab-agon-emulator-292c5b592f41ba87\build-script-build
(exit code: 101)
--- stderr
thread 'main' panicked at build.rs:4:35:
failed to build VDP: Error { kind: NotFound, message: "program not found" }
note: run with RUST_BACKTRACE=1
environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...
Make fails with undefined reference to `pthread_create' for me.
OS: Debian 11.8
gcc version: gcc (Debian 10.2.1-6) 10.2.1 20210110
Adding -pthread
to the flags in src/vdp/Makefile and adding the flags to the instructions for test_main makes it compile although I am uncertain if there are any potential side effects and if it might not be better to simply add -pthread
to test_main to minimise the scope. I'll leave that to your judgement.
diff --git a/src/vdp/Makefile b/src/vdp/Makefile
index c0c0d09..7c394e5 100644
--- a/src/vdp/Makefile
+++ b/src/vdp/Makefile
@@ -1,5 +1,5 @@
CXX ?= g++
-CFLAGS = -Wall -O2 -fmax-errors=1 -std=c++11 -g -I. -I./dispdrivers -I./userspace-vdp-gl/src -I./userspace-vdp-gl/src/userspace-platform -I./userspace-vdp-gl/src/dispdrivers
+CFLAGS = -Wall -O2 -fmax-errors=1 -std=c++11 -pthread -g -I. -I./dispdrivers -I./userspace-vdp-gl/src -I./userspace-vdp-gl/src/userspace-platform -I./userspace-vdp-gl/src/dispdrivers
OPTIONS =
SRCS = rust_glue.cpp
@@ -15,7 +15,7 @@ userspace-vdp-gl/vdp_gl.a:
$(MAKE) -C userspace-vdp-gl/src
test_main: $(OBJS) userspace-vdp-gl/vdp_gl.a vdp_quark104.o test_main.o
- $(CXX) $(OBJS) test_main.o vdp-1.03.o userspace-vdp-gl/src/vdp-gl.a -o test_main
+ $(CXX) $(CFLAGS) $(OBJS) test_main.o vdp-1.03.o userspace-vdp-gl/src/vdp-gl.a -o test_main
vdp_console8.so: $(OBJS) userspace-vdp-gl/vdp_gl.a vdp-console8.o
$(CXX) -shared $(OBJS) vdp-console8.o userspace-vdp-gl/src/vdp-gl.a -o vdp_console8.so
New emulator looks great now! Nice work!
Hello,
thanks for creating the Agon emulator, it works great on macOS.
Sorry for the newb question, I wanted to ask if it is possible to debug a program in the emulator. Say that I have a compiled bin file, how can I step through the assembly and check the registers and memory ?
Thanks.
CP/M runs ok
https://github.com/nihirash/Agon-CPM2.2
This will crash the emulator
E>WS
Hi,
I'm using your nice emulator to test the agon. I've noticed that if I set keyboard to french, the "equal" key do nothing.
Hi there
I'm having serous trouble getting TRSE-compiled programs to work for the agon, and came to the realization that there might be an error in the emulator - this stuff works on other emulators (such as caprice 32 etc for the amstrad, gameboy etc)
ld d,0
ld e,1
add hl,de <- ooops! "de" is definitely not "01" when running in the emulator
however
ld de,01
add hl,de <- works just fine
similarly,
ld a,1
ld e,a
ld d,0
<- de is still not "01"...
Hi,
I've made a music player on BBC BASIC, but the emulator randomly crash when I play music notes with the VDP.
This is how I proceed to play notes, stopping them if they are a little too long :
33230 REM * play note with the VDU *
33240 VDU 23,0,&85,chan%-1,10:VDU 23,0,&85,chan%-1,4,waveform%(wvf%(chan%)):VDU 23,0,&85,chan%-1,0,vlm%(chan%)*2,n%(nt%,octv%(chan%)-1);nln%(chan%);
Checking sysvars before, to play notes when the emulator is ready, changes nothing.
The compiling went without problems, no errors or warning, using 'cargo build --release'. But when I try to run the application using 'cargo run --release', I get the following result at the end of this message.
I presume this is because it's not finding the VDP modules, but those didn't compile and didn't generate any module files.
> cargo run -r
Finished release [optimized] target(s) in 0.57s
Running `target\release\fab-agon-emulator.exe`
thread 'main' panicked at src\vdp_interface.rs:42:77:
called `Result::unwrap()` on an `Err` value: LoadLibraryExW { source: Os { code: 126, kind: Uncategorized, message: "The specified module could not be found." } }
stack backtrace:
0: 0x7ff7a9f782ac - std::backtrace_rs::backtrace::dbghelp::trace::h782acb12622401a5
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src\..\..\backtrace\src\backtrace/dbghelp.rs:98:5
1: 0x7ff7a9f782ac - std::backtrace_rs::backtrace::trace_unsynchronized::h863bea32e8b4cd40
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src\..\..\backtrace\src\backtrace/mod.rs:66:5
2: 0x7ff7a9f782ac - std::sys_common::backtrace::_print_fmt::h8e00824771791c97
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src\sys_common/backtrace.rs:67:5
3: 0x7ff7a9f782ac - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::he79a180599bd168b
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src\sys_common/backtrace.rs:44:22
4: 0x7ff7a9fda27b - core::fmt::rt::Argument::fmt::h8c61f2ec76e1ae1c
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\core\src\fmt/rt.rs:138:9
5: 0x7ff7a9fda27b - core::fmt::write::h8b5d9ba995f28b3d
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\core\src\fmt/mod.rs:1094:21
6: 0x7ff7a9f6d6ab - std::io::Write::write_fmt::hc7addd828eb73daa
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src\io/mod.rs:1714:15
7: 0x7ff7a9f78023 - std::sys_common::backtrace::_print::he35ac4a387784684
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src\sys_common/backtrace.rs:47:5
8: 0x7ff7a9f78023 - std::sys_common::backtrace::print::h7bad5d62728e1103
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src\sys_common/backtrace.rs:34:9
9: 0x7ff7a9f7b3c6 - std::panicking::default_hook::{{closure}}::h5067abc855bf1048
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src/panicking.rs:270:22
10: 0x7ff7a9f7b061 - std::panicking::default_hook::h240f0a26d6ddd9d1
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src/panicking.rs:290:9
11: 0x7ff7a9f7bc3b - std::panicking::rust_panic_with_hook::hc9234f56aa852168
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src/panicking.rs:707:13
12: 0x7ff7a9f7ba85 - std::panicking::begin_panic_handler::{{closure}}::h114d28b6ceee4a61
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src/panicking.rs:599:13
13: 0x7ff7a9f79069 - std::sys_common::backtrace::__rust_end_short_backtrace::h94a97ff2f3d9d2cb
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src\sys_common/backtrace.rs:170:18
14: 0x7ff7a9f7b7d0 - rust_begin_unwind
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src/panicking.rs:595:5
15: 0x7ff7a9fd6525 - core::panicking::panic_fmt::h9985522d043fc5f1
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\core\src/panicking.rs:67:14
16: 0x7ff7a9fd6b24 - core::result::unwrap_failed::ha7b8de540eb29961
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\core\src/result.rs:1652:5
17: 0x7ff7a9e536de - fab_agon_emulator::vdp_interface::init::hc844fc09ab73ed9e
18: 0x7ff7a9e4bcac - fab_agon_emulator::main::h94d09884a1f36a43
19: 0x7ff7a9e4f66f - std::sys_common::backtrace::__rust_begin_short_backtrace::hd25c867119097af6
20: 0x7ff7a9e4f915 - std::rt::lang_start::{{closure}}::h361ee5caa93515b3
21: 0x7ff7a9f5e7b6 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::hb3bdf4346df38b91
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\core\src\ops/function.rs:284:13
22: 0x7ff7a9f5e7b6 - std::panicking::try::do_call::h61c61764c4bdad62
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src/panicking.rs:502:40
23: 0x7ff7a9f5e7b6 - std::panicking::try::hb496e09f23995746
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src/panicking.rs:466:19
24: 0x7ff7a9f5e7b6 - std::panic::catch_unwind::h271d61ca37e37ebc
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src/panic.rs:142:14
25: 0x7ff7a9f5e7b6 - std::rt::lang_start_internal::{{closure}}::hdc458e19b8f78341
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src/rt.rs:148:48
26: 0x7ff7a9f5e7b6 - std::panicking::try::do_call::h64787de3a0157676
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src/panicking.rs:502:40
27: 0x7ff7a9f5e7b6 - std::panicking::try::h0f2ebb1d72d71417
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src/panicking.rs:466:19
28: 0x7ff7a9f5e7b6 - std::panic::catch_unwind::h624df61e1023a756
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src/panic.rs:142:14
29: 0x7ff7a9f5e7b6 - std::rt::lang_start_internal::hcf82168a9de7e079
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library\std\src/rt.rs:148:20
30: 0x7ff7a9e4e87d - main
31: 0x7ff7a9e41395 - __tmainCRTStartup
32: 0x7ff7a9e414e6 - mainCRTStartup
33: 0x7ffea7c2257d - <unknown>
34: 0x7ffea8e6aa78 - <unknown>
error: process didn't exit successfully: `target\release\fab-agon-emulator.exe` (exit code: 101)
Demo: https://movievertigo.github.io/downloads/agonlight/badapple/
Thread 4 "fab-agon-emulat" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff63fd6c0 (LWP 379763)]
std::_Sp_counted_ptr_inplace<BufferStream, psram_allocator<BufferStream>, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<unsigned int> (
__a=..., this=0x0) at /usr/include/c++/12/bits/shared_ptr_base.h:600
600 : _M_impl(__a)
(gdb) bt
#0 std::_Sp_counted_ptr_inplace<BufferStream, psram_allocator<BufferStream>, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<unsigned int> (
__a=..., this=0x0) at /usr/include/c++/12/bits/shared_ptr_base.h:600
#1 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<BufferStream, psram_allocator<BufferStream>, unsigned int> (__a=...,
__p=@0x7ffff63fcbc0: 0x0, this=0x7ffff63fcbc8) at /usr/include/c++/12/bits/shared_ptr_base.h:971
#2 std::__shared_ptr<BufferStream, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<psram_allocator<BufferStream>, unsigned int> (__tag=...,
this=0x7ffff63fcbc0) at /usr/include/c++/12/bits/shared_ptr_base.h:1712
#3 std::shared_ptr<BufferStream>::shared_ptr<psram_allocator<BufferStream>, unsigned int> (__tag=..., this=0x7ffff63fcbc0)
at /usr/include/c++/12/bits/shared_ptr.h:464
#4 std::allocate_shared<BufferStream, psram_allocator<BufferStream>, unsigned int> (__a=...) at /usr/include/c++/12/bits/shared_ptr.h:993
#5 make_shared_psram<BufferStream, unsigned int> () at vdp-console8/video/types.h:162
#6 VDUStreamProcessor::bufferCopy (this=this@entry=0x7fffec000ca0, bufferId=<optimized out>, bufferId@entry=65534,
sourceBufferIds=std::vector of length 215, capacity 215 = {...}) at vdp-console8/video/vdu_buffered.h:684
#7 0x00007ffff6b54fdc in VDUStreamProcessor::vdu_sys_buffered (this=0x7fffec000ca0) at vdp-console8/video/vdu_buffered.h:92
#8 0x00007ffff6b56f55 in loop () at vdp-console8/video/video.ino:119
#9 0x000055555557e648 in std::sys_common::backtrace::__rust_begin_short_backtrace::hbc09caaeaffdead6 ()
#10 0x000055555557b4bf in core::ops::function::FnOnce::call_once{{vtable.shim}}::h8d6de8e14216241d ()
#11 0x0000555555641995 in alloc::boxed::{impl#47}::call_once<(), dyn core::ops::function::FnOnce<(), Output=()>, alloc::alloc::Global> ()
at library/alloc/src/boxed.rs:1993
#12 alloc::boxed::{impl#47}::call_once<(), alloc::boxed::Box<dyn core::ops::function::FnOnce<(), Output=()>, alloc::alloc::Global>, alloc::alloc::Global> () at library/alloc/src/boxed.rs:1993
#13 std::sys::unix::thread::{impl#2}::new::thread_start () at library/std/src/sys/unix/thread.rs:108
#14 0x00007ffff7c4e044 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#15 0x00007ffff7cce61c in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81
(gdb)
Not sure if the newest SDL is necessary? Older Linux distros will now fail...
with these directives in autoexec.txt:
SET KEYBOARD 1
ez80asm hello_world.asm
load hello_world.bin
if i remove the ez80asm command, the same thing happens, and for set keyboard as well.
however, v0.9.20 updated to the same (and most recent) mos/vdp versions works just fine:
one major difference is that i compiled .25 from source on ubuntu 22.04 whereas the .20 version is using the pre-compiled binaries.
attached is a tar.gz archive of the exact executable and files i am running, less the src and related directories due to filesize constraints.
v0.9.25-linux-x86_64.tar.gz
it doesn't matter what code i'm trying to assemble and load, nor from which directory.
-quiet
Runs the emulator with sound off.
-boot
Loads and runs . At the moment in practice FAE has to be run from its own directory because of the libraries) in Linux anyway.
Both of these have fairly simple workrounds.
Hi there! I'm the developer of TRSE (www.turborascal.com), and I'm currently looking into adding Agon support to my compiler. However, in order for things to work smoothly, I need the emulator to be able to load + execute binary programs from command line, ie
./fab-agon-emulator load_bin=myprogram.bin execute_address=B000
or something similar... Would this be possible to implement?
Hi,
Can you accelerate a little the emulator ? My Agon Light 2 runs a little faster.
Hi,
I've made an icon for your emulator. If you like, you can use it.
PNG Icon
make : Does not work
cargo build -r : Works
cargo run -r : Does not work
One thing I've always found useful in emulation is the ability of the emulator to terminate itself for unit tests and so on, dumping the RAM and CPU state as it goes, which can be analysed after the fact. In my emulators I've usually done this via JMP $FFFF / JP $FFFF
I tried to build the emulator (tag: 0.9.16) on windows and it does compile, but crashes before the startup beep or anything but a black window. I also tested the current build for windows from the release page and it fails the same. I also tested the new --renderer sw option, but it does not help.
Platform: Windows 10 x64
Emulator version: v0.9.2
I've been playing with the emulator with a view to possibly buying a Console8. I wrote a BBC BASIC program to try scrolling the screen using VDU 23,7,m,d,z
and I wanted it to be smooth so I added VDU 23,0,&C3
(flip buffer or wait for VSYNC) but it doesn't seem to be waiting for VSYNC. That is, I'd expect the program to take 8 seconds to scroll by a total of 480 pixels at 60 pixels per second, but it completes in well under a second.
Have I misunderstood something or is the emulator not implementing the wait for VSYNC?
On the German keyboard layout, @ is AltGr-Q, but you cannot type it because it's a hot key to quit the emulator.
Similar for other AltGr keys like AltGr-R.
It might be better to have these under function keys.
The version 0.9.2 adds GPIO emulation and also adds gamepad support. It works flawless on linux, but on windows it has very much delay (in the seconds). I've added printlns to verify its not SDL itself which delays the input, but internally in the GPIO handling it must delay updates.
Errors in the Cargo Build
Some errors have detailed explanations: E0405, E0412, E0425, E0433, E0463, E0531.
error: could not compile bitflags
(lib) due to 58 previous errors
error: could not compile smallvec
(lib) due to 146 previous errors
Some errors have detailed explanations: E0405, E0432, E0463.
error: could not compile ppv-lite86
(lib) due to 188 previous errors
make: *** [cargo] Error 101
%
Thanks for making Fab Agon Emulator! It's rather neat and runs well on my Linux laptop.
I'm packing up fab-agon-emulator for Linux, but I need an icon. I have no real artistic skills at all. Is there a preferred icon to use? I couldn't find one in the repo. Would an Agon icon suit you, or would you prefer specific branding?
Running ./fab-agon-emulator
launches a GTK4 window with a blackscreen:
./fab-agon-emulator
-` chandler@pc-quarto
.o+` ------------------
`ooo/ OS: Arch Linux x86_64
`+oooo: Host: B450 I AORUS PRO WIFI
`+oooooo: Kernel: 6.6.10-arch1-1
-+oooooo+: Uptime: 5 days, 13 hours, 39 mins
`/:-:++oooo+: Packages: 1858 (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: 10456MiB / 15912MiB
.` `/
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.