Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics

Making Art Studios

A member registered Oct 14, 2015 · View creator page →

Creator of

Recent community posts

Here you go :)

I'll add the link to the project's page.

My current plan is to add a plugin system so I can simulate complex components fast (e.g. CPUs) using code instead of circuits. It's still very early to know if I'll manage to do it, but I'm slowly working on it.

Regarding Linux builds. I don't have a Linux machine at the moment and setting up a VM is a lot of work. I'll try WSL2 at some point to see if I can cross-compile from Windows. Don't know how it'll work with the plugin system once it's ready, so I'm not sure if I'll keep Linux support.

Try 0.17.1. It should be fixed.

Please try the latest version (0.17.0) and report back. Thanks and sorry for the inconvenience.


No :)

I haven't worked on it for about a year now and I currently have no plans on returning to it some time soon. So... yes?

Sorry about that.

DLS comments · Replied to N_58 in DLS comments

Components can be rotated using the mouse wheel before placing them on the schematic. IO ports cannot be rotated.

Probably the server was down for maintenance. Please try again.

I just enabled Stripe payments for my account. You should be able to pay with credit card now. 

The reason I haven't done it until now was because I thought Stripe wasn't supported in my country (it wasn't supported last time I checked). That doesn't seem to be the case any more.

Hope you enjoy DLS :)

That doesn't sound right. You should be able to press any button by clicking anywhere on the button. This is the first time I'm hearing about such issue. Haven't been able to reproduce it on my machine, but I don't have a macos Catalina machine to test your setup.

Unfortunately, since I cannot reproduce the issue, I cannot fix it. I can refund your purchase if you want and if/when I'm able to test it on Catalina and fix it I can inform you to try it again.

Sorry for the inconvenience.

PS. Does the same thing happen in the online sandbox?

Can you explain what you mean by "hibox"? A screenshot might help.

What is the window resolution you are using? Have you tried changing the UI scaling option?

Thanks a lot for the offer. 

As far as I can tell, it's a bug in bgfx (see one of the issues). Unfortunately, I have to rebuild DLS with the new version of bgfx and I don't know when I'll be able to do it. If I manage to do it, I'll inform you to test it out (if I don't find a Catalina machine in the meantime).

If this isn't the issue, then I'm afraid I cannot debug the app without direct access to a machine.

Sorry for the inconvenience and thanks again for the offer to help.

The latest version of DLS has been built and tested on macos Mojave. I really don't know if it works on any other version or not, newer or older (unfortunately I don't have access to that many macos machines).

Can you please post the log file (if there's any created under Documents/DLS) to see what might be wrong?

If you don't plan on upgrading to some newer version or try the game on another OS, I'll be glad to offer a refund (don't know if this is automatically handled by or not).

(1 edit)

Thanks for the kind words and the suggestions!

1) I'll add it to my TODO list. No promises or an ETA at the moment, but I'll look into it.

2) I experimented with a simple editor in the past ( but I haven't managed to properly implement it yet. It's definitely one of the things I'll do at some point, but again, no ETA.

Thanks for the bug report.

Based on your description, the only thing I can think of is network access. When the game starts and after completing each level, a request is send to the server which keeps track of the results. Unfortunately, I haven't managed to make this request asynchronously on linux, that's why it might take a long time. But 3 to 5 mins is excessive. The most I've observed is about 30 secs during development when connecting to a local server which isn't running (so all requests timeout).

I'll try to fix that in the next update. Sorry for the inconvenience. Waiting that long to play for a couple of minutes must be really frustrating.

Thank you for playing the game!

It's in my TODO list to add more levels. In fact previous versions (e.g. 0.15) had more and different kind of levels (sequential circuits and streams) but I had to remove them from this version because they didn't seem to function correctly with the new logic simulator.

Now that I've added the HDL I will certainly add more levels with only HDL components to make the player familiar with it.

In the meantime you can experiment with the sandbox if you want :)

I just uploaded v0.16.2 which changes the user data folder location on Linux. The order of the various checks is now the following:

  1. If XDG_DATA_HOME env var is defined then the user data folder path is $XDG_DATA_HOME/DLS/
  2. If XDG_DATA_HOME isn't defined, the user data folder path is $HOME/.local/share/DLS/
  3. If, for any reason, the HOME env var cannot be determined, the user data folder path is the same as the installation folder.

I'll be glad to hear back from you once you find the time to test it. 

There's no need to delete this thread even if the bug has been fixed. If you want, you can edit your first comment to mention that the bug has been fixed in v0.16.2 :)

Thank you very much for taking the time to debug this. I haven't thought about that. The only reason I didn't create the path recursively (i.e. mkdir both Documents and DLS) was because I thought Documents will always be there...

Honestly I don't remember where I got XDG_DATA_HOME env var from and why it's there. I'll look into $HOME/.local/share and see what I can do. Since files/folders starting with a dot are by default invisible (I think so at least), using it for user generated content would make sharing stuff (schematic, scripts, etc) harder because it won't be immediately obvious where they are stored.

If there's no DLS subfolder in your ~/Documents folder and you cannot find DLS.log anywhere it probably means that DLS doesn't have permissions to initialize its "file system". 

The first thing DLS does when starting up is to figure out what's the installation path (readlink("/proc/self/exe", ...)) and under which folder it should create the DLS subfolder to store user-generated content. It first looks for the HOME environment variable. Then for the XDG_DATA_HOME environment variable and if none is defined, it uses the installation path.

After that the log is opened at <user-data-folder>/Documents/DLS/DLS.log 

If you cannot find the log file, it means that the first step failed. Which either means that the above procedure has a bug (which I haven't found yet), or the paths are correctly read but DLS doesn't have permissions to create files and subfolders in them.

Will try to debug it by trying out all the different cases in the above procedure and will report back. 

Thanks for trying to figure it out and sorry again for the trouble.

Check your Documents folder. There should be a DLS subfolder there. Rename it to something else (just in case) and run the executable again. 

If there's no DLS folder in your Documents or no dls.log in there, it's a bit hard for me to debug it remotely. Can you post your PC configuration?

I created a fresh minimal Ubuntu 18.04 VM yesterday with all the latest updates and no dev software, to see if it works. It runs correctly out of the box... :|

Sorry about that. Tested it only on Ubuntu 18.04 on a VirtualBox VM (with software rendering). 

Does it create a log file? If it does, can you post its contents?

It seems to work for me on Chrome. Cleared the cache and it still loads correctly. What is the error you are getting?

(1 edit)


Thank you for your interest and sorry for the long delay on the update. I've changed so many things since v0.15 and I wanted to test them all out before releasing an update. Unfortunately, the more I postpone it the more stuff I have to change and fix and test. 

Having said that, I plan to release an update before new year.  Whether or not I'll succeed is another question. Either way, if you'd like to check out some of the changes, take a look at the online sandbox:

Yes the app is still under (slow) development. Can you please tell me on which platform you are getting the crashes and under what circumstances? The only known crashing bug on the current release (0.15) happens when the app exits. It's a problem with the order things are destroyed when shutting down. But it shouldn't affect either your saved schematics or savegames. 

If you are facing any other issue, please describe it so I can track it down and fix it on the next release (if it's not already fixed). If you are on Windows you can try submitting a crash report so I can take a look at the crash dump and figure out the problem faster.


Thanks for the kind words. Development has been really slow the past year but I'm still working on it. I've changed a lot of things internally (i.e. UI) and I still haven't finished the transition to the new code, so it'll take some more time until the next version. 

The only issue I'm aware of is that on Windows the game crashes when quitting, but this shouldn't affect any of your savegames or sandbox schematics (crash happens later in the code). Have you found any other bug? If yes, I'll be glad to hear it and see if it's already fixed or not for the next version.

Sorry for the delay on the update.

Thanks! :)

OK. Can you perform the operation I described above in those simulators? Ie. With 16-bit words, write only 1 of the 2 word bytes on the next clock tick? 

Looking at Logisim help pages (, if I understood correctly, you can only store whole words when ld=0. So in order to write only (e.g.) the 2nd byte of 16-bit word, you have to first read the word into a register, replace the 2nd byte's value and store the new 16-bit word into the SRAM. Which in turn means that you need at least 3 clock cycles.

With separate write enable signals for each word byte, as in DLS, you can do it on a single clock cycle.

I was thinking of creating a demo circuit for you to try out the various combinations or draw some diagrams but it'll take some time. Until then please take a look at this in case it helps a bit more:

If I understood correctly, what you expected to see was an 1-bit write enable input independent of the word width. Am I correct?

I just took a look at the manual and you are right, it's not clear enough.

SRAMs in DLS are word-addressable memories. If your word size is larger than 8 bits (Din width greater than 8) you have more than 1 byte per word. \bwe is an active low signal controlling which bytes of the addressed word will be written (bwe = byte write enable). 

E.g. if your word size is 16 bits and you address size is 8 bits, it means that you have 256 words or 512 bytes. But since you can only access individual words (i.e. byte pairs) you can only read or write bytes starting at even addresses. What would you do if you wanted to write only byte #5 which is the 2nd byte of the 3rd word? You should set the inputs to the following values:

  • addr = 02h
  • Din = XX12h, where XXh can be any value (SRAM should not care)
  • \bwe = 10b

This way, on the next rising edge of clk, only the 2nd byte of the 3rd word will be overwritten, leaving the 1st byte intact.

Hope it clears things up a bit. If not, I'll try a more concrete example.

> I must check it on my i7-4790k, currently I'm using it on notebook with i5, but I have access to dual Xeon workstation, it would be funny to check performance on it ;)

Unfortunately, the dual Xeons won't make a difference in performance. Currently simulation is single threaded and only 8ms of frame time is devoted to it. Until I manage to move the simulation to a separate thread and it ends up being faster than the single threaded version, 8ms should be enough for smooth interaction with the schematic.

> PS: new idea - pull-up resistors. Sometimes when you use tri-state buffers you want 0 instead of "Z" (not connected state)

Aren't pull-up resistors considered analog devices (i.e. they require a Vcc or Gnd pin to work)? If yes, they don't fit into the current simulator.

Can you describe a situation where a tri-state buffer with a 0 instead of Z output would be required? The only reason there are tri-state buffers in DLS is to be able to support buses (which are effectively wire-OR structures). Is there another usage for them? Isn't it possible to use AND/OR gates in places where you need a tri-state buffer with 0 disconnected state?

Thanks for the suggestions.

> first: could you implement more advanced save/load dialog which would allow to select directory to/from save/load?

Unfortunately, that's harder than it sounds. Implementing a proper save/load dialog using custom UI requires correct handling of Unicode paths and filenames, which in turn requires major changes to the application. This is one of those things I decided early in development and are a bit hard to change at the moment. Don't forget that even if the simulator is capable enough to handle complex circuits, my initial thought was to make some kind of game out of it. So, arbitrary save/load paths didn't fit in such scenario.

Having said that, what I have in my TODO list is the ability to add slashes as separators when saving a schematic, in order to be able to group your circuits into subfolders inside the existing schematics folder. Still needs some work to be implemented properly, but it's a lot less than what's required for what you suggest (i.e. since DLS doesn't allow non-ASCII chars in its input boxes, there's no need to handle Unicode paths).

> second: component toolbar on the left

That sounds nice. And it might be more accessible in case I add more build-in components in the future. I'll think about it.

> And third thing: maybe text component which would allow to place text note in any place in circuit.

I had that in my list, but I cannot find it anymore :) Probably removed it as not-needed. As far as I remember, what I had in mind was something like PDF comment annotations. Small symbols on the schematic grid, which you click to show/edit a comment. Is this what you have in mind? Or you want the text to be visible at all times? Maybe a "pin note" button will allow both ways to be implemented. I'll also think about it.

> LogicWorks unfortunatly refuse to cooperate with my CPU.

I haven't used LogicWorks so I'm not familiar with its capabilities. Looking at its website, it looks way more professional than DLS :)

Do you mean that it cannot simulate your schematic fast enough? Do you have any numbers which you can compare with DLS once you manage to rebuild your circuit in it? E.g. how fast is the simulation in LogicWorks (i.e. circuit nsec per wall-clock sec), like in DLS? Is there such a metric in LogicWorks?

I don't know what kind of circuits you've managed to build with DLS so far, so I'd suggest to not expect much from it performance-wise. The largest circuit I've managed to build was a cycle-accurate i8080 CPU but the simulation performance isn't great (~750usec/sec on my i3-2100).

At the moment all signals are 32 bits wide internally. But I need a way to distinguish UNDEFINED and ERROR values so actual signals inside the editor are limited to 16 bits. This is because UNDEFINED/ERROR have fixed 32-bit values.

In order to make wires carry 32-bit values, signals should be either turned into a struct (32-bit value + flag for Valid/UNDEFINED/ERROR) or increase their size to 64 bits. Both of these ideas require a lot of internal changes to the simulator, which I'm currently considering but haven't managed to make yet.

So to answer your question: Not any time soon I'm afraid. Sorry about that :)

That sounds great. Thanks! Don't know when I'll find some time to implement it and how far I'll take it, but it sounds interesting and it's something I'll consider.

Hello again,

The bug related to the new component/package dialogs has been fixed in the latest version (0.13.0) I just uploaded. Unfortunately, I didn't have enough time to search for a solution to the windowed-mode issue. Hope to fix it some time soon.


I'd like to inform you that several of your suggestions have been implemented and are available in the latest version (0.13.0).

  • Wire thickness based on its bit width
  • SRAM component (synchronous, flow-through, standard write)
  • Colored LEDs
and a couple of other things. If you happen to find some time to test it out, I'll be glad to hear your feedback.

I just saw the windowed mode bug you described. Again, I've never tried running in window mode with the same dimensions as the native resolution, that's why I missed it (I usually run it in window mode, one resolution lower than the desktop resolution; i.e. my desktop is set to 1680x1050 and I run DLS in a 1600x900 window most of the time). Thanks again :)

Don't know if I'll be able to fix this because both window dimensions and cursor position come from GLFW. I'll search for a fix, but I cannot promise anything yet.

Regarding I/O priority/order. That's one of my thoughts. Don't know if I manage to implement it for the upcoming version (0.13) but it'll be done at some point.

FYI, the bug you were facing when creating a new component + package has been identified and will be fixed. Thank you again for your detailed steps to reproduce it. Apparently, I've never written the component name *before* opening the new package dialog, that's why I've missed it for so long.

In the meantime, try to create your new package before giving a name to the new component.

Thanks! I'll look at the crash reports you've submitted and hopefully the bug will be fixed in the next version :)

Regarding I/O pins at the top/bottom of the component. It's in my list of things to implement at some point, but it's low priority at the moment (also, I have to figure out what to do with the name of the component in this case).

Currently I/O pins appear only one the sides of the component (left pins are always inputs and right pins are always outputs). Also, their order is the order you created them in the first place. This is also in my TODO list (being able to change the order of appearance) but I haven't decided what would be the easiest and most intuitive way to implement it (e.g. separate component symbol editor/popup or select I/O index from the port's context menu?).

I forgot about it. 16-bit Floating point adder

I'm not sure if this is the final correct version because I have a couple of different schematics for this. If it doesn't seem to work correctly, please say it and I'll upload some of the others :)