148 karma · joined October 16, 2020
So having a file system and other APIs support Unicode natively made a lot of sense at the time; it simplifies many things including deploying into organizations that have global users. This is now over 30 years ago. And the A vs the W suffixed APIs were not simple ascii; they were multi-byte, so to work with strings you still had to know the code page. Obviously UTF-8 is much simpler for that now, but that wasn’t the world when this was designed.
We have to add an action to kill duplicate runs on triggers.
The caching is marginal, at least on Windows runners because it takes forever to expand the tar ball. Not even sure from their docs / issues on the cache action if they did finally move it to use GNU tar.
Having some way to get an interactive shell on fail would be a big step up for debugging issues. Otherwise we are back to print debugging in the actions or uploading artifacts at each step so we can inspect them.
If you want to do straight to the hardware bare metal then you need to do something like this (https://www.rpi4os.com/part5-framebuffer/) but you’re going to have to do all the other system init work that a modern system needs. Old computers were simpler!
This is what we used to do with 8 bit computers that didn’t have a hardware text mode. You might be able to look up the bitmaps in the ROM, otherwise it’s time to define them all yourself.
Using a direct system call would be like calling a ROM routine or an OS routine to print characters. You’d either call the routine or invoke a software interrupt.
C++ has been usable in the Windows kernel for a long time but you need to make sure that code ends up in the correct PE segment types for pageable and non pageable code and that there are no hidden gotchas for features like exception unwinding and that new can use paged or non paged pool appropriately. Same for Rust: getting to a nostd etc that is compatible with kernel use.
I think there’s a strong case that many drivers could be written with either a user mode driver framework or a small VM. Most of the hardware devices I’ve worked with we just need fast transfers of data to user mode buffers so our application can handle it, and the code is mostly boilerplate framework code plus setting up device registers to set up DMA transfers. I don’t see why that couldn’t be handled with say an EBPF or WASM equivalent byte code.
When you compare to other methods of birth control, it’s not effective for teens.
Elite was affected so Firebird (subsidiary of British Telecom) would let you get a new tape that fixed this bug but it also removed the LensLok protection code.
http://www.computinghistory.org.uk/det/56946/Lenslok-Softwar...
Trying to play Elite on Christmas Day and repeatedly failing to enter the correct two letters!
Also the template support in the compiler was limited at the time. Later on there were other libraries that used templates like ATL and WTL.
You did get a lot for free from MFC when implementing document editing applications for OLE support, but that was an increasingly small portion of development.
I think Borland went a different way with compiler extensions for producing a Win32 application with their OWL library.
In practice for DirectX you just use the header files that are in the SDK.
I used dual monitors back from when it first became an option with 17” CRT monitors 25 years ago but you end up with a primary monitor and then other apps off to the side. The UltraWide is just easier - I can snap code and docs side by side, or two windows of code, or I can have code centered and in focus.
It’s not really a ‘downgrade’ because it’s considerably more expensive than two separate monitors but the ergonomics are so much better.
The manual has those clear memory maps and it even describes the way numbers are encoded in the tokenized BASIC program memory, with the exponent sign and mantissa encoding. This really was a remarkable book.
I guess it’s a short step to looking up memory addresses against a bitmap for validation. I couldn’t tell from the video if this is what he did. Cutting the addresses into pages would let you save or add more levels and I guess you could implement a TLB similarly.
Kenny Kerr has done an excellent job with both the C++ and Rust bindings, but the Rust one isn’t there yet.
What I’d like to see is more use of a WinMD style metadata for the ABI for functions in DLLs you create. It would be quite simple to define a Span type that could then be imported and called safely from a diverse range of FFIs. I really shouldn’t be having to declare the ABI all over again with ctypes in Python.