In this devlog, I added a new page for the DOS setup and usage guide!
As the pages in my documentation site are getting more and more, I decided to create a folder, and move the guides in, so the navbar would be less cluttered.
One problem I faced though was the CSS and icons not loading in the guide, as the directories were getting a little complicated, given that I am using the /docs directory in my repo for the site, which makes URLs without the full path returning 404. After a few commits (localhost was not using /docs as the root of the site), I finally found the right URL!
In this devlog, I updated the README.md contents as it was a little outdated due to the new firmware revision.
I also just realised I didn’t link the datasheet for my board in the README, so that is also one of the changes I made.
Additionally, I created a 404 page for my docs, and I will be making my second ship soon!
In this devlog, I added new commands for my OS:
CALCULATE: Performs basic operations on 2 numbers. Usage: CALCULATE [Number] [+ - * / ^ root] [Number]
GPIO: Turns on a specified GPIO for 1 second. Usage: GPIO [LED# IO# BELL MOTOR]
VERSION: Shows the release version.REBOOT: Reboots the system. Usage: REBOOT -m [BASIC BOOTSEL]*
INFO: Displays device and memory information.UPTIME: Shows device uptime.I took quite a while to find out how to make the CALCULATE command work. Initially, 1/3 was returning 0. Turns out the problem was due to me using integers instead of doubles!
Here’s a demo video of the OS!
Since I added a new firmware, I have to update the downloads section of my site! It took me quite a while to organise my repo a little bit, as the firmware files were getting a little messier and releases getting more complicated as I have 2 firmware now!
Next, I’ll be working on the DOS, adding more commands to the system!
Previously, I was asking myself: How can I make my device look more like an old computer?
When I was turning on an old desktop I have at home, I saw the BIOS screen due to CMOS errors, and this was where I got an inspiration for a new firmware update.
In this devlog, I redid the firmware, added a BIOS-like CLI, while still keeping the original BASIC interpreter as a fallback if no bootable “OS” was found. Here’s what it looks like:
_ _
| \/ | Macro Microcontroller BIOS Version 0.0.1.
|_\/_| Copyright (C) 2025-2026 Nicholas Lim.
Device: Macro Microcontroller 2 (RP2040 @ 125MHz)
Serial Number: ************
RAM Free: 254K OK
Serial Status: Connected
Press SW1 to enter Macro Microcontroller BASIC.
Press SW2 to enter BOOTSEL mode.
Booting system...
The UI was inspired by the old BIOS POST screens from the 1980s. As I wanted a retro feel to my microcontroller, I thought that a BIOS-like system would look nice to it!
Thanks for reading!
Added a function to pin your favourite URLs for easier access with localSotrage to ensure they stay even after reloads. Instead to showing the website’s name, it displays it’s favicon for a simpler UI.
It took me quite a while to debug the localStorage function. It turned out that the issue was the parsing and storing URLs as an array.
My site was initially deploying via pages-build-and-deployment, which led to the API not working. After some time and many git commit --allow-empty -m "Trigger pages build", I finally found out what the problem was! I didn’t change it to build via GitHub Actions. After changing that, it worked quite well. Another problem I faced was the timezone difference with my country and APOD’s API. I received 500 errors when calling them. It worked in the end when i used yesterday’s date!
I’ll be thinking of what other features I should add to my new tab page, and implement them in the next devlog!
In this devlog, I made some changes to the firmware and released v0.0.3 that adds support for comments:
10 REM This is a comment that will be ignored!
20 PRINT "Hello world!"
I’ve also added a more detailed programming guide for my custom BASIC Interpreter.
I had some trouble soldering the keyboard switches on as it was moving everywhere. I’ve attempted applying tape, but it did not work as the temperature was too high.
I’ll be tidying up the repo and get ready to finally ship🚢 my project!
In this devlog, I’ve added a new function to my custom BASIC interpreter for my development board, and finally sent my PCB for manufacturing!
It took me quite a while to write the random number function that the old BASIC interpreters used to have: RND. I did many rounds of trial and error to finally create a working code (the previous code was returning either nothing or throwing compiler errors due to data types):
printf("%f\n", (float)rand() / (float)RAND_MAX);
Here’s a sample program you could run that generates a random number, stores it in a variable and prints it:
10 let x = rnd
20 lsvar
30 print x
Now, I’ll be working on support for comments in my interpreter and wait for my parts to come. I can’t wait to assemble my macropad + dev board!
Today, I changed the layout and content of the documentation website and made it responsive for mobile devices! I initially wanted to add a 3D viewer to display the .glb file for rendering, but it did not output the result I wanted. (The silkscreen was not appearing!) I’ll read up on more about it, and hopefully, I would be able to add the 3D model into my documentation!
In this devlog, I improved the documentation of my project by creating a simple website to share specifications, schematics, and provide a direct link to download firmware and 3D print files. You may view it at https://nicholas1023.github.io/macro-microcontroller-2!
Next, I will be ordering the PCB and electronic components and finally solder them together!
In this devlog, I have created an app installer that installs a website as an app, much like how a web app works. However, this function only works for URLs that allow embedding.
I have also solved a bug where apps dragged past the viewport creates a scrollable viewport by adding this:
overflow-y: hidden;
overflow-x: hidden;
I’ll be shipping it soon! Try my OS out at https://nicholas1023.github.io/Nicholas-OS/!
Here’s a demo video of the installer installing hackclub.com as an app!
I’ve added a file viewer and terminal app to my operating system!
I had issues making a window come to the front when clicked or move. Initially, I was using .style.zIndex++, but it did not seem to work when a window was clicked multiple times. To solve this, I changed all the z-index of all windows when one is clicked, to ensure all of the values sync.
The buttons on the top bar are currently text-based, so I’ll be creating icons for them, and to declutter the buttons top bar on apps.
Next, I will be making the windows draggable, and creating icons for the apps.
I’ll also be improving the loading screen, which currently only consists of the following code.
<div id="boot">
<div style="text-align: center;">
<h1>Nicholas' Operating System</h1>
<p id="loading">Loading...</p>
</div>
</div>
When creating the window functions, which manages maximise, minimise and close buttons, it did not seem to work. I realised later that the function name was actually overwriting a built-in function as it was initially named close()! In the end I renamed it to closeW(), where W stands for window.
I also faced issues with the height of the <main>. Initially, the height of main was set to 100%, which failed to work. After some searches online, I tried replacing 100% with 100dvh, which worked perfectly!
Today, I have completed the 3D case for Macro Microcontroller 2 and did some minor bug fixes for the BASIC Interpreter. I needed to reassign the GPIO pins from the first revision of the board.
Although the interpreter is currently still basic, it supports 4 BASIC statements and 4 custom statements for controls.
KEY statement for hardware GPIO controlFor the first-half, I added silkscreen text to the PCB for the IO components (GPIO Pins, Keyboard switches, LEDs…). Next, I moved on to designing the enclosure. It took a while for me to get used to using a new app to design it.
The screw holes were not appearing during the first few attempts, but it worked in the end when I placed it manually, instead of using the move function.
Creating the cutout for the USB connector took me about 15 mins as I needed to measure the length and clearance needed for a micro-USB plug and create another sketch before extruding it as a cutout.
Next, I’ll be continuing with the enclosure design, adding a cover with a keyboard plate, and finally moving on to the BASIC interpreter firmware for it!