August 15th, 2025
rocky41_7: (Default)
Today I finished book #11 on the "Women in Translation" rec list: Concerning My Daughter by Kim Hye-Jin, translated from Korean by Jamie Chang. This book is about an a widow in her mid-70s who ends up sharing a home with her adult daughter and her daughter's partner. Her contentious relationship with her daughter pits her long-held beliefs and societal viewpoints against her love for her child; simultaneously, she struggles in her job caring for an elderly dementia patient in a nursing home.
 
The protagonist is a person who values, above all, keeping your head down and doing what's expected of you. She does not believe in standing out; she does not believe in involving yourself in other people's problems; perhaps for these reasons, she believes the only people you can ever count on are family. This is how she's lived her whole life, and she believes it was for the best. However, this mindset puts her directly in conflict with her daughter, a lesbian activist who is fighting for equal employment treatment for queer professors and teachers in the South Korean educational system. 
 
When her daughter, Green, runs out of money to pay rent after a quarrel with the university where she was lecturing, the protagonist allows Green and her partner Lane to move in, despite their fractious relationship.

Read more... )Read more... )
marycatelli: (Golden Hair)
posted by [personal profile] marycatelli in [community profile] books at 12:57pm on 15/08/2025
The Proving Trail by Louis L'Amour

The young narrator of this tale leaves his job herding cattle to find his father, and learns that his father was murdered after a night of successful gambling.
Read more... )
posted by [syndicated profile] xkcd_feed at 04:00am on 15/08/2025
August 13th, 2025
marycatelli: (Golden Hair)
posted by [personal profile] marycatelli in [community profile] books at 01:07pm on 13/08/2025
Sanders' Union Fourth Reader by Charles Walton Sanders

Despite the titles, this is more recent than his New Fourth Reader. It repeats three or four readings from the earlier works, not all of them from the fourth reader.

Interesting nowadays chiefly for the views of edifying works and science of the time.
posted by [syndicated profile] xkcd_feed at 04:00am on 13/08/2025
August 12th, 2025
marycatelli: (Golden Hair)
posted by [personal profile] marycatelli in [community profile] books at 05:40pm on 12/08/2025
To Tame a Land by Louis L'Amour

You can do a lot of things in Westerns. This one is a bildungsroman.

Read more... )
August 11th, 2025
marycatelli: (Golden Hair)
posted by [personal profile] marycatelli in [community profile] books at 07:33pm on 11/08/2025
The School Reader. Third Book: Containing Progressive Lessons in Reading, Exercises in Articulation and Inflection, Definitions, by Charles Walton Sanders

The third book is still focused on reading. Very few of the pieces come with bylines. Still, it's taking on the aspect of the later readers, with the focus on good readings, edifying and instruction.

May be chiefly of interest in view of what they selected in the era.
posted by [syndicated profile] xkcd_feed at 04:00am on 11/08/2025
August 10th, 2025
labingi: (Default)
posted by [personal profile] labingi in [community profile] books at 08:07pm on 10/08/2025
This is the first self-published book I have ever read a good chunk of without realizing it was self-published. [EDIT: This is not a dig at self-published writing. I am self-published and hope my books are roughly comparable to traditional in quality, but it is a mountain to climb to do all the traditional publisher work yourself on your own dime, so I'm impressed when a work does it, and I want to uplift that it's possible.] The book is as well written as a number of recent traditionally published books; it’s well edited, proofread, designed, nice cover art. It looks professional.

But in retrospect, it had to be self-published because it’s a Silmarillion fan fic with the names changed, and a traditional publisher wouldn’t take it for fear of being sued. (Not really spoilery: this is clear quite early.) Its premise (I’ll just render this in Tolkien terms) is one of the exiled Noldor returns to the Undying Lands after dying (?) in Middle-earth. That’s a fantastic premise for a fic! With some alterations, it’s a great premise for an original story. That’s why I bought it! I don’t think it fully exploits this premise, though. It’s a goldmine for psychological and philosophical development, and it has fairly little of either, in my opinion.

It does have a great original addition in the idea of a male and female elf who are well-matched “professional/vocational” rivals to such a degree they can be almost interchanged with each other. That concept may be the story’s strongest, and again, I felt it wasn’t fully exploited.

But some of my discontents are discontents with the source material (The Silmarillion): 1) the style is, for my taste, too expository—too much “telling,” not enough “showing”; 2) I just don’t get the concept of the Undying Lands on any deep level, because my cosmology is very different from Tolkien’s. Goddard is, I think, trying to follow Tolkien here, and part of my difficulty suspending disbelief may come from my just not getting it. I give her marks, on the whole, for showing respect for Tolkien’s work and not altering his Elves in any bizarre ways.

One the whole, I find the book conceptually fascinating but not developed deeply enough to fully engage me.

Spoilery review at my DW.
marycatelli: (Golden Hair)
posted by [personal profile] marycatelli in [community profile] books at 12:17pm on 10/08/2025
Ghost in the Tombs by Jonathan Moeller

Caina's 32nd book. Spoilers ahead for the earlier ones.

Read more... )
August 9th, 2025
marycatelli: (Golden Hair)
posted by [personal profile] marycatelli in [community profile] books at 02:21pm on 09/08/2025
Sanders' young ladies' reader : embracing a comprehensive course of instruction in the principles of rhetorical reading : with a choice collection of exercises in reading, both in prose and poetry, for the use of the higher female seminaries, as also, the higher classes in female schools generally by Charles W. Sanders

A selection of prose and poetry intended for elocution classes. Interesting, nowadays, chiefly for the selections choosing. With an eye to variety, the preface assures us, because they are intended for the young.

This one is, unlike the fourth and fifth readers, aimed specifically at girls. Which means a couple on the education of women and the necessity of its being for their whole lives, and not the flurry of society to win their husbands, and more female characters in the stories. It has a couple of selections that overlap with those readers.

August 8th, 2025
rocky41_7: (Default)
Today I wrapped up Annihilation by Jeff VanderMeer, a horror/sci-fi novel with fantastical (?) elements about a biologist exploring a very unsettling landscape.
 
There are no names given in this book—the narrator and protagonist is simply "the Biologist," and she refers to her other three teammates by their job titles as well. Locations outside of the place they're exploring—Area X—are not given either, but the world is implied to be much the same as our own, with Area X a troubling and relatively recent anomaly. A private company hires the Biologist and her colleagues to venture into this strange place and take notes. They are the 12th such expedition.
 I appreciate that much of the horror in Annihilation isn't in-your-face: it's the slow build of things that are just off. This quiet and subtle approach means that when something extreme happens, it feels extreme. The Biologist and her colleagues know that Area X is dangerous before they venture in, but even so, they are unprepared for how and to what degree. VanderMeer's portrayal of how trust frays among relative strangers under these conditions felt realistic.

Read more... )
posted by [syndicated profile] xkcd_feed at 04:00am on 08/08/2025
August 6th, 2025
rocky41_7: (Default)
"There was a wall. It did not look important. It was built of uncut rocks roughly mortared. An adult could look right over it, and even a child could climb it. Where it crossed the roadway, instead of having a gate it degenerated into mere geometry, a line, the idea of a boundary. But the idea was real. It was important. For seven generations there had been nothing more important than that wall."

I knew this book was going to hit hard from the opening paragraph above, and it did not disappoint. I've enjoyed Ursula Le Guin's work before--The Left Hand of Darkness is one of my favorite books—and I absolutely see why The Dispossessed is considered one of her crowning pieces. The setting for this book is a planet and its moon—Urras, the planet, is a lush world not dissimilar from Earth, which is home to several capitalist countries and at least one socialist country; and Anarres, the moon, which is a dusty, resource-scanty place home to a society of anarchists who fled from Urras just under two hundred years ago. The core of the novel concerns Shevek, a theoretical physicist from Anarres who chooses to relocate to Urras.
 
Le Guin captures truly great sci-fi because this work is so imbued with curiosity. Le Guin is asking questions at the heart of any great sci-fi work: What defines humanity? What can we achieve, and how is it done, and what does that mean for society? What is society? What does it mean to be alone? What does it mean to be part of a whole? To me, sci-fi can't be truly sci-fi without a measure of philosophy, and The Dispossessed has this in droves. 
 
posted by [syndicated profile] xkcd_feed at 04:00am on 06/08/2025
August 4th, 2025
marycatelli: (Golden Hair)
posted by [personal profile] marycatelli in [community profile] books at 11:51pm on 04/08/2025
Frieren: Beyond Journey's End, Vol. 13 by Kanehito Yamada

Spoilers for the earlier volumes

Read more... )
posted by [personal profile] mjg59 at 08:10pm on 03/08/2025 under ,
There's a lovely device called a pistorm, an adapter board that glues a Raspberry Pi GPIO bus to a Motorola 68000 bus. The intended use case is that you plug it into a 68000 device and then run an emulator that reads instructions from hardware (ROM or RAM) and emulates them. You're still limited by the ~7MHz bus that the hardware is running at, but you can run the instructions as fast as you want.

These days you're supposed to run a custom built OS on the Pi that just does 68000 emulation, but initially it ran Linux on the Pi and a userland 68000 emulator process. And, well, that got me thinking. The emulator takes 68000 instructions, emulates them, and then talks to the hardware to implement the effects of those instructions. What if we, well, just don't? What if we just run all of our code in Linux on an ARM core and then talk to the Amiga hardware?

We're going to ignore x86 here, because it's weird - but most hardware that wants software to be able to communicate with it maps itself into the same address space that RAM is in. You can write to a byte of RAM, or you can write to a piece of hardware that's effectively pretending to be RAM[1]. The Amiga wasn't unusual in this respect in the 80s, and to talk to the graphics hardware you speak to a special address range that gets sent to that hardware instead of to RAM. The CPU knows nothing about this. It just indicates it wants to write to an address, and then sends the data.

So, if we are the CPU, we can just indicate that we want to write to an address, and provide the data. And those addresses can correspond to the hardware. So, we can write to the RAM that belongs to the Amiga, and we can write to the hardware that isn't RAM but pretends to be. And that means we can run whatever we want on the Pi and then access Amiga hardware.

And, obviously, the thing we want to run is Doom, because that's what everyone runs in fucked up hardware situations.

Doom was Amiga kryptonite. Its entire graphical model was based on memory directly representing the contents of your display, and being able to modify that by just moving pixels around. This worked because at the time VGA displays supported having a memory layout where each pixel on your screen was represented by a byte in memory containing an 8 bit value that corresponded to a lookup table containing the RGB value for that pixel.

The Amiga was, well, not good at this. Back in the 80s, when the Amiga hardware was developed, memory was expensive. Dedicating that much RAM to the video hardware was unthinkable - the Amiga 1000 initially shipped with only 256K of RAM, and you could fill all of that with a sufficiently colourful picture. So instead of having the idea of each pixel being associated with a specific area of memory, the Amiga used bitmaps. A bitmap is an area of memory that represents the screen, but only represents one bit of the colour depth. If you have a black and white display, you only need one bitmap. If you want to display four colours, you need two. More colours, more bitmaps. And each bitmap is stored in an independent area of RAM. You never use more memory than you need to display the number of colours you want to.

But that means that each bitplane contains packed information - every byte of data in a bitplane contains the bit value for 8 different pixels, because each bitplane contains one bit of information per pixel. To update one pixel on screen, you need to read from every bitmap, update one bit, and write it back, and that's a lot of additional memory accesses. Doom, but on the Amiga, was slow not just because the CPU was slow, but because there was a lot of manipulation of data to turn it into the format the Amiga wanted and then push that over a fairly slow memory bus to have it displayed.

The CDTV was an aesthetically pleasing piece of hardware that absolutely sucked. It was an Amiga 500 in a hi-fi box with a caddy-loading CD drive, and it ran software that was just awful. There's no path to remediation here. No compelling apps were ever released. It's a terrible device. I love it. I bought one in 1996 because a local computer store had one and I pointed out that the company selling it had gone bankrupt some years earlier and literally nobody in my farming town was ever going to have any interest in buying a CD player that made a whirring noise when you turned it on because it had a fan and eventually they just sold it to me for not much money, and ever since then I wanted to have a CD player that ran Linux and well spoiler 30 years later I'm nearly there. That CDTV is going to be our test subject. We're going to try to get Doom running on it without executing any 68000 instructions.

We're facing two main problems here. The first is that all Amigas have a firmware ROM called Kickstart that runs at powerup. No matter how little you care about using any OS functionality, you can't start running your code until Kickstart has run. This means even documentation describing bare metal Amiga programming assumes that the hardware is already in the state that Kickstart left it in. This will become important later. The second is that we're going to need to actually write the code to use the Amiga hardware.

First, let's talk about Amiga graphics. We've already covered bitmaps, but for anyone used to modern hardware that's not the weirdest thing about what we're dealing with here. The CDTV's chipset supports a maximum of 64 colours in a mode called "Extra Half-Brite", or EHB, where you have 32 colours arbitrarily chosen from a palette and then 32 more colours that are identical but with half the intensity. For 64 colours we need 6 bitplanes, each of which can be located arbitrarily in the region of RAM accessible to the chipset ("chip RAM", distinguished from "fast ram" that's only accessible to the CPU). We tell the chipset where our bitplanes are and it displays them. Or, well, it does for a frame - after that the registers that pointed at our bitplanes no longer do, because when the hardware was DMAing through the bitplanes to display them it was incrementing those registers to point at the next address to DMA from. Which means that every frame we need to set those registers back.

Making sure you have code that's called every frame just to make your graphics work sounds intensely irritating, so Commodore gave us a way to avoid doing that. The chipset includes a coprocessor called "copper". Copper doesn't have a large set of features - in fact, it only has three. The first is that it can program chipset registers. The second is that it can wait for a specific point in screen scanout. The third (which we don't care about here) is that it can optionally skip an instruction if a certain point in screen scanout has already been reached. We can write a program (a "copper list") for the copper that tells it to program the chipset registers with the locations of our bitplanes and then wait until the end of the frame, at which point it will repeat the process. Now our bitplane pointers are always valid at the start of a frame.

Ok! We know how to display stuff. Now we just need to deal with not having 256 colours, and the whole "Doom expects pixels" thing. For the first of these, I stole code from ADoom, the only Amiga doom port I could easily find source for. This looks at the 256 colour palette loaded by Doom and calculates the closest approximation it can within the constraints of EHB. ADoom also includes a bunch of CPU-specific assembly optimisation for converting the "chunky" Doom graphic buffer into the "planar" Amiga bitplanes, none of which I used because (a) it's all for 68000 series CPUs and we're running on ARM, and (b) I have a quad core CPU running at 1.4GHz and I'm going to be pushing all the graphics over a 7.14MHz bus, the graphics mode conversion is not going to be the bottleneck here. Instead I just wrote a series of nested for loops that iterate through each pixel and update each bitplane and called it a day. The set of bitplanes I'm operating on here is allocated on the Linux side so I can read and write to them without being restricted by the speed of the Amiga bus (remember, each byte in each bitplane is going to be updated 8 times per frame, because it holds bits associated with 8 pixels), and then copied over to the Amiga's RAM once the frame is complete.

And, kind of astonishingly, this works! Once I'd figured out where I was going wrong with RGB ordering and which order the bitplanes go in, I had a recognisable copy of Doom running. Unfortunately there were weird graphical glitches - sometimes blocks would be entirely the wrong colour. It took me a while to figure out what was going on and then I felt stupid. Recording the screen and watching in slow motion revealed that the glitches often showed parts of two frames displaying at once. The Amiga hardware is taking responsibility for scanning out the frames, and the code on the Linux side isn't synchronised with it at all. That means I could update the bitplanes while the Amiga was scanning them out, resulting in a mashup of planes from two different Doom frames being used as one Amiga frame. One approach to avoid this would be to tie the Doom event loop to the Amiga, blocking my writes until the end of scanout. The other is to use double-buffering - have two sets of bitplanes, one being displayed and the other being written to. This consumes more RAM but since I'm not using the Amiga RAM for anything else that's not a problem. With this approach I have two copper lists, one for each set of bitplanes, and switch between them on each frame. This improved things a lot but not entirely, and there's still glitches when the palette is being updated (because there's only one set of colour registers), something Doom does rather a lot, so I'm going to need to implement proper synchronisation.

Except. This was only working if I ran a 68K emulator first in order to run Kickstart. If I tried accessing the hardware without doing that, things were in a weird state. I could update the colour registers, but accessing RAM didn't work - I could read stuff out, but anything I wrote vanished. Some more digging cleared that up. When you turn on a CPU it needs to start executing code from somewhere. On modern x86 systems it starts from a hardcoded address of 0xFFFFFFF0, which was traditionally a long way any RAM. The 68000 family instead reads its start address from address 0x00000004, which overlaps with where the Amiga chip RAM is. We can't write anything to RAM until we're executing code, and we can't execute code until we tell the CPU where the code is, which seems like a problem. This is solved on the Amiga by powering up in a state where the Kickstart ROM is "overlayed" onto address 0. The CPU reads the start address from the ROM, which causes it to jump into the ROM and start executing code there. Early on, the code tells the hardware to stop overlaying the ROM onto the low addresses, and now the RAM is available. This is poorly documented because it's not something you need to care if you execute Kickstart which every actual Amiga does and I'm only in this position because I've made poor life choices, but ok that explained things. To turn off the overlay you write to a register in one of the Complex Interface Adaptor (CIA) chips, and things start working like you'd expect.

Except, they don't. Writing to that register did nothing for me. I assumed that there was some other register I needed to write to first, and went to the extent of tracing every register access that occurred when running the emulator and replaying those in my code. Nope, still broken. What I finally discovered is that you need to pulse the reset line on the board before some of the hardware starts working - powering it up doesn't put you in a well defined state, but resetting it does.

So, I now have a slightly graphically glitchy copy of Doom running without any sound, displaying on an Amiga whose brain has been replaced with a parasitic Linux. Further updates will likely make things even worse. Code is, of course, available.

[1] This is why we had trouble with late era 32 bit systems and 4GB of RAM - a bunch of your hardware wanted to be in the same address space and so you couldn't put RAM there so you ended up with less than 4GB of RAM
posted by [syndicated profile] xkcd_feed at 04:00am on 04/08/2025
August 2nd, 2025
marycatelli: (Golden Hair)
posted by [personal profile] marycatelli in [community profile] books at 11:14am on 02/08/2025
Frieren: Beyond Journey's End, Vol. 12 by Kanehito Yamada

Spoilers ahead for the earlier volumes

Read more... )

September

SunMonTueWedThuFriSat
      1
 
2
 
3
 
4
5
 
6
 
7
 
8
 
9
 
10
 
11
 
12
 
13
 
14
 
15
 
16
 
17
 
18
 
19
 
20
 
21
 
22
 
23
 
24
 
25
 
26
 
27
 
28
 
29
 
30