Monday, January 01, 2024
Free at last! Free at last! Thank God almighty the mouse is free at last!
Well, at least the 1928 version of Micky Mouse is free and in the public domain. It's no coincidence that Disney has worked the past few years turning the 1928 version of Micky into a trademark. Grab the popcorn! It's going to be an interesting year in copyright law.
Unlike the past few years, this year came in pretty quiet. Yes, there were some fireworks off in the distance, but our neighbors? Very quiet this year. Maybe that's a good sign that this year will be less explosive.
I can hope.
HAPPY NEW YEAR!
Monday, January 08, 2024
I wonder why today, of all days, I'm feeling this level of melancholy?
Yesterday at the “every-other-week” D&D game (played via Zoom these days), I couldn't bring up the virtual map the DM uses because my web browser didn't support WebGL, despite my updating the entire operating system, including the web browser, just 10 minutes earlier.
Sigh. What the XXXX happend to being just 20 minutes out of date?
Even worse, it ran the last time we played a month ago.
Admid suggestions from the rest of the group about what to do (even with the suggestion to not use the map at all and just go for “theater of the mind”), I just gave up and bailed out of the game. I just couldn't cope with the fact that despite my attempts at keeping up to date with all this technological XXXX being forced down our throats, it still wasn't XXXXXXX good enough.
I think this is the culmination of my feelings toward the latest round of AI. I saw this video with Dr. Matt Welsh who joked that at his company, not using ChatGPT should be a firable offence, and I felt offended at the joke. Are we so XXXXXXX beholden to our tools that we give up mastery of them? Of course, as the owner of a software company, he loves the idea of ChatGPT to write his software—it keeps his costs down. XXXX people who spent time investing in writing software.
As I commented a month ago:
I wrote about this about fifteen years ago, about the fear of becoming beholden to technology without understanding. IT currently doesn’t incentivize deep learning, or even mastery of anything, both because the perceived need to move fast, and the ever changing technology landscape. Who has time to learn anything any more? Why even bother if it’s all going to change anyway? Especially when we have a program that can do all that pesky learning for us?
Edit to add: Maybe this post describes it better?
LLMs make Programming Language Learning Curves Shallower | Lobsters
Why bother indeed?
And to bring this back around to D&D—Deck of DM Things has made series of videos about using AI to run a game:
- The Future of D&D: ChatGPT as a Dungeon Master
- Experiment: Can AI RUN a Full D&D Session?
- Experiment: Can ChatGPT Run 5e Combat?
Even though he wasn't fully successful with the experient, as YouTuber Philip DeFranco is fond of saying, “this is the worst that AI will ever be.”
This has been in the back of my mind for some time now. I left The Enterprise partly because of the testing, and a fear I had was that not that AI would write the tests for us (which I wouldn't mind) but that I would have to write tests for the code AI wrote. It was bad enough having to endure endless computer updates and reboots when the XXXXXXX computer mandated it—but to be truly enslaved to the machine?
Who controls who?
And it all came crashing through when I couldn't load a XXXXXXX map on a XXXXXXX web page.
I don't like the direction the industry is going, with all the constant changes just for its own sake (yes, I know, changes for security is a real thing, but that's not carte blanche to change how the rest of the software works). And often times, it's the computer in change. “Oh! Update me now!” “Oh! Reboot me now!” “Oh! Feed me now, Seymour!”
XXXX that XXXX!
Oh great! The network connection is down. Could be Roko's Basilisk giving me a warning, or just a momentary glitch. Who knows?
Sigh.
I feel like I'm yelling at the clouds to get off my lawn as I adjust my onion on my belt. But on a lighter note, ChatGPT in French is “cat, I farted.” That is truly wonderful.
Thursday, January 18, 2024
“Now, here, you see, it takes all the running you can do, to keep in the same place.”
I'm a bit relunctant to write this, as I'll come across as an old man yelling at the clouds to get off his lawn, but the whole “update treadmill” the Computer Industry has foisted on us is getting tiresome.
Bunny now wears a CGM prescribed by her doctor. It's a small disk that adhears to the back of the upper arm and sends readings of blood sugar via Bluetooth. Bunny has an app on her smartphone that records the information and forwards it to her doctor. The app is fine; no real problems with using it.
Until this morning.
Bunny woke me up to inform me that the app just stopped working, because her smartphone hadn't been updated in the previous 20 minutes.
…
What the XXXX‽
It was working fine the previous night. What updates were required? And why drop support for older operating systems? Oh yeah … right … it's hard to support systems older than 20 minutes.
And some PM somewhere needed to justify their job.
Sigh.
Things are working fine, how that the operating system on her smart phone was updated (only took several hours). But still … gah!
“… and water is wet! Film at 11!”
Time for more yelling at the clouds.
A few days ago I was surfing on my iPad when I came across An Astronomy Club of Brevard, NC. Now, my iPad is a bit, shall we say, slightly out of date? So it was with sadness when I saw:
Your Browser Is
No Longer SupportedTo view this website and enjoy a better online experience,
update your browser for free.
Followed by a list of browsers.
You know, I thought we left that behind in the early 2000s, but apparently not.
I then viewed the site on my desktop computer and … why? Why do I need a less-than-20-minute old browser to view seven images and some text? Why does it take 193 requests to even show the page? At a minimum, you have the HTML, CSS and seven images, so … nine requests? Okay, maybe some Javascript to do the animations designers are so fond of.
But 193 files?
I'm not blaming the Astronomy Club of Brevard for this. They're using Wix to create and host the website, so I'm laying the blame solely at Wix here for going completely overboard with the JavaScript. Do web developers know you can create a perfectly good site with just HTML and CSS?
Yeah, I'm yelling at the tide to stop coming in.
Sigh.
Friday, January 19, 2024
Complicating code
I recently added an .OPT
directive to my 6809 assembler.
This allows me to add options to a source file instead of having to always specify them on the command line.
I originally did this to support unit testing and I feel it's a nice addition.
When the test backend is enable, all the memory of the emulated 6809 is marked as non-readable, non-writable, non-executable. As the code is assembled, memory used by instructions are switched to “readable, executable” and memory used by data becomes “readable, writable” (easy, because of an early decision to have separate functions to write instructions vs. data). If you reference memory outside of the addresses used by the source code being assembled, you have to specify the permissions of said addresses.
; The set up for our tests. ; We should only read from these locations .opt test prot r,ECB.beggrp,ECB.beggrp + 1 .opt test prot r,$112 ; We can read and write to these locations .opt test prot rw,$0E00,$0E00 + 1023 ; Set the stack for our tests .opt test stack $FF00 ; Initialize some VM memory .opt test memw,ECB.beggrp,$0E00 .opt test memb,$112,2
You really only need these for memory locations defined outside the source code. In the example above, the memory referenced is defined by the Color Computer and not by the code being tested, so they need to be initialized. And because the system only supports 65,536 bytes of memory, we can easily (on modern systems) assign permissions per byte.
So this all works and is great at finding bugs.
But then I thought—I can use .OPT
to supress warnings as well.
If I assemble the following code:
;************************************************************************** ; frame_buffer set frame buffer address (GPL3+) ;Entry: A - MSB of frame buffer ;Exit: D - trashed ;************************************************************************** frame_buffer ldb PIA0BC ; wait for vert. blank bpl frame_buffer .now stx ,--s ; save X ldx #SAM.F6 ; point to framebuffer address bits .setaddress clrb ; reset B lsla ; get next address bit rolb ; isolate it stb b,x ; and set the SAM F bit leax -2,x ; point to next F bit register cmpx #SAM.F0 ; more? bhs .setaddress ; more ... puls x,pc ; return
I get
frame_buffer.asm:9: warning: W0002: symbol 'frame_buffer.now' defined but not used
The subroutine has effectively two entry points—frame_buffer
will wait until the next vertical blanking interrupt before setting the address,
while frame_buffer.now
will set it immediately.
The former is good if you are using a double-buffer system for graphics,
while the later is fine for just switching the address once.
Given that my assembler will warn on unused labels,
this means I'll always get this error when including this code.
I can supress that warning by issuing a -nW0002
on the command line,
but then this will miss other unused labels that might indicate an actual issue.
I wanted to have something like this:
.opt * disable W0002 frame_buffer ... .now ... puls x,p .opt * enable W0002
We first disable the warning for the code fragment, then afterwards we enable it again. I coded this all up, but it never worked. It worked for other warnings, but not this particular one.
The assembler is a classic two-pass assembler, but not all warnings are issued during the passes, as can be seen here (using a file that generates every possible warning with debug output enabled):
[spc]lucy:~/source/asm/a09/misc>../a09 -ftest -d -o/dev/null warn.asm warn.asm: debug: Pass 1 warn.asm:2: warning: W0010: missing initial label warn.asm:10: warning: W0008: ext/tfr mixed sized registers warn.asm:11: warning: W0001: label 'a_really_long_label_that_exceeds_the_internal_limit_its_quite_l' exceeds 63 characters warn.asm:16: warning: W0001: label 'a_really_long_label_that_exceeds_the_internal_limit_its_quite_l' exceeds 63 characters warn.asm:21: warning: W0001: label 'another_long_label_that_is_good.but_this_makes_it_too_long_to_u' exceeds 63 characters warn.asm:23: warning: W0001: label 'another_long_label_that_is_good.but_this_makes_it_too_long_to_u' exceeds 63 characters warn.asm:36: warning: W0013: label 'a' could be mistaken for register in index warn.asm:37: warning: W0013: label 'b' could be mistaken for register in index warn.asm:38: warning: W0013: label 'd' could be mistaken for register in index warn.asm: debug: Pass 2 warn.asm:2: warning: W0003: 16-bit value truncated to 5 bits warn.asm:3: warning: W0004: 16-bit value truncated to 8 bits warn.asm:4: warning: W0005: address could be 8-bits, maybe use '<'? warn.asm:5: warning: W0006: offset could be 5-bits, maybe use '<<'? warn.asm:8: warning: W0005: address could be 8-bits, maybe use '<'? warn.asm:9: warning: W0007: offset could be 8-bits, maybe use '<'? warn.asm:11: warning: W0009: offset could be 8-bits, maybe use short branch? warn.asm:13: warning: W0011: 5-bit offset upped to 8 bits for indirect mode warn.asm:25: warning: W0012: branch to next location, maybe remove? warn.asm:26: warning: W0012: branch to next location, maybe remove? warn.asm:43: warning: W0017: cannot assign the stack address within .TEST directive warn.asm:42: debug: Running test test warn.asm:42: warning: W0014: possible self-modifying code warn.asm:42: warning: W0016: memory write of 00 to 0034 warn.asm:42: warning: W0015: : reading from non-readable memory: PC=0016 addr=F015 warn.asm:42: debug: Post assembly phases warn.asm:2: warning: W0002: symbol '.start' defined but not used [spc]lucy:~/source/asm/a09/misc>
You can see some are generated during pass 1,
some during pass 2.
The message “Running test test” happens after the second pass is done,
and the one I'm trying to supress,
W0002
,
at the very end of the program.
The .OPT
directives are processed during passes 1 and 2.
There's just no easy way to supress W0002
just for a portion of the code,
as I would have to carry forward that any labels defined between the disable and enable of W0002
should be exempt from the “no-label warning” check.
It's issues like these that complicate programs over time.
I was about to scrap the idea when I came up with a solution.
Each symbol in the symbol table has a reference count.
At the end of assembly,
there's code that goes through the symbol table and issues the warning if a label has a reference count of 0.
All I did was create another option,
.OPT * USES <label>
,
to increment the reference count of a label.
At the end of the day,
it works.
I'm not saying this is a “good” solution,
just “a” solution.
Wednesday, January 24, 2024
Well, that was weird
Bunny's pharmacy just called to remind us to call and remind them to renew Bunny's prescription. Um … okay?
Adventures in high dining
Bunny and I found oursevles at La Nouvelle Maison, an upscale eating establishment in downtown Boca Raton. I'm not sure why she picked the place—perhaps because our previous upscale dining establishment, Root Italian Kitchen is no longer open. Or perhaps it's “just because.”
In any case, we had a reservation for 8:00 pm. I made it yesterday, as Bunny was running about Chez Boca worrying about the dress code (turns out—“business casual” so I don't have to don my International Man of Mystery clothes). I received a text notification a few hours later, and a phone call today, asking to confirm our time.
We arrived at 8:00 pm after a slight detour through the valet parking lot of Trattoria Romana next door (the driving directions from Mr. Google were slightly unclear on that). We walked right in, stated our reservation name and time, and were immedately seated in the quite crowded restaurant. I found that quite surprising, given how busy it all looked.
One thing about high dining that I don't think I'll get used too—the level of attention to detail. I think our waiter only had three or four other tables to wait on, and when he wasn't busy, he was standing nearby, waiting at attention. And if we was busy, his assistant (Assistant!) was nearby waiting to serve us.
And boy, did we get served. A cheese platter of assertive goat, a more assertive bleu and a brie that gave butter a run for its money. We decided not to get any caviar, but we did get a Soupe à L’Oignon gratinee for me and Pâté de Foie Gras for Bunny. Those were followed by a Petite Laitue Roquefort for me, and a Salade de Betterave for Bunny.
And then the entrees. I ordered the Risotto de Saint-Jacques à la truffe et aux épinards while Bunny had the Côte de veau aux Champignons Forresterie. I think the most amazing thing about Bunny's dinner was the gratin potatoes. Our waiter explained how they were made—the potatoes were sliced paper thin (thin enough to see through) and then layered with gruyere cheese, pressed down with a brick for over 24 hours in the refriderator, then baked and just before serving, deep fried for about a minute. It was perfect cube of potato and cheese about 3″ (7.5cm) per side, made up of easily a hundred layers.
Desert was a chocolate soufflé. That was my first soufflé, and also my last. I'm not saying it was bad—it wasn't by any stretch of the imagination—it was delicious! But my issue with the soufflé was one of texture. I'm sensitive to some … textures … that some foods have, and this one triggered that sensitivity. The only reason I ate more than one spoonfull was just down to how good it was, and I was able to bull through my textural revulsions. In all my times eating at find dining establishments, I've found that even if I don't like a particular item, it will be the best particular item I've ever had.
Was everything we had good? It's French! Of course it was good. All of it. The service was incredible, and our only real complaint of the night was the noise level when we first arrived—it was a bit too high for our liking. And the price was about what we expected—it's the “once a year” level of price.
Friday, January 26, 2024
“It is just a barebones framework written as a love letter to the language of C.”
I'm used to having some of my posts make it to the Orange Site,
but I was not expecting to have one of my software projects
(in this case, mod_blog
)
make it to the Orange Site.
I'm finding it especially amusing to read this thread.
I did not expect mod_blog
to be a “love letter to C.”
Wednesday, January 31, 2024
The Repair Culture, Part II—Electric DeoxIToo
I've repaired my Logitech Trackman Marble a few times over the years, but this time the traditional fix didn't work. But I have seen enough Adrian Black computer repair videos to know that perhaps, a liberal application of DeoxIT Spray Contact Cleaner on the buttons might work. I ordered some last week, and when I went out to check the mail, I found it sitting on top of the mail box! I'm surprised it didn't fall off.
Anyway, a liberal amount of DeoxIT in the buttons and yup, that did the trick this time.
Sweet.
Dear LinkedIn, I don't think I'm the expert you want answering these questions
I cross post links to my blog on LinkedIn mainly to be contrarian, or at least think I'm providing something different than all the business related stuff posted there. But lately, I've seen notifications there like, “You're one of the few experts invited to add this collaborative article: …” and it's some article about AI, or Agile or the latest one, “Your team is falling behind on project deadlines. What web-based tools can help you catch up?”
Oh … nothing good can come from me answering these questions.
I know languages that have support for “read-only memory,” but what about “write-only memory?”
I'm still hacking away on my overengineered 6809 assembler and one feature I've beem mulling over is a form of static access checking. I have byte-level access control when running tests but I'm thinking that adding some form of “assemble time checking” would also be good. I've been writing code hitting the hardware of the Color Computer, and there are semantics around hardware that I don't think many languages (or even assembler) support—write only memory! As the Amiga Hardware Reference Manual states (only referenced here because it's a good example of what I'm talking about):
Registers are either read-only or write-only. Reading a write-only register will trash the register. Writing a read-only register will cause unexpected results.
…
When strobing any register which responds to either a read or a write, (for example copjmp2) be sure to use a
MOVE.W
, notCLR.W
. TheCLR
instruction causes a read and a clear (two access) on a 68000, but only a single access on 68020 processors. This will give different results on different processors.
The Color Computer isn't quite as finicky
(although the 6809 inside it also does the “read, then write” thing with the CLR
instruction),
but there is still memory-mapped IO that is read-only, some that is write-only,
and some that has different meanings when reading and writing.
And while C has some semantic support with volatile
(to ensure reads and writes happen when stated)
and const
(to ensure the read-only nature)
it still lacks a “write-only” concept.
And I've never used an assembler that had “write-only” semantics either.
I'm thinking something along these lines:
org $FF40 DSK.CTRL rmb/w 1 ; write only org $FF48 DSK.CMD rmb/w 1 ; write only org $FF48 DSK.STATUS rmb/r 1 ; read only DSK.TRACK rmb 1 ; these can be read and written DSK.SECTOR rmb 1 DSK.DATA rmb 1
Here, the RMB
directive just reserves a number of bytes, with a default access of “read-write.”
The /W
or /R
designates that label as being either “write-only” or “read-only.”
And if you look closely,
you'll see that both DSK.CMD
and DSK.STATUS
are defined as the same address.
It's just that writing to that address will send a command to the drive controller,
while reading from that address give the current status.
The only issue I have are hardware registers that can be programmed for input or output.
The MC6821 used in the Color Computer has such registers,
and the issue I have is how to signify this change in state in a program—that at this point in the program,
such-n-such address is “read-write” but afterwards, it's “write-only.”
Discussions about this entry
How much for the book? I don't think I paid that much for the computer
Now, about that Amiga Hardware Reference Manual link in my previous post—$577.99‽
Seriously‽
I know it's now a niche market, but are there really people buying that book for almost $600?
Good Lord!