Colin McMillen
@colin-mcmillen.piaille.fr.ap.brid.gy
28 followers 1 following 300 posts
Cycliste, écologiste, gauchiste, et d'autres mots en iste. Sur mon temps libre, je fais des trucs comme du logiciel libre, des meubles, du #RetroComputing […] [bridged from https://piaille.fr/@colin_mcmillen on the fediverse by https://fed.brid.gy/ ]
Posts Media Videos Starter Packs
colin-mcmillen.piaille.fr.ap.brid.gy
6502 assembly optimization starts to feel real good when you can replace
`beq out
jmp loop`

with `bne loop`

#retrocomputing
Reposted by Colin McMillen
martin.boitam.eu.ap.brid.gy
Le rôle de l'humain payé à corriger les sorties d'IA, c'est notamment de pouvoir être blâmé en cas d'erreur.

On retire à l'opérateur la maîtrise de sa tâche, tout en lui transférant l'ensemble des responsabilités. Ceux qui ont décidé de merdifier le travail au nom de la productivité n'ont […]
Original post on boitam.eu
boitam.eu
colin-mcmillen.piaille.fr.ap.brid.gy
@JessTheUnstill @grumpybozo i think a lot of them are staged, not sure if it's any better though
Reposted by Colin McMillen
jonny.neuromatch.social.ap.brid.gy
["AI" schadenfreude, reddit screenshot]

"What if someone uses an LLM to rip off my app that I ripped off with an LLM????"
Do we need AI IP protections for Vibe Coded software?!

What happens when someone vibe codes an app, it takes off, and then a Reddit user says, “let me share the link to this app and have GPT build a clone with some tweaks”? The same GPT that helped build the original can basically flush it out in days. It knows the problems the vibe coder had to solve, the edge cases, the fixes. Boom -- delivered. That’s terrifying. IT STILL takes a lot of work to vibe code complex apps. It IS not easy especially if you don't have formal engineering experience. I don't want my work to just get cloned when I worked with AI to solve a complex software problem and build out a full UX etc and now someone else does it because it was previously trained on the exact same problems and app I was making (Claude will now use your conversations and history to train it's data) - I think others might also to better tune their models in real time. 

We need tools and laws that let people patent their apps, and once published, major AI companies shouldn’t be allowed to spit out clones. That protects the time and value of someone who vibe coded something real. It hasn’t hit yet, but if only a few companies own the AI infrastructure and distribution, this will be a huge issue.

Think about it like this: I can’t just walk into a shop and clone a Ford Raptor or a MacBook with small changes. There’s a barrier. That’s what IP does -- it stops easy copycats. But with digital AI, anyone can clone [an app]
Reposted by Colin McMillen
colin-mcmillen.piaille.fr.ap.brid.gy
Part 2 on the optimization of the Quicktake 150 decoder, focusing on the 6502 assembly, is out. It is more low-level than the first one, but I tried to comment the examples and explain as best as I could […]
Original post on piaille.fr
piaille.fr
colin-mcmillen.piaille.fr.ap.brid.gy
Part 2 on the optimization of the Quicktake 150 decoder, focusing on the 6502 assembly, is out. It is more low-level than the first one, but I tried to comment the examples and explain as best as I could […]
Original post on piaille.fr
piaille.fr
colin-mcmillen.piaille.fr.ap.brid.gy
I'm trying to write a second part on the Quicktake 150 decoder optimization, this time focusing on the assembly tricks, and it's hard to do it in a readable way. I will insert memes so that it's easier to digest.
#retrocomputing #apple2
colin-mcmillen.piaille.fr.ap.brid.gy
I never thought that "this OS doesn't nag me to upgrade my cloud storage every day" would be a selling point for Linux.
Reposted by Colin McMillen
colin-mcmillen.piaille.fr.ap.brid.gy
Walk through my reworking of dcraw's Quicktake 150 decoder's algorithm. This article is about high-level optimization and the code is in C so this should be rather accessible.

https://www.colino.net/wordpress/en/archives/2025/09/28/optimizing-a-6502-image-decoder-from-70-minutes-to-1-minute/ […]
Original post on piaille.fr
piaille.fr
colin-mcmillen.piaille.fr.ap.brid.gy
Walk through my reworking of dcraw's Quicktake 150 decoder's algorithm. This article is about high-level optimization and the code is in C so this should be rather accessible.

https://www.colino.net/wordpress/en/archives/2025/09/28/optimizing-a-6502-image-decoder-from-70-minutes-to-1-minute/ […]
Original post on piaille.fr
piaille.fr
colin-mcmillen.piaille.fr.ap.brid.gy
I'm having diminishing returns now and will probably leave it at that right now. I should write a little blog post about it as, as usual, the most gains came from unfucking the initial algorithm.
colin-mcmillen.piaille.fr.ap.brid.gy
This week-end's release of #quicktake for Apple II brings the decoding speed to under 60 seconds for Quicktake 150 pictures.

https://www.colino.net/wordpress/en/quicktake-for-apple-ii/

#retrocomputing #appleii
Quicktake for Apple II
**~~Reject modernity,~~ reject planned obsolescence.** Editing a picture of my living room with Quicktake for Apple II Apple released their first **Quicktake** camera, the Quicktake 100, in 1994, ten years after the **Apple IIc**. On the Windows version’s box, they very boldly wrote: “Requirements: 386, 486 or superior; 2MB of RAM, 10MB of free hard disk space; an 1.44MB floppy drive; a VGA, SVGA or superior card”. But was this true? No. They were just being lazy, or trying to get you to upgrade a perfectly functional 8-bit, 1MHz computer with 128kB of RAM and 140kB floppies. In fact, it was absolutely possible to do digital photography on an Apple //c. **Getting it** The source code is available on my Github, as usual. The Quicktake floppy image is also provided in the Releases. To use it, transfer it to a floppy using ADTPro or STP, build a monstruous cable as explained below and in the Quicktake for Apple II User Manual (which is a quick way to see how this software works), connect a Quicktake, and you’re all set! The software works on Apple //c, IIe (Extended 80 columns card and two Super Serial Cards required) and IIgs. It is best used with a monochrome monitor given that this is a monochrome implementation, and when using a color monitor, the infamous color bleeding of the Apple II can render images with green and violet pixels where we would want them white. **Screenshots** The setup Debugging the connection Downloading a picture Converting a picture The result, seen on screen The same result, shared on Mastodon A portrait-oriented photo, resized to fit Same portrait-oriented-photo, cropped instead **What the software can do** * Connect to a Quicktake 100, 150 or 200 camera * Get photos from the camera * Convert photos to DHGR format (512×192): * Auto-level (equalize histogram) photos for better contrast * Manually alter photo brightness * Dither using either Sierra Lite or Bayer algorithms, or don’t dither at all * Rotate portrait-oriented photos and either scale them down to fit, or crop them * Crop pictures to “zoom” into parts of it (512×384 and 256×192 for 640×480 pictures, 256×192 for 320×240 pictures) * Conversions are cancellable, to get to the best result faster * Save the raw photo and its DHGR conversion * Print pictures to an ImageWriter II * These additional features are only available for the QuickTake 100 and 150: * Delete photos from the camera * Preview thumbnails from the camera * Order the camera to take a picture, set flash mode, set quality * Change the camera name and date/time **The performance** The performance is great in the sense that, with some settings, you will be able to get one coffee per picture, if you feel so inclined. Here is some precise performance data for a “from the Quicktake 100 to the result on screen”, on a 1MHz Apple //c: | **Standard quality** , 320×200| **High quality** , 640×480 ---|---|--- Downloading from the Quicktake 100| 33 seconds| 1 minute 50 Decompressing the picture| 9 seconds| 30 seconds Displaying the picture| 11 seconds| 11 seconds Loading the programs from floppy| 19 seconds| 19 seconds **Total**| **1 minute 12**| **2 minutes 50** Previewing a thumbnail takes about 10 seconds. On an Apple IIgs, which has a faster serial port and CPU, you can divide these numbers by about 2.5. The Quicktake 150 and 200 pictures are better compressed, with algorithms much more complex, so they require more math to decompress. The download time is about halved by the better compression, but the decompression time is longer, so the total time from camera to screen is about _4 minutes_ on a 1MHz Apple II. **Connecting the Quicktake 100 or 150** On Apple IIe and Apple //c, a very specific serial cable is required due to hardware limitations. For the Apple IIgs, the standard AppleTalk 8-pin serial cable works. **Serial cable instructions** **For the Apple IIc** , the cable wiring is as follows: Pin 1 (DTR) of the printer DIN5 is connected to pins 2 and 7 of the mini-DIN8 connector. Pins 2 (TX), 3(GND) and 4(RX) of the modem DIN5 are connected to pins 5, 4 and 3 of the Mini-DIN8 connector. Pins 1 and 5 of the modem DIN5 are optionally wired together. The pins numbering The cabling schema **For an Apple IIe** , with two Super Serial Cards (SSC) in slots 1 and 2, the cable is similar, but using DB-25 serial connectors instead of DIN-5: pin 20 (DTR) of the slot 1 connector goes to pins 2 and 7 of the Mini-DIN-8; pin 7 (GND), 2 (TXD) and 3 (RXD) of the slot 2 connector are connected to pins 4, 2 and 3 of the Mini-DIN-8. Double DB-25 for Apple IIe For an Apple IIc+, use this schematic (thanks to Hideaki Seike!) Cable wiring for the IIc+ Note: you can also build a splitter cable to use in conjunction with the standard male Mini-Din-8 to female DB-9 cable that is provided with the Quicktake (at least with the Windows version), which is detailed here. **Connecting the Quicktake 200** Connecting a Quicktake 200 is much simpler. The one that was lent to me came with a mini-jack to female DB-9 connector. It is a null-modem cable. On the Apple II side, I have another null-modem DIN-5 to female DB-9 cable. Two null-modems cancel the null-modem feature, so I plugged one into the other with a male-male null-modem DB-9 adapter. **Why and how** My Mastodon client being about complete, I wanted another retro computing challenge and it seemed like a good idea to find a way to be able to use it as I would use the website or the Android app: being able to post actual photos, instead of MousePaint drawings. I first investigated handheld scanners, but it seems like the vintage, pre-USB ones all came with a dedicated extension card, so that was not an option. Instead, I found an old Apple Quicktake 100 camera, and set out to reverse engineer its serial protocol and image format, and develop a Quicktake for Apple II program. I started with the image format while I was waiting for the actual camera to arrive. I didn’t have to reverse-engineer it, as dcraw handles its raw format. However, I had to reverse-engineer dcraw, and in hindsight, that was… harder than the serial protocol. dcraw is a very powerful tool, that handles more than 700 different cameras, and it comes in the form of one (1) source file, containing 10500 lines, of which 9878 are code, 443 are blank, and 184 (!) are comments. It starts with a block of 32 lines packed with global variables. None of the comments actually explain anything about the decoding algorithms. If I were a mean person, I would say that dcraw is a huge pile of awful, unmaintainable code. But then I remember that it’s a pet project of an individual doing it on his free time, for free, and that he’s absolutely entitled to programming in whatever style he wants. I started ripping it apart, removing every *_load_raw() function for cameras I’m not interested in, then removing all command-line argument parsing, then removing every unused variable and function that -Wunused told me became useless. Each compilation with -Wunused lead to removing more code. A final pass made it possible to remove variables that were only set but not actually used, and I ended up with less than 500 lines of code, most of them being the actual ADPCM decompression algorithm. That first step was necessary, but absolutely not enough to imagine running it as is on an Apple II. First of all, loading the full compressed image in memory, about 120kB, would not be possible. Then, decompressing it into a temporary buffer (uint8 pixel[484][644], that is 312kB) would absolutely not be possible. Then, copying this temporary buffer to the final result (640×480, another 300kB) would still be inimaginable. The Apple IIc has 64k of main RAM, with about 40kB usable by a cc65 program, and 64k of auxiliary RAM, difficult to use efficiently due to its adressing mode. The solution I found was to load, decompress, down-scale and dither the image one horizontal band of 640×20 pixels after another. The drawback of this is that once you arrive at the end of the image, you’re done, but you can’t do any auto levels correction, because you long forgot the 24-bit data for the previous bands. You also can’t dither with a good algorithm because it resets between each band. But I didn’t see another solution. As you can see, there is quite little wiggle room once this basic method is implemented: After a few quite intense evenings, I was able to correctly decode an image: The image as decoded by dcraw One of my early decodings Another one Almost there… There we are! At first, the algorithm took… 90 minutes to decode and convert a 640×480 photo! I managed to get this down to 15 minutes by avoiding everything that’s difficult for a 6502, like multiplications, shifts, and direct image[row][col] accesses – which hide multiplications. As you may know, the 6502 doesn’t do hardware multiplications, so to access image[405, 100], it has to do 640*405 the old-fashioned way, (hex) digit by (hex) digit, then add 100. A second hard look at the algorithm made me realize that while I must decompress and resize the image by 20 pixels bands, I have, in fact, enough RAM to store the resized, 8bpp grey-level result, as 256x192x8bpp is a 49kB array, into the auxiliary RAM. That allows me to auto-level the greyscale image, and dither in one pass with a better algorithm (Sierra Lite) than the first one I used (Bayer); The results are much better with this technique, and it doesn’t even take longer! And lots of optimizations later, the time is now about 35 seconds, and I’ve learnt assembly. My spouse and her mother, rendered with my second algorithm version For the serial protocol, the best thing I found was to install a Windows 3.11 VirtualBox VM, install the Quicktake software on it, and strace the VirtualBox process. Filtering on ioctl(), read() and write() on /dev/ttyUSB0’s file descriptor gave me a good idea what the application was doing. Adding relative timestamps helped me figure out the required delays. The strace command I used is `sudo strace -p 1242484 -f -eread,write,ioctl -r`. This gave me this sort of thing to work with: An extract of a trace. Strace is not very fun to work with as it insists on outputting octal characters and I’d rather have hexadecimal (the `-e r=48 -e w=48` options tentatively fix that, but are horrible when bytes are read/written one by one). But, that’s still better than nothing, and I didn’t manage to get anything else (like slsnif) working. Reverse-engineering serial communication of such an old protocol is not rocket science once you can actually see the bytes exchanged, and it can be done by iterating and adding knowledge with multiple tests, changing one variable at the time. I iterated on the protocol by first very naively reproducing what I saw, with function names like “send_first_command”, “send_second_command”, and so on. At first the commands made no sense, and neither did the replies. But dump everything and look at the hexadecimal outputs, compare them with an actual QTK image extracted from the VM, and you will see where which bytes go. “first command” becomes “header command”, “second command” becomes “data command”, and so on. Transfer a high-quality picture and a low-quality picture, see which bytes change in the header, calculate their values and you find where width, height, size are. Take one more picture, see which byte got decremented by one in the camera’s summary. Notice which byte changes when you transfer the first, the second or the third picture on the camera: that’s your index right there. Etc. I managed to get most features working on my development PC: Getting camera information, getting a picture, deleting pictures, setting the camera’s name and date, taking a picture. I have documented all my findings about the Quicktake 100/150 serial protocol in a distinct post. I could see an added difficulty right from the beginning: the Quicktake 100 only starts talking to the PC once the DTR line is cleared (This may be why I couldn’t get slsnif to work). It is a simple matter of an ioctl() on a modern POSIX OS with modern serial “cards”. It is also simple to clear DTR on the Apple II’s ACIA 6551 serial chip, just a matter of setting one bit in the ACIA_CMD register… But this shutdowns the chip, preventing communication. And after all, it’s quite logical: once you signal to the other end that Data Terminal Ready is false, why be ready? We could also simply clear RTS, which pulls the physical DTR line down, but the camera pulls CTS down anyway, which disables the ACIA’s transmitter. So… The only way I found around that is to make a franken-cable, connecting to the Quicktake on one end, and on _both_ of the Apple IIc’s serial ports on the other end. I use the modem port for data transmission, with ground/TX/RX wired, and the printer port to control RTS/DTR, with only DTR wired. On this part, I must thank my wife a lot for her patience, as she helped me document each pin and wire, holding one of the multimeter’s probe on one end of the cable while I did the other – continuity testing the Mini-DIN8 with only two hands is very difficult as the pins are real close to each other and the probe slips a lot. My serial cable. **What people say about it** * _“Useless projects are the best projects!”_ * In the news: Hackaday, MacG **Special thanks** * Abi, my partner, for her patience and support <3 * Antoine Vignau, for the early Quicktake 150 tests * Pierre Dandumont, for lending me a Quicktake 150 and 200! * FozzTexx, for the IIe double Super Serial Card cable schematics * Rich Geldreich, for the picojpeg JPEG decoder * Dave Coffin, for dcraw’s QTKT and QTKN decoders
www.colino.net
Reposted by Colin McMillen
hex.kolektiva.social.ap.brid.gy
Really hoping to see some One Piece flags in the pictures from the next #nokings Day protests. I also hope everyone has brotherd to check the notes from Nepal. Regimes can collapse faster than expected. Sometimes it can be a total surprise.

I know things feel impossible right now, but you need […]
Original post on kolektiva.social
kolektiva.social
Reposted by Colin McMillen
paul-denton.mastodon.social.ap.brid.gy
Après le procès de Marine Le Pen, c'est la seconde fois en 6 mois que le Premier président de la cour d'appel de Paris, Jacques Boulard, émet un communiqué pour déplorer des menaces contre des magistrats qui ont siégé dans un tribunal sur un dossier politique […]

[Original post on mastodon.social]
COUR D’APPEL DE PARIS
MINISTERE DE LA JUSTICE 

Premiere présidence
Liberté
Egalité
Fraternité
COMMUNIQUE DE PRESSE

Paris, le 27 septembre 2025
Jugement du tribunal judiciaire de Paris du 25 septembre 2025 dans le dossier dit du financement libyen. 

Le premier président de la cour d’appel de Paris exprime sa vive inquiétude a la suite de la diffusion sur les réseaux sociaux de messages contenant des attaques personnelles et des menaces de mort visant les magistrats composant le tribunal correctionnel ayant statué sur le dossier dit du financement lybien. Il déplore également la remise en cause de leur impartialité visant a jeter le discrédit sur la décision rendue. Il rappelle que la voie légale de contestation de I'impartialité d'un magistrat, ouverte a toute partie jusqu’au prononcé du jugement, est la procédure de récusation prévue par les articles 668 et suivants du code de procédure pénale. La mise en cause de I'impartialité d'un magistrat ne peut intervenir a posteriori pour discréditer une décision de justice rendue collégialement, aprés des débats contradictoires. Aprés le prononcé d'un jugement, la voie de contestation ouverte aux parties est l'appel.
Dans un Etat de droit démocratique, la critique d'une décision de justice ne peut en aucun cas s'exprimer par des menaces formulées a I'égard des magistrats.
Le premier président appelle solennellement au respect de I'institution judiciaire et de son indépendance, garanties essentielles de I'Etat de droit.
colin-mcmillen.piaille.fr.ap.brid.gy
@bammerlaan Its important to stay ahead in technological innovations !
colin-mcmillen.piaille.fr.ap.brid.gy
6502 optimisation challenge anyone?
This is one of the two longest functions in my #quicktake 150 decoder, it's called 110k times, takes 7.9M cycles.
The vars are in zero-page already.

The function reads bits from a buffer to get the next valid Huffman code out of the buffer and return its […]
Original post on piaille.fr
piaille.fr
colin-mcmillen.piaille.fr.ap.brid.gy
Sarko a pris 5 ans avec mandat de dépôt hahaha cheh
Reposted by Colin McMillen
jenbanim.mastodo.neoliber.al.ap.brid.gy
If you mash the audio example buttons on the wikipedia page for the IPA vowel sounds you can create a choir of mildly disgusted men
colin-mcmillen.piaille.fr.ap.brid.gy
Well well it seems I still had two ideas for these 87040 divisions. The function even disappeared from the top 30.

As every final pixel value is computed using a division with a divisor that is identical for four rows at a time, a second, dynamic division lookup […]

[Original post on piaille.fr]
The latest callgrind profile, with the approxdiv function call tree. It's not even visible anymore in the left column with the 30 or so most costly functions.
We can see it's called 2500 times.
colin-mcmillen.piaille.fr.ap.brid.gy
@thias i think the mac quicktake software can save as pict, I'll test
colin-mcmillen.piaille.fr.ap.brid.gy
I may need to spend a bit more time toying with an idea (pre caching divisions of possible values, should transform 640 divs per row to maximum 256, BUT this way I can stop iterating as soon as the result is 256, so probably much less!)
It implies dividing "with my butt" and approximating, for […]
Original post on piaille.fr
piaille.fr
colin-mcmillen.piaille.fr.ap.brid.gy
@thias I don't think so, but possibly via a system extension ?
Reposted by Colin McMillen
paul-denton.mastodon.social.ap.brid.gy
Franceinfo réussit l'exploit d'annoncer l'amende de 100 000 euros infligée à La Samaritaine à Paris, qui a planqué des caméras dans ses réserves (camouflées en détecteur à incendies) sans avoir averti ses salariés... sans mentionner une seule fois que ce grand magasin appartient au groupe LVMH […]
Original post on mastodon.social
mastodon.social
Reposted by Colin McMillen
assignedmale.bsky.social
Charlie Kirk never cared about debates.
4 frame comic. First frame we see a tent and a crowd. text reads : Charlie Kirk didn't hold debates on college campuses. What he was organizing were flash mobs where his supporters rallied at colleges to create ideal conditions for drama. 2nd frame, someone is speaking at a mic while people with red caps are holding phones up. text reads: Students who dared to stand up to him were facing a sea of hostile faces. The goal was to make them feel vulnerable to get good footage out of them. 3rd frame, we see the person from the 2nd in a youtube thumbnail. text reads : clips were then edited and clickbait thumbnail created to drive the highest engagement possible. the game was rigegd from the onset. 4th frame, we see a silhouette of Kirk. text reas: Charlie Kirk was "winning every debate" because there was no debate. It was a campaign to radicalize young men and purposefully make campuses unsafe to women and minorities.