I was in two minds about how to record this. Do the entire mix from vinyl, then clean it up? Or record from DVS, using my cleaned-up samples? I went for the latter, mainly because Rekord Box charge 120 quid a year for the DVS feature, and I need to get my fucking money’s worth before I sell up and move to Traktor.
Anyway, it is done.
The best bit of this entire thing has been the last couple of weeks, passing it around the circle of friends who would have listened to it, spliff in hand, back in the day. The warm, fuzzy glow of memories washing over them. WhatsApp story sharing.
So enjoy. And my deep apologies to Mike for breaking all sorts of DJ etiquette here. You are a legend, sir, and this was done with love.
With a bit of luck, this will last me another 30 years...
]]>For Xmas ‘23 I did a bit of research and switched to a single-blade safety razor. Just like my Granddad used to have.
Why is this exciting?
This puts a year of shaving – if you’re a scruffy, self-employed game developer – at ~13 earth pounds, or “less than a single packet of Gillette Pro Blades”. It turns out that shaving’s been a solved problem for a very, very, very long time. We’re just unlucky that we grew up through the enshittification of it.
If you’re interested, then there’re loads of handles to choose from, although shaving brushes fall into some weird hair-science, so be careful because that’s an entire rabbit hole of its own… Stick to the basics, and you’re home-free and onto the savings straight away.
And you know what, I actually enjoy shaving (a bit) now. It’s like a little ceremony! Yeah, there’s a slightly different skill needed for a single blade, and if you watch YouTube then people will make out like it’s some lost, dark-art, but it’s not, it’s just shaving in slightly slower motion. I’ve not cut myself. I’ve not had shaving rash, or irritation of any sort. And the shaves are close. Even my fiancée was impressed.
It’s only taken me 37 years to discover this. Granddad’s tutting into his tea.
]]>Not sure what’s prompted this, but a few of my friends have ended up on Apple Music recently. This is OK! Fuck Spotify.
And bad. iTunes is a rotting piece of crap, the Apple Music web-frontend is merely “OK” on its best day, and holy-shit-why-can’t-I-copy-an-MP3-onto-my-bastard-iPhone-and-just-play-it without it being connected to a fucking Mac…
Sigh.
Anyway, if you’re like me, and you’re wishing the slowest, most painful death imaginable upon Spotify, but meanwhile you need something for Apple Music that isn’t a phone and works on Windows & Linux, then you could do a lot worse than Cider.
I’ve been using it for a few months. It’s reasonably fast, and bar some Airplay instability, hasn’t given me any grief at all. AFAICT it’s an Electron based front-end to the Apple Music web-portal-API-thingy, so you know, not the most svelte of things. But it’s a damn sight better than iTunes. And the Music app on iOS. And it’s free.
What if you’re on Windows and your Electron based front-end to a popular streaming service refuses to connect to any of your Airplay supporting amps? Well, if you’re willing to spend 8 quid, Tuneblade is a tray-utility that grabs the default audio from Windows, and pings it across to your Airplay devices.
There’s a smidge of lag (as you’d expect), but other than that, it’s absolutely rock solid. Never let me down.
Yes, I’m one of those people that still has actual files, of actual music, on actual hard drives. And a couple of iPods. And a NAS. And don’t get me started on my film collection…
I know it isn’t fashionable, but it’s a side effect of being a DJ. I need .WAVs, and I’m not going to stream them from Beatport Cloud, in the middle of a Welsh field, at 2 in the morning.
We can all see that we’re past “peak streaming service”. They’re retreating into ever more costly bundles, with more aggressive, frequent adverts. And some of the content that you think you own, well… You might find out that you don’t.
On the plus side; there’s never been a better time to scoop up cheap CDs (and Blurays), rip ‘em, and stash ‘em. 2nd hand CDs are cheap. Storage is cheap. Backup is mostly-cheap. A 2TB SD card in an iPod holds a surprising amount of music, and it means the battery lasts for actual months. You don’t even need to keep the CDs; make a rip-ring, pass ‘em around, bung ‘em back on eBay. But mostly, go get those tracks, remixes, and original masters that are just flat out missing from the streaming services, and curate your collection like it’s 2001!
Do it now, while it’s cheap and easy to get hold of all the stuff, then, when the inevitable shit hits Spotify in the face, and we’re all too skint to afford this stuff anyway, you’ll be laughing in your headphones.
]]>We found the perfect place, for a while, sometime in early '94. A quiet side-road with two empty bungalows at the end, surrounded by trees, between the motorway and a spur road leading back into town. We parked there regularly, and when the sun was out, occasionally wandered through the trees to see what we could find.
And one day we found something. A third derelict. Probably home to other caners, based on the camp-fire ash and litter lying around. Never ones to share, we bounced, but someone (I forget who) saw a cassette on the ground and pocketed it. We got back to the car, the tape was eventually rediscovered, inspected (wet, slightly chewed, but probably fine) and pushed into a Blaupunkt.
What followed was 90 minutes of the best house, progressive and trance, any of us had heard. The tape was a copy. Of who, we didn't know. Sans MC. No shout-outs. No clues. A complete mystery, that we took to be a karmic blessing as we labelled it "Best of House" and copied it amongst ourselves.
It's no secret that I'm a white-glove wearing, card-carrying raver -- a gentleman of a certain vintage -- or that the music of the early 90s has, and does, influence me greatly. But this tape? Even for the time it was special. A great selection, and flow.
Copies have lived in friends cars. It's lived in my car. It followed me through Uni and was the first cassette I ripped to MP3, back when ripping cassettes was a fucking ballache. It's lived on Minidisc, and now it lives on my NAS. A copy of a copy of a tape that got a little damp, and a little chewed, but is loved like Bagpuss.
You know how it was in the 90s; a constant stream of new, exciting music, often on bootleg tapes, with no real clue as to who was making much of it, or even what it was called. Many, many times I walked into record shops, with my Walkman paused, in the hope they'd “know what this absolute banger is".
When CDs started coming out, and Radio One turned its attention, things became easier. But those first few years of the 90s? When we had no money, or decent pirate radio near us? Trainspotting for tunes could be random pot luck. And I wasn't adverse to hovering over the DJ booth, either.
In the 28 odd years since we found Bagpuss, I've stumbled across, or crate-dug my way, to a third, maybe a half(?) of the tracklist, and grabbed what I could on vinyl. But some of those vocal ones have completely eluded me.
Every so often I'll be bored, or waiting for something, so I'll have another little go... Wave Shazam at the speaker (if only) and type the names of the tracks into Google and see what pops up. It's rare that anything does.
Yesterday I was moving Unreal versions, so I had a lot of time to burn. The entire toolchain (and platform extensions) needed building from scratch, then rebuilt a couple more times because I arsed things up. It was a long, slow day, that I spent mooching through Discogs, while listening to Bagpuss.
And to my complete shock, as I was digging through sale items (which normally means jumping over to YouTube, so I can listen to them) I bumped into a couple more, tucked away in a random playlist!
It's my lucky day! Time to buy a lottery ticket...
I typed what I knew of the tracklist, in order, and pasted it into Google.
And I got a fucking hit.
A full hit. Of the entire tracklist. A sweet, sweet, HTML1 looking web-page, that someone, an angel, left for me to find.
One of the greatest progressive mixes of all time -- I'm proud to present -- is Mike Cosford's Hyperspace Mix, from the Obsession 6 pack. Summer of '93. A full year before Sasha and Digweed's Renaissance and a holy banger of vocal house, proto-prog and trance-techno. Discogs Link
Dear sbradyman of Angel Fire.com, I fucking salute you, whoever you are! You have NO idea how much joy I took from finding your corner of the web, and finally solving this mystery. I honestly thought I'd go to my grave never knowing who mixed this. Mwah! X
So yeah, now I need to source the tracks I'm missing, re-do the mix, and I'll (finally) be able to listen to this as it was meant to be heard(!), instead of the crusty, 192mbps MP3 of a 2nd gen tape copy, that I’ve been treasuring for all these years.
Watch this space.
]]>We moved house, again, last month. Hopefully for the last time as we're now "proud" home-owners… which also means we're skint, staring down the barrel of a never ending list of DIY jobs, and all our boxes are out of storage. Including my Vinyl.
It's been a long time since I've had my Vinyl out. They've been in storage for at least 6 years, and it's closer to 10 since I regularly mixed with them. To make it up to them, I decided to show them the love; I'm going to replace any knackered inners, get some proper plastic outer sleeves, and give them all a damn good clean.
Record cleaners are crazy money. There's no way I'm going to spend 600 nicker on a washing machine for my vinyl, but I do want mine to have an actual wash. Some of them spent half of the 90s (and all the naughties) spinning under a cloud of pot smoke, and none of them have had more than a cursory look at an anti-static brush in well over a decade. In comparison, the Spincare seems almost too good to be true: a proper little record bath, albeit one you need to work manually, for 50 earth pounds! Anyway, I took a punt.
I bought mine off eBay. It arrived in a couple of days and was well packaged, in a small box containing everything you need: bath, cleaning liquid and micro-fibre cloth. The unit's a well-designed black-box that comes apart to reveal the bath, drying rack, and outer lid. The rack stands 10 vinyl, and the bath holds enough liquid to clean ~50 per-sitting.
On Saturday, I rolled up my sleeves and pulled out my white-labels as these have had the hardest life, kicking about in paper inners, half or which are torn. They're dirty and (occasionally) scuffed from use. If anything can give the Spincare a test, it's these boys.
Operation's handraulic. You stick the vinyl between two felt cleaning pads, rotate it clockwise three times, then anti-clockwise another three. Pull it out, give it a shake (ffnar) and leave it on the rack to dry. By the time I'd done 10 (and filled the rack) I was able to go back, give the first a quick wipe-down, put it in a new anti-static inner and a proper cardboard sleeve and crack on with the next.
Is it worth 50 quid? Well, the results are impressive. I'm genuinely blown away at how good. Bar the serious skuffs, the cleaned records look brand new. The noise floor is reduced and the crackles are quieter. Most of them sounded as good as I'd ever heard them.
It's not a miracle worker. You're not getting rid of any gouges with this. But looking at the cloth (and water) after I'd done 25 records, yeah, you really are getting a LOT of gunk out of them.
In my humble opinion this is an absolute steal for 50 quid. It does exactly what it says on the tin.
Now all I need to do is remember how to mix with vinyl...
]]>I didn't realise it then, but the Brief was special. Eclectic. Patrons ranged from poets to professors. We had accountants and a militant lesbian Americas Cup yacht racer. A millionaire, and the permanently unemployed. Students and Professionals. No one was arsed about what you did for a job, you were just a person down the pub. Don't be a dick. We've chosen this place as our public house, and we won't take kindly to someone wandering in, shouting their gob off.
Good pubs are comunities that help each other out. Pass on the tips. Do each other favours.
Regulars ease people into the fold, police the dicks, and dictate the vibe. Every pub's a little different and you'll probably see familiar faces when you drink somewhere else. It's fine to have a quickie in the Honest Lawer, but you'll be thinking of the Brief.
Those sorta Pubs aren't typical any more. Closed because they couldn't pivot to food or were harried out of existence by the council. In their place are the chain pubs. Wetherspoons. Greene Kings. Large spaces where you're shouting over a hundred people. Identikit faux boozers with the same menu, two-for-one offers, and underpaid staff, because someone, somewhere, decided that actually, what we need is a pub that plays brit-pop and has no fucking seats.
And I guess, if you're 20, yeah, that's what a pub is—a box that sells cheap booze, where you go to get shit-faced. And then get into a fight while you queue for the Taxi home, cos, well, you had to travel 10 miles into town because all the fucking pubs in your 'burb closed down...
The internet's a bit like a city and its pubs. If you squint.
There was a time when there were loads of 'em: Usenet, bulletin boards, IRC, live journals, forums—communities focused on a 'thing', whatever that was.
No one was massively arsed what your real name was. You were just a person on the 'net. Don't be a dick. We've chosen this place as one of our online hangouts, and we won't take kindly to people wandering in, shouting their gob off.
The best of those spaces were communities that helped each other out. Passed on the tips. Did each other favours. The mods eased people into the fold, policed the dicks, and dictated the vibe. Every space was a little different and you'd probably see familiar faces when you posted somewhere else. You'd be reading a thread on RLLMUK, but you'd be thinking of Yak Yak.
Those sorta online spaces aren't typical any more. Loads have closed or need help finding people to maintain and run their back ends. In their place is Social Media. Enormous online spaces where you're shouting over hundreds of people. Identikit faux communites, with the same "free speech" menu, ad-driven surveillance, and right-wing billionaire bollocks from the owners.
And I guess, if you're 20, yeah, that's what the internet is. A place you go to find an audience. And then get into a fight with a fucking Nazi White Supremicist incel because all the places you could have gone to find your people have been driven out of existence.
--
I'm not on Facebook, Instagram, Bluesky, Twitter or Threads. I'm done with it. I'm not interested in being online to whore my work, self-promote, chase likes, subscribers, or any of the bullshit that's become the accepted norm over the last 10 years. It's enshittified beyond all use.
Which is fucking annoying, innit?
So why have I spent an hour trying to compare the internet to a pub? Because most of the people getting excited about Twitter's death spiral and Threads arrival have forgotten the thing that made the internet special in the first place: community.
We don't go to the town square to be heard. Most of us don't go to town unless we really bloody well have to.
Nah.
Burn it all. Burn it to the fucking ground. And if you're using enshittification as a measure of success, you've got it all wrong.
You get to pick your friends. You get to pick who you listen to. Associate with. Stand next to. In real life AND online. That's federation of sorts, innit?
So I'm just a bloke on the Fedi-verse. Join us. Don't be a dick.
]]>I enjoy mountain biking. I've slowly progressed from easy tracks to single trails, and I'm starting to pop some jump lines. The Lake District was a good training ground, full of techie rock gardens, rooty downhills, and long soggy climbs that paid off with stunning vistas. But moving to Wales upped the ante.
I'm spoilt for choice. South Wales is mecca for MTB. Within a 30-minute drive, I have two forests with multiple trails, three bike parks, and loads of routes dug out by locals. There're hills everywhere, and where there's a hill, there's a trail.
So. Bikes.
Tbh, I've never been comfortable on the Scott. I never felt on top of it, and the centre of gravity was too high for my taste. But hey, it was supposed to be my training bike, so I put up with it until I could afford something better. I've spent the last three months selling my video game collection, and eBay has been kind to me, so last month, I bought a shiny full-suspension EMTB from Canyon.
Yeah, so I've been on the fence about going to an EMTB for a long time. I thought I'd hold off until I hit my 50th, but the more I thought about it, the more I began wavering. Ultimately, the limiting factor to how long I stay out on the bike has always been my fitness, so in that context, why wait?
Honestly? The Spectral's pretty much the cheapest, full-spec EMTB going. I looked at many options but kept returning to it; it's a lot of bike for the money. I just about sneaked in at the low end and ordered the ON 7. It's also a beauty. ;)
I was dubious about ordering a bike online, even more so about it arriving in a cardboard box, which, as expected, was battered when Fed-Ex delivered it. I feared the worst; half the locking clips were missing, and the cardboard had taken a beating... but the bike was fine.
Putting it together was simple. All the tools you need are in the box, including an ingenious little torque wrench and a handily portable suspension pump. Both of these are so good they're now staples in my toolbox.
Setting up the suspension is an ongoing project, and more information from Canyon would have been handy, but a quick trip to the manufacturer's website gave me numbers to start with. The thicker, wider EMTB tyres also feel very different, so I'm still dialling in the correct pressure for my tastes.
Riding an EMTB is a different beast, and not just because of the weight. I was getting through the Verderer's Trail, in Dean, in ~55 minutes on the Scott. In Eco Mode, on the Canyon, I had this down to 36 minutes on my first ride and then did another 20k over the next hour and a half. Instead of pushing up and only having the energy to do the downhill runs two or three times, I can stick it in Boost and go up and down as many times as I like.
This means the average speed on the trail is much, much higher. Parts where I'd be crawling uphill are now technical challenges where I'm looking at lines and trying to keep my speed up. And there's a knack to this. If you're in the right gear, pedalling at the right cadence, then you're flying in the motor's sweet spot, which brings a new set of challenges.
Pedal strikes are "a thing" now, whereas I can't say I ever really had one on the Scott. Canyons are fairly low-slung, so hammering around a single track at 20kph requires more thought about where your feet are. I learned this the hard way after getting thrown, twice, from strikes. So much for my leet skills!
The battery's weight and position on the bike also require changing how I approach certain features, particularly berms. Loading the front and generally moving around on the bike is essential to stop the front washing and quickly switching tilt through s-bends. Took a couple of rides, but I'm feeling on top of the bike in a way I never did with the Scott.
The front washing issues may be down to tyre choice. The Canyon shipped with a Maxxis Assecai on the front, and I'm not convinced it's as good as the High Roller 2 I was using on the Scott. At least, not in the dry.
Downhill, the bike wins in every way. The extra weight is a bonus. It's faster. It's easier to roll jumps and pop off them.
I opted for the 750w battery to save money and have no regrets. In Eco mode, which I usually use, I've covered 40km in less than half a battery. I think it'd approach 100km in the Forest of Dean if I stuck to the blues. Even in Trail mode, I got three hours of non-stop riding with two bars left; my body gave up before the battery did.
Minutes after putting the order in, it dawned on me that the roof rack on my car (Thule) wasn't rated for an EMTB. I could have gotten away with it if I'd removed the battery, but the thought of a pressure clamp on the carbon frame, with no support, gave me the heebie-jeebies. So I had to get a new rack... (more on that in another post).
With a hardtail, you pull the bike off the car and hit the dirt. An EMTB, not so much. There're things to put together. Tools are a constant feature in my boot. There are various pumps required for last-minute fettling. Cleaning takes a little longer. And you need to be careful that you've got the strength in your arms to get the bugger on the roof (but that's pretty easy with the battery out).
Charging seems quick enough, but I tend to leave it overnight and not worry about it. That said, I can see me buying a second battery once I get the time to do some bike packing.
In the month I've had it, I've covered more distance, taken on more challenging features, jumped higher, skidded further, and crashed harder (oh, and I upgraded my knee pads).
The extra oompf opens up parts of the hill I'd never have got to, and I think my riding's improved dramatically because of this. I'm taking on technical features with more confidence and loving the fact I can ride steadily, for hours, if I want to cruise in the sun or loop the downhills.
And although I thought it was cheating, the stats on my heart monitor don't lie: I'm getting better exercise, in the right zones, for more extended periods than I ever managed on the Scott. Win win!
If you're on the fence about an EMTB, well, consider me a complete convert.
]]>The Commodore 1352, or the "Tank", was my first mouse and probably the design that I rocked the longest. '89-'95,ish? I still have several, but time's not been kind to ball mice, and let's be honest, who wants to clean those any more? Not me...
So yeah, despite my constant moaning about Retro grifters, Lukas Remis' Kickstarter for a modern mouse, inspired by the 1352, caught my interest. I ordered two and a couple of DB9-USB adaptors.
Despite my confusion around shipping dates — the UK is no longer part of the EU, doh! — mine arrived this week.
So... They look just like the 1352! Woo!
Both mouse buttons have a decent click, and at 1600 DPI, the mouse travel feels good, even on a PC.
Bluetooth works as flawlessly as Bluetooth ever does, and inside there's a tiny wireless connector, which the mouse paired to instantly. Build quality is good; the moulding's left no rough edges, and nothing creaks.
It does what it says on the tin.
I had a quick go at using one as a daily driver, and unfortunately, I had to bail. Mouse wheel input (something I use on a PC all the time) is handled by a touch-sensitive section on the top of the mouse, and it's...shite—serviceable at a pinch but nowhere near good enough for daily use.
Also, for my taste, they're far too light, even with the batteries in. I prefer a bit more heft, so I'd be inclined to add a bit of lead to them.
But hey, these weren't bought to replace my Logitech; they're for my Amigas. So not only do they look the part, they feel (reassuringly) correct when I'm bouncing around Workbench. (Ok, still too lightweight, but whatevs...)
Apparently, Lukas will be setting up a Web-shop for future orders, so we're good if we ever need a replacement mouse for our Amigas. Hurrah! Good work, everyone.
I wouldn't recommend using a PC with one, though.
]]>I wasn't sure about the glossy screen, but the picture's bright enough to negate most of the glare during the day, which is fortunate, as I get eye strain quickly.
The aspect ratio has a bit of an old-school feel to it, and I like it a lot. I don't care that the laptop's a little deeper; the extra height is nice when programming.
The pixel density gives everything a lovely smoothness that, to my eye, is similar to the old Retina Macbook. So yeah, better than I expected, but... I'd still go matte, given the option.
I've not done any specific tests, but it's cruised past 4 hours of battery life, with juice to spare, every time I've used it. I'm usually coding, so this is with peaky CPU bursts, a browser open, maybe a couple of shells, and some chat apps. Nothing particularly heavy, and I'm not hammering the GPU as the side project's still the Eh500.
An evening's programming on the sofa is no bother, though, and I suspect I could sail past 6 hours with a bit of care.
I said previously that the fans are quiet, and that's true... mostly. There's a higher gear I'd not heard, and wow, yeah, that's loud. JetBrains IDEs doing their million startup tasks have done it several times. Not much else has. Bear in mind, I'm on Fedora, and I've fettled it with powertop, so I suspect Windows might be louder, but I'm not sure. Either way, it is dramatically better than my old XPS. Silent the majority of the time that I'm programming, which is what I want.
I love it. It's excellent to code on. Page up/down/home and end override the cursor keys, and the FN key is under the left thumb; it all falls into the muscle memory I built on the Mac. I'm not making typos; I'm not reaching for anything; it's a nice place to be.
It's not a ThinkPad keyboard, but it's not a million miles away. Better than the XPS and better than the recent Macs I've tried.
The only downside would be the lack of a backlight, but my days of working in the dark are long gone...
Last time I said that the trackpad was the weakest part of the machine, and I've not changed my mind. That said, it's perfectly fine in practice. I'm just a snob, and I carry a wireless mouse everywhere. ;)
You know what? I use this way more than I thought I would. It's quick, and I've not had to recalibrate it. KDE prompts me toward it after the first log-in, which is nice, although it's still a strange experience to use it in the terminal.
Essential? No. But it's a nice trick.
Yeah. These are shite. Not the worst I've heard; serviceable in a pinch, but not something I use very much. Ya cannae change the laws of physics... unfortunately.
This is the main gimmick of the machine, and yeah, they are excellent. Right now, I have a MicroSD and three USB-C adaptors plugged in. The SD has a 500Gig card, which holds a big chunk of my music, and when I want to plug in a monitor, I whip out one of the USB-C ports.
Honestly, I'm not sure I'll tire of that!
The community is backing them, and I'm already tempted to put in an order for the LAN port and Displayport.
Ok, so not really the laptop, but this is the first time I've used Fedora and the first OS I've had on Wayland.
Fedora is great!
Boots exceptionally quickly, rock solid, and I've had zero update snafus. The only issues, to date: Signal doesn't work (no idea) I couldn't find an RPM for Texture Packer. RPMs, or the lack of them, have held me back from Redhat spins for the longest time, so it's nice that Flatpacks are becoming the norm. Or at least, more common. It's almost a solved problem, annnd no Snaps! Hurrah!
But it's not perfect. Wayland's crashed on me twice. Is that normal?
Tbh, I'm impressed it works at all; I've purposefully steered around it until now. I'm also not convinced that KDE is doing much beyond 30fps on Wayland, which is a shame. On the other hand, it doesn't seem to affect my stuff so I can live with it. It'll get better...
This is the cheapest laptop I've ever bought, and it's very quickly becoming my favourite. It's small, light, cool, mostly silent, very functional and extremely well-engineered.
Well done to everyone at Framework! I'm a complete convert.
]]>Since it's Xmas (was) I specced out one of the i12 options "just to see", then realised I could cover the cost by selling the XPS and end up with money to spare. And... here we are.
It took five days to arrive, and much to my disappointment, I didn't have to build the entire machine from scratch. Instead, the DIY option means "stick the RAM, and Nvme drive in", which is fun, but not the full Mechano build I was hoping for.
That said, opening up this laptop is lovely...
Every part has a QR code attached—even the USB-C cable for the power adaptor (!) and the UK 3-pin plug(!!)—screws are standardised, and the internals have printed notes/comments dotted about to identify edge connectors and core parts. It's confidence-inspiring if you don't know your way around laptop internals.
Mine didn't come with an OS installed. I opted for Fedora, which, having checked the forum, offers the best out-of-the-box experience. After setup, I went through the notes to install TLP and Powertop and added the arguments to Grub to enable the keyboard brightness controls. On reboot, everything was fine and worked as expected. From cold, the entire setup process took less than 15 minutes.
Wow. This laptop boots faster than anything else I have in the house, except maybe my Amiga. Lovely!
I'm only on my second charge, but the battery looks like it'll cruise past 6 hours tonight. I'd like to see how long it lasts when I'm programming/compiling frequently, but I'm confident it'll smash the XPS, which rarely broke past 3.
Sleep and Hibernate seem to be working, which is also something the XPS struggled with—it never missed an opportunity to cook itself in my bag, unless I switched it off—but it's still early days...
The screen is glossy, which I'm generally not a fan of, but it's bright, the picture quality is great, and in my usage so far, the reflections haven't been noticeable. Wayland's scaling can lead to a soft look on certain apps that don't scale themselves, but I've not found that particularly offensive or out of place. The screen has a soft-ish look, anyway.
I've done a few things to push it and force the fans on, and (I'm pleased to say) under heavy load, it's pretty quiet. I can't hear it over the TV. The top's remained cool, and the bottom is warm but not bollock cooking. Again, a massive improvement over the XPS.
The trackpad is OK but could be better. Fingers glide well, and it responds to left and right clicks better than some I've used, but if I had any grumble, it'd be that the area for right-clicking is too small. In practice, I hit it when I need it, but this feels like something that needs a tweak. Also, it'll be interesting to see how long it lasts. It's not cheap, exactly, but it feels less robust than everything else.
The keyboard is excellent. Possibly the closest in feel to my old X1 carbon (my favourite laptop keyboard) that I've come across. The control key is easy to reach, and home/end/page up and down are mapped as FN's on the cursor cluster, which reminds me of the Mac. Very usable and extremely comfortable. It's going to be great to program on, which I'm pleased about.
In terms of ports, I bought 3xUSB C, 1xMicroSD and 1xHDMI. I've yet to try hot-swapping them (in fact, I've no idea if that's even possible), but I like having an HDMI port in my bag for those occasions when I need to hook up to something.
Of course, the real test is whether I can upgrade this machine in the future. I held off up to now because of the "will they, won't they" question of parts and support, but I feel a lot more confident having seen the mainboard upgrades Framework released for i11 to i12. If they came out with an AMD option, I'd be all over it like a rash...
I desperately want to cut down on my e-waste, so it'd be amazing to keep this machine running for the next ten years, upgrading bits and pieces as I go. I'm still rocking a 2013 Retina MBP for DJing, so it should be possible...Right?
But, even if this dies on the vine, it's the cheapest laptop I've ever bought. It's light, good looking, and first impressions are very, very good.
Let's see how I get on...
]]>So I'm back on the EH500!
The last time I picked this up was in the Summer, so I decided to finish embedding Wren and get the rest of the "console" exposed to script.
When I last discussed this, I posted an example where I loaded a class of static methods and ticked those. I've changed tack since then in two fundamental ways.
First, a class of static methods is limited in what it can operate on (static members), so now I instantiate the class and adjust my call handles appropriately:
{
wrenEnsureSlots(s_pWrenVM, 1);
wrenSetSlotHandle(s_pWrenVM, 0, s_pWH_LevelMode_ClassHandle);
//
// Call new()
//
wrenCall(s_pWrenVM, s_pWH_New);
wrenReleaseHandle(s_pWrenVM, s_pWH_LevelMode_ClassHandle);
s_pWH_LevelMode_ClassHandle = NULL;
if (wrenGetSlotCount(s_pWrenVM) == 0)
{
LOG_ERROR("-- Interpreter error, calling LevelMode->new");
Framework_Guru(SCRIPT_ERROR);
}
s_pWH_LevelMode_ClassHandle = wrenGetSlotHandle(s_pWrenVM, 0);
}
The instantiated class is free to create other objects, hold a list of things to tick, etc. which was what I needed all along.
Secondly, in the Summer, the platform API -- the foreign methods that map to console "registers" and functions in C-land -- was on disk, in its own module, that others could import. I didn't like this. So I've stolen a trick from the Wren implementation in Tic80; it's trivial to store the API in a string, in C code, and load it into VM as the first thing that's parsed, before I do any of the above.
static char const* s_sPlatformAPI = "\n\
class EH {\n\
construct new() {}\n\
foreign static GetFrameCount()\n\
foreign static GetGameDeltaSeconds()\n\
...
static TO_RADIANS { 0.0174532925 }\n\
static TO_DEGREES { 57.295779514 }\n\
static PI { 3.1415926535 }\n\
static SCREEN_WIDTH { 384 }\n\
static SCREEN_HEIGHT { 216 }\n\
static SCREEN_HALF_WIDTH { 192 }\n\
static SCREEN_HALF_HEIGHT { 108 }\n\
\
}\n";```
This has the effect of adding a class full of static methods into module "main", making them accessible anywhere via an import:
```import "main" for EH```
From the scripting perspective, this makes no difference, but it removes the need for a source file on disk that could go missing or get out of sync with the EH500.
## Kicking the Tyres
<video controls autoplay loop onclick="window.open('./images/eh500_xmas.mp4', '_blank');"><source src="/images/eh500_xmas.mp4"/></video>
Bar palette manipulation, I have everything in the EH500 exposed to Wren. It's been quick to implement -- little more than a day -- and easy enough to test. The slot system is clean, simple and fits my needs perfectly.
It's taken me a while to grok the error messages from the interpreter, but that's no different than any other language... I just need to use it in anger.
Next steps:
* Add a math library (just the basics, with some vector stuff)
* Add easing functions (ease all the things!)
* Decide how I'm going to do the collision detection...
* Add some audio!
]]>A few things tipped me over. First, the initial reviews—especially from people I knew—were positive, and second, it started selling like hotcakes.
I knew it was worth supporting when people began sending me pictures of my games running on it, so about a month ago, when my pre-order window opened, I dropped the cash, and one week later, I was the proud owner of a Steam Deck.
This thing is enormous. Bigger than a Nintendo Switch. Bigger than you think it's going to be, and probably bigger than it should be. But I've grown to like it. Its chonky size allows for large, rounded grips and multiple well-size trigger buttons. The sticks are well placed, even for my small hands, and its face buttons & d-pad feel fantastic. I think it's the most comfortable device I've used for extended play sessions.
The screen is large and bright, and most things look great. The only stumble is text; the 800p screen struggles to cope with AAA game's penchant for tiny fonts, which sometimes results in nasty aliasing. (I've had to change a couple of prompts in my game to suit the lower resolution.)
The Deck runs hot at full beans. Not uncomfortably, but you'll notice the rear fans blowing, depending on how you're sitting and which angle you're holding it. The fans aren't obnoxiously loud, which is a result, given how hard they're working, but you can hear them, and all that heat comes at a price: battery life.
Whoah, this thing is way more pokey than I was expecting! I stuck my current [Unreal Engine 5] build on the Deck with no tweaks, and it ran at 20-30fps across the board. That's better than my two-year-old XPS 15 laptop at 1080p! I was expecting a step up from the Switch, but this is a pocket (well) monster. Elden Ring, on the bog? What a time to be alive!
It's possible to tap the status bar at the top of the screen and enable the performance overlay, containing utilisation graphs for each CPU core, the GPU and the current FPS, which, from a development point of view, is mana from heaven.
It's also possible to tackle the battery life problem directly. For example, framerate can be limited to 15, 30 or 60fps, or v-sync can be disabled. In addition, there's a Half Rate shading mode, which in theory, should reduce the resolution of pixel shaders, a big win for pixel art games. Or, you can limit the GPU's clock speed and adjust TDP limits on the CPU side. Just don't expect miracles. I've been able to get 2 to 3 hours of battery life out of some games, but it's entirely possible to drain a full battery in an hour and a half.
We're talking Atari Lynx levels of battery life, most of the time.
The Deck runs a Linux-based OS under the hood, meaning most games—unless they have a Linux native SKU—are running under Proton, a Wine variant optimised by Valve.
Proton is stunning. I am in absolute awe at how good a job it does. Using my games as a test, I saw a 30-40% increase in FPS using Proton vs the Linux Native builds. Even basics, like loading times, were better under Proton.
Now, there're loads of moving parts here and multiple reasons why this could be the case, and yes, my sample size was five different executables, but Proton was better on every single one. So much so that I'm genuinely questioning whether to put out Linux Native versions of future projects. If I had to make the call today, I wouldn't.
This feels, in some ways, like a backward step for Linux gaming... But then, is it? If Proton unlocks so many Windows games and people have a Linux device in their bags? I'm conflicted, for sure.
I don't have the most extensive Steam library, just a few hundred games, but everything I've wanted to play on the Deck I've been able to get going, and if required, create an input mapping for—even Space Giraffe. Honestly, it's so much better than I was expecting. Valve is underselling.
It's possible to drop the Deck into Developer mode and, using the SteamOS Devkit Client (freely available on Steam), side-load games (or ROMS) onto it. These reside in a particular folder on the OS and appear in your library's "non-steam games" section. Just be careful; removing a side-loaded game via the steam client doesn't delete it. You need to drop into Linux for that.
Yup, KDE is there, but it's maybe not as valuable as you'd like. The OS is read-only, so although you can install libraries and tools, you're not getting a full Linux OS in the truest sense. But it's a godsend if you want to read log files, grab stuff off your NAS or do some cheeky remote debugging.
I've not been able to get Unreal to see the Deck—it's supposedly possible to launch builds on it from PIE—but I'm happy enough side-loading.
I've connected a wireless keyboard and mouse to mine, which allows me to bring up the console, tweak CVars, do perf checks, dump ticks and record stat files. In short, I can treat it as a second development PC, albeit one I send builds to wirelessly. Then, when I need to, I drop back into Linux, tidy up, SSH files to my Dev Rig and check Mastodon...
It's an ideal dev kit. One you don't need a fixed IP for.
Is it worth it?
Here's the thing. I'd baulk at it if I didn't get one through work. 350UKP (minimum) is a hell of a lot of money for something that's, essentially, tethered to a power source.
That said, it is, without a doubt, superbly crafted and well-designed. It feels premium in every way. The software stack is polished, and I enjoy using it. But it's big, it's hot, and fucking hell, did I say it's expensive?
If you want something to play with while your other-half watches Strictly, then yeah, maybe it's perfect. And let's be honest, having your entire Steam Library with you on the go is a hell of a selling point.
Personally, I think it's too rich for what it offers, but I sincerely hope Valve keeps pushing in this direction. I honestly believe this has the potential to shake up PC gaming, and I fully intend to support it. I see a smaller, lighter, longer-lasting Deck 2 as an absolute must-have.
Well, if they can get the price under 300 quid. Fingers crossed!
]]>You would think, in the year 2022, that lossless audio recording, in real-time, would be a solved problem, but no, it continues to be the bane of my life.
I started recording my DJ Mixes in the mid-90s, and back then, I'd be sampling from the mixer's output. Even with the fastest Pentiums of the day, I'd rarely get through an hour-long recording without some dropped samples. But it was par for the course. Then, sometime around 2000, I discovered the Mac. Phew, an Operating System that prioritised low-latency audio playback and recording! Finally, I could record mixes to my heart's content, glitch-free.
Fast forward a few years, and several hardware/software upgrades later, and I'm now using Rekord Box 6 with a DDJ 1000. Fantastic hardware, piss-poor software. So piss-poor that regardless of CPU/GPU or Operating System -- and I've tried OS X and Windows -- it is singularly unable to record audio, in the box, at any setting, without glitches. I have spent months wasting time on this, on multiple laptops and rigs, to no avail. So I give up. (Honestly, I'd go back to Traktor if the controller wasn't locked to RekordBox.)
I decided I needed a way to record mixes old-school out the back of the mixer, so I started hunting around for an interface to plug into my phone or iPad. I landed on the iRig Stream, and it seems to be just the ticket.
It's a reasonably small device that comes bundled with adaptors for iPhones, USB-C (iPad) and various flavours of USB-A (Android). To all intent and purposes, it's plug-and-play, automatically being recognised as a microphone by iOS.
It has stereo RCA inputs on the bottom edge, perfect for hooking up to a mixer. A small dial on the front allows input gain adjustment, and three LEDs indicate low/ok/high input levels. You can plug in headphones for monitoring (although I doubt you'd want to) or use the same socket for mic input. It's also possible to plug in a DC power adaptor (not supplied), which will also charge the phone [or pad] to which the device is attached. Very nice.
The iRig's audio quality is fantastic; it's simple to use, fits in my flight case, and is quick and easy to set up in the dark. In terms of hardware, it's a hard recommendation.
But then there's the software. Holy shit.
I downloaded the stand-alone firmware updater for Windows. Unfortunately, it failed to see the device. So I downloaded the IK product manager to register it, and it also couldn't see the device before crashing.
Yoink.
I downloaded the recommended iRig Recorder App to my iPad, and guess what? It also didn't see the device, instead choosing to record the iPad's microphone. And, to add insult to injury, it was laden with adverts and pop-ups.
Yoink.
My experience over the last few years is that a company's software is inversely proportional to its hardware quality, and unfortunately, IK hasn't broken the trend. GoPro? 10/10 hardware, 1/10 software. Pioneer? 8/10 hardware, 2/10 software. IK are in the same ballpark.
Will I ever get to update its firmware?! Who knows.
Fortunately, an app comes with every iPhone and iPad: Voice Recorder. With a quick fettling in the settings, it can record lossless audio. It picks up the iRig; it'll back-up files to iCloud automatically, and, in my opinion, it's perfect in its simplicity. So that's where I've landed.
My workflow is now: record a mix using Voice Recorder. Then, copy it over to my PC and bung it into Ableton Live for a bit of mastering -- Vintage Warmer, stereo separation, a smidge of compression, all piped through a peak limiter -- before uploading to the podcast.
Faff? Yes, but I finally have glitch-free mixes, so I'm happy.
]]>Unfortunately, this project’s not going to be the one that gets me back into Scheme...
I pulled down Guile, Chibi, s7 and Bigloo, and went through the examples on how to embed each and... none of them quite did it for me. Either the code base was too large for my taste/needs, or the type of glue code required was hard to grok, or just way too many lines of code. I’m after something simpler, that ideally, is consistent for various types of call.
It was at this point that I stumbled upon Wren, a C-based language, pretty much built for my use-case; embedding in a game engine.
For simplicity I want to compile the language into my VC and here Wren excels. You can drop a couple of folders containing the source – ~20 files – add a couple of GLOB_RECURSEs to CMAKE and it just works. Wren compiles cleanly, on Windows, just like that.
I don’t know why this surprised me, but it did. If you want to compile and share a .dll, there’re included VS solutions to build release and debug versions, and those also just work.
(Linux wasn’t quite as simple. Wren has a few warnings for unused-params/vars that the author wants to leave in, for whatever reason, which is fine, but I don’t want to look at them. I added COMPILE_OPTIONS "-w" to the Wren include folders, to turn off the warnings...)
The basic embedding example in the documentation is fine, but it’s unlikely to suit many people'ss needs. My use-case may be more typical. I want to load a specific .wren file, along with my level, and use it as a fixed entry point. I also want to Tick the scripts, once per frame.
This is discussed in the “Modularity” section of the Wren docs. The embedding program must provide a function to load files from the resource bundle, or file system, along these lines:
static WrenLoadModuleResult Script_LoadModule(__attribute__((unused))WrenVM* vm, const char* sModuleName)
{
char* sBuff = malloc(sizeof(char)*1024);
memset(sBuff,0, sizeof(char)*1024);
char* sFileBytes = NULL;
WrenLoadModuleResult Ret;
Ret.source = NULL;
sprintf(sBuff, "%s/%s.wren", Cart_GetFilepathForLevel(), sModuleName);
if(!TDI_FileExists(sBuff)) { LOG_ERROR("Unable to find module %s for script!", sModuleName); return Ret; }
sFileBytes = TDI_FileLoad(sBuff);
free(sBuff);
if(NULL == sFileBytes) { LOG_ERROR("Unable to load module %s for script!", sModuleName); return Ret; }
Ret.source = sFileBytes;
return Ret;
}
I've actually extended this to search a 'global' scripts folder, so modules can be re-used.
The init example in the Wren docs shows the VM parsing a string, but now we've got a file loader, we can provide the VM with an entry module and call a specific method within it.
To do this we have to use a Call Handle. The nice thing about call handles is that they can be re-used and stored, so we don't need to create them in the hot-path. Even better, a call handle can call any method with the same signature, in any module. Handy!
Here's a short example:
s_pWH_BeginPlay = wrenMakeCallHandle(s_pWrenVM, "BeginPlay()");
s_pWH_Tick = wrenMakeCallHandle(s_pWrenVM, "Tick(_)");
s_pWH_EndPlay = wrenMakeCallHandle(s_pWrenVM, "EndPlay()");
wrenEnsureSlots(s_pWrenVM, 1);
wrenGetVariable(s_pWrenVM, "main", "LevelMode", 0);
s_pWH_LevelMode_ClassHandle = wrenGetSlotHandle(s_pWrenVM, 0);
if(wrenCall(s_pWrenVM, s_pWH_BeginPlay) != WREN_RESULT_SUCCESS)
{
...
}
The full Init looks like this:
void Init_Script()
{
LOG_INFO("Initialising Script Engine:");
WrenConfiguration VMConfig;
wrenInitConfiguration(&VMConfig);
VMConfig.writeFn = &Script_Print;
VMConfig.errorFn = &Script_Error;
VMConfig.loadModuleFn = &Script_LoadModule;
s_pWrenVM = wrenNewVM(&VMConfig);
char* sFilepath = Cart_GetFilepathForEntryScript();
if(!TDI_FileExists(Cart_GetFilepathForEntryScript())) {
LOG_ERROR(" -- Unable to find initial script file: %s", sFilepath);
Framework_Guru(SCRIPT_ERROR);
return;
}
char* sScriptBytes = TDI_FileLoad(sFilepath);
if(NULL == sScriptBytes) {
LOG_ERROR(" -- Unable to load %s!", sFilepath);
Framework_Guru(SCRIPT_ERROR);
return;
}
WrenInterpretResult result = wrenInterpret(s_pWrenVM, "main", sScriptBytes);
switch (result)
{
case WREN_RESULT_COMPILE_ERROR:
{
LOG_ERROR(" -- Script Compile Error!\n");
Framework_Guru(SCRIPT_ERROR);
return;
}
case WREN_RESULT_RUNTIME_ERROR:
{
LOG_ERROR(" -- Script Runtime Error!");
Framework_Guru(SCRIPT_ERROR);
return;
}
case WREN_RESULT_SUCCESS: LOG_INFO(" -- LevelMode loaded and compiled OK!"); break;
default: break;
}
s_pWH_BeginPlay = wrenMakeCallHandle(s_pWrenVM, "BeginPlay()");
s_pWH_Tick = wrenMakeCallHandle(s_pWrenVM, "Tick(_)");
s_pWH_EndPlay = wrenMakeCallHandle(s_pWrenVM, "EndPlay()");
wrenEnsureSlots(s_pWrenVM, 1);
wrenGetVariable(s_pWrenVM, "main", "LevelMode", 0);
s_pWH_LevelMode_ClassHandle = wrenGetSlotHandle(s_pWrenVM, 0);
if(wrenCall(s_pWrenVM, s_pWH_BeginPlay) != WREN_RESULT_SUCCESS)
{
LOG_ERROR(" -- Interpretor error, calling LevelMode->BeginPlay");
Framework_Guru(SCRIPT_ERROR);
return;
}
LOG_INFO("Script Engine Initialised!");
}
And yeah, I've nicked UE's style here. The idea being, I call BeginPlay on a fixed entry point, each level, and that pulls in any and all scripts it needs to setup the level, calling BeginPlay in each.
Once that's done the VM can sit there, waiting for Tick(fDeltaSeconds)
to be called, once a frame. E.G:
void Tick_Script()
{
wrenEnsureSlots(s_pWrenVM, 2);
wrenSetSlotHandle(s_pWrenVM, 0, s_pWH_LevelMode_ClassHandle);
wrenSetSlotDouble(s_pWrenVM, 1, GetGameDeltaSeconds());
WrenInterpretResult result = wrenCall(s_pWrenVM, s_pWH_Tick);
switch (result)
{
case WREN_RESULT_COMPILE_ERROR:
{
LOG_ERROR(" -- Script Compile Error!\n");
Framework_Guru(SCRIPT_ERROR);
return;
}
case WREN_RESULT_RUNTIME_ERROR:
{
LOG_ERROR(" -- Script Runtime Error!");
//Framework_Guru(SCRIPT_ERROR);
return;
}
case WREN_RESULT_SUCCESS: break;
default: break;
}
}
You'll notice that I'm passing a float -- Delta Seconds -- into the second slot, which the Wren VM will pass as the argument to the Tick() method.
I'm not a galaxy-brain coder. I like simple things. And well, this is one of the simplest things I've done in a very, very long time. What's left is the glue-code, to expose the very limited functionality of my VC to the scripts, but the documentation seems much clearer here. It's just grunt work.
I do need to write more Wren in anger, but it's clear, from what I've written so far, that it's designed for a C-coder who wants a simple high-level language to do some hacking about in, and well, yeah. That's exactly what I want.
To be honest, I'm kinda blown away by how good an experience this has been. I can't wait to get the glue-code done and start fucking about... but that'll have to wait.
My holiday is over, so it's back to work for me.
I very nearly have a virtual console, though. Which is kinda cool :)
]]>My ideal would be to use Aseprite to create the individual sprites/tiles and animations. Then use Texture Packer to generate the packed texture pages; one for each tilemap buffer, and one for the sprites.
It should, in theory, also be possible to script this, so I could run a shell-script to build a “Cartridge” – a zip file, containing all the files the game needs, in a specific layout – that I can distribute separately from the EH500. (Separate distribution's not a requirement, but it'd be nice to have. The Pico8 carts are great.)
It doesn't look like this'll work quite as I imagined.
Despite being able to output PNG8 files, Texture Packer works with 32bit-per-pixel colour internally. As you do. This means the output t-page has a re-arranged palette, that may or may not have the same number of colours in it. Joy.
I tried the open-source version, and it has similar problems.
This isn't the end of the world. I can remap the output t-page and revert it back to a fixed palette, but it's a handraulic step. Or, I can write my own sprite packer. (Tempting... Maybe... But not right now.)
I was also assuming that I could keep strict, 16 colour images in memory, but SDL_image promotes everything to 32bpp, and SDL_Surface assumes 8bpp [so 256 colours]. I could load the Aseprite format directly, but it's pointless additional copying of data for something I can enforce in other ways.
Anyway, that was slightly disappointing, but basically understandable. It's not the 90s anymore. Although I'd argue there's still a need for a texture packer that respects indexed palettes end-to-end. Either way, I do now have a process that I can live with.
And more importantly, progress on the EH500 has been great! I have the framework loading tilemaps and sprites from a debug “cart”, setting palettes correctly, and exposed in a way that I can later turn into “registers” for game code.
A fun diversion for a few days. :)
]]>I’ve got a lot of ideas for simple-ish, 2D games, that I’d like to make without the overhead of a “big” engine. I could use Unreal, but that’s the definition of a sledgehammer cracking a nut. I could use Godot, but again, that feels too heavy for my needs. Unity is out because, well, I think it’s shit. There are a lot of existing virtual consoles, but most aim for an “8bit plus” vibe; think Pico 8 / Tic 80, that kinda thing… And they’re great! But not quite what I’m after. I want something a bit more Amiga-like. Well, a fancy 16bit console, really. Something with some sane, but hard, limitations, that’s easy to maintain, and (more importantly) portable. I especially want to be able to recompile it onto whatever hardware exists, 20 years from now.
Here’s my high-level, mental tick list:
Any set of restrictions is arbitrary, but I’ve arrived at these for a few reasons.
So, nothing too complicated, but it’d be nice to leverage an existing library for the windowing and event handling. I want to use straight C, so I had a look at SFML and SDL2.
SFML is modern, clean, well supported and has great platform coverage, but, it’s focused more on OpenGL & HW Accelerated contexts. I want a strictly indexed colour (fixed colour palette) workflow, so SDL2 – surprisingly – suits my needs better. It’s easy to have an indexed colour, SDL_Surface based setup, that can be pushed over to accelerated SDL_Textures at runtime. And the other plus: SDL is already 20 years old. I suspect it’ll still be around in another 20. Especially given how many other game engines use it, under the hood.
So, er, since I’m sliding into a couple of weeks of summer holiday, I started building it out. The EH500 is just at the stage where I need to parse and build the tilemaps. I’ll report back soon.
]]>Time to have a go on the Amiga?
But before all that, I need a quick way to do the maths, which is where Fixed-point comes in.
(If you grew up programming before the Pentium era then all this will be trivial to you. I needed to refresh my memory. I only ever did this once, and that was a very long time ago. I thought I’d write it up for posterity…)
The 68000 processor in the Amiga and ST is a hybrid 16/32 bit CISC processor; 32bit instruction set, on a 16bit bus. Unlike modern processors, it has no Floating-Point Unit [FPU], so processing numbers with fractional values is slow in comparison to integer based math.
3D graphics calculates a lot of angles/positions that rely on these fractional values, so we need a way to trade mathematical precision for processing speed. Fixed-Point is a decent compromise.
In fixed-point, numbers are stored in standard C types (ints, short and long, etc.) but the content of the variable differs from that of a normal int type. Fixed-point implies a position within the variable where the decimal point would be, and this is kinda arbitrary. For example, a signed 16bit integer normally has the range -32768 to 32767. If we create a fixed-point type of 8.8 – 8 bits for the integer part, 8bits for the fractional part – the integer range is reduced to -128, 127, but we’ve gained 8 bits of fractional precision.
Where to put the decimal point depends on the use-case. The resolution of the Amiga, in PAL low res, is 320x256, meaning unsigned 8.8 fixed-point numbers would nearly give us enough range to cover the screen. 12.4 would be more than enough. 16.16 takes us to the moon and back (and may be faster for some operations?).
For trigonometry functions, like Sine, where the output is -1 to 1, we could use a 2.14 fixed-point notation, giving us 14 bits of fractional precision. More than enough for smooth rotations.
Conversion to and from a fixed-point number is simple: Shift by the number of bits in the fractional part of the number. Ie: If you’re using 8.8 fixed-point, shift by 8 bits. A set of pre-processor macros is enough to go to and from any of the fixed-point representations need, but you must be mindful of potential under or overflow.
Addition and Subtraction of fixed-point numbers – assuming they’re of the same notation, 8.8 or whatever -- works the same as normal integers, but multiplication and division need slightly different handling.
When two fixed-point numbers are multiplied, the result is shifted by the number of bits in the fractional part, so must be stored in a type large enough to hold the extra bits to avoid truncation. (Multiplying 16bit words gives results in 32bit longs.) Also, the result must be shifted back before being stored:
(short) (((long) i * (long) j) >> 8);
Fixed-point division also shifts the result, but in the opposite direction, losing precision. To compensate, code needs to shift one of the arguments up, before the operation.
(short) (((long) i << 8) / j);
Fast trig on a 16bit computer requires the use of pre-calculated look-up tables. And maybe some cheats.
Let’s take Sin/Cos. These functions take an angle as input. To pre-calculate their look-up tables, we need to decide what sort of precision is required for this input. Instead of having 360 degrees in a circle, we can say there are 256, meaning an angle can be stored within a byte and we get angular modulo for free, as the integer overflows (handy).
A precalculated look-up table for Sin/Cos, with this assumption would have 256 entries. The fixed-point precision of the values in the table being arbitrary; 2.14, 16.16… whatever is required of the results.
If you take advantage of the symmetry of Sin/Cos, it’s possible to reduce the number of entries: Only the first quadrant [“90 degrees”, or 64 entries in this example] need be calculated. The result can be mirrored/negated as appropriate, depending on the quadrant of the input [angle] passed to the function.
256 “degrees” in a circle would be enough to bounce a sprite up and down smoothly, but it probably wouldn’t be enough for silky vector rotations of lines and polygons. In these cases it’s worth bumping up to 4096, resulting in a 1024 entry table, with a precision of 360/4096 = 0.087890625 degrees.
That’s a decent trade of memory for speed!
I’m writing this for sport and it doesn’t need to do much beyond clearing out the cobwebs from my old-geezer brain. You, dear reader, don’t need to know any of this. And, since you live in the future, you don’t need to code it, either. You can get a battle-tested fixed-point library that’ll work on old computers (or tiny embedded devices, whatever) right from Git Hub:
I hear it’s great, but it’s possibly not as much fun as working all this out [again] on a rainy Sunday after noon 😊
]]>I’m a big fan of Revision’s 16:9 format for Amiga demos. I'd love to make a game in that aspect ratio, which I know is sacrilege to people that use their Amigas on actual CRTs, but for the rest of the world (especially now the Amiga Mini is out) I think it makes perfect sense. Besides, think of the extra raster time!
Bart’s extension comes with a customised WinUAE that has a default config file at: %userprofile%/.vscode/extensions/bartmanabyss.amiga-debug-1.3.6/bin
It’s easy enough to edit this file so WinUAE always opens in a 16:9 window. There’s also a little trick (which I blogged about before) using a null-filter to scale the emulator’s output to fill the window. The results are great.
Here’re the extra bits you need for the UAE config file:
gfx_width=1920
gfx_height=1080
gfx_width_windowed=1920
gfx_height_windowed=1080
gfx_center_horizontal=smart
gfx_center_vertical=smart
gfx_filter_autoscale=scale
Revision recommend using the following settings: DIWSTRT,$5281; DIWSTOP,$06c1
which is a couple of lines change to the display port setup in the copper list.
The extension uses a customised version of GCC, so it’s possible to use C11 if you fix a couple of compiler warnings in /support/gcc8_c_support.h
Each of the inline asm macros should be __asm__
, the four at the bottom are missing the underscores.
I looked into this as I was interested in messing about with C11’s generic functions and initialiser stuff, but there’s no real need when programming the Amiga, especially without the standard libraries.
I spent a few hours pulling apart the example demo and re-building it, ground-up, into a base project that I can fork for my own stuff. Everything’s split into files and programmed in my style, which is a bit more C++’y these days. It means I can read it without thinking, and it got my head back into the Amiga includes, which ended up being a fun diversion.
I think the next thing to do is sort out the copperlists, and get some stuff moving about.
]]>Beware, these are chonky-bois.
I dual head 4k monitors, and these are sized to match, but I'm fairly sure you'll be able to cut out a section you like, or down-rez them to taste.
Enjoy!
]]>You never know what to expect at these things. For me, it was an opportunity to meet online friends for the first time, grab a curry, and spend a couple of nights talking Amiga, Demoscene and random garage at the bar.
But the event was great!
Some really interesting stalls, lots of hardware -- the vast majority of which was available to play on -- and most importantly, there was room to move. It wasn't over subscribed, which felt just about right, if you're covid conscious like me.
I didn't catch many of the panels, but from what I saw it was the usual mix of streamers and podcasters... again, what you'd expect. But a big shout out to the Norwich Amiga Group, who not only had a cracking stand, but looked after us all weekend.
OLL22 did a lot of things right -- impressively so for a first show -- and I'd definitely go again next year. The crowd was super interesting, and the stalls had my wallet twitching throughout.
Definitely one to put on your radar! I met Good People.
]]>--
Analogue have made a name for themselves selling high-end, FPGA emulations of classic consoles — The Megadrive and SNES in particular — that are immaculately presented and pitched in a way, oxygen-free-cable-buying audiophiles would expect.
When the Pocket was first announced in 2019 it peaked my interest as an “all-in-one”, so I put the money down for the basic package, sans any adaptors, and then completely forgot about it. Until December, when I was told mine was about to be shipped!
So first things first; yes, the screen is as good as they claim. It’s super high-resolution, pin-sharp, and as bright as the sun. As you’d expect. Modern displays are a marvel.
It’s designed with a 1.11:1 ratio for the Gameboy/GB Colour/Game Gear, and once the LCD emulation is turned on, does a great job of presenting games with the original grid pattern characteristics of the time. Except, you know, you can actually see the screen without a light and magnifying glass attached…
That said, the current screen blending options don’t come close to matching the smear of an original Gameboy when scrolling. That may be for the best, but I’d like a much more aggressive option here. The colour palettes are nice, and work well, but Tetris isn’t Tetris without that smudge.
The console is roughly the same height and width as an original Gameboy, but not as deep. Sorta like a big Gameboy Colour. And, like a Gameboy Colour, it’s not particularly comfortable to hold for long periods of time. Well, unless you’re a kid... I’m not, and even though I have tiny hands, an hour or so of play has my fingers aching because the device is too thin. I know that sounds fussy, but I’ve been rocking a GPi and original Gameboy during lockdown, that I can play for hours, and they're more comfortable because there’s more grab hold of.
I opted for the black model. It looks good in the flesh but the plastic isn’t perfect. I was a little disappointed in the materials given its positioned at the very high-end. The overlap at the join feels sharp, and the plastic has slight discolouration spots. (Moulding artefacts?) When compared to ZX Spectrum Next, which was absolutely perfect from every single angle, the Pocket is lower quality. Not much. But a bit.
The device is a nice weight, a little heavier than expected, but the heft is reassuring and it’s completely solid in the hand. No creaks, squeaks, or flex.
The cartridge port at the rear is compromised by the need to support adaptors. Rather than enveloping the majority of the cart, like the original Gameboy, it covers roughly half a centimetre. I’ve been using an Everdrive GB X7 for Gameboy ROMs, and it can be knocked out of the device far too easily. Even during play. The Everdrive GBA, being shorter, feels a bit more secure, but it’s still not great. You wouldn’t want this rattling around in a messenger bag.
The D-Pad and face-buttons are extremely high quality, they feel great and make a nice sound, but the two “shoulder” buttons, at the rear of the device, are spongey and imprecise. I love Streetfighter Alpha on the GBA, but I’ve found it a bit harder to play on the Pocket, which is a shame.
I wasn’t expecting much on the audio side — it’s impossible to get a great sound out of tiny speakers — but it’s maybe not as good as it could be. Gameboy and GBC games sound OK, but GBA games suffer from an audible hiss. Like the noise floor is elevated, or the sample bit depth is too low... I don’t know if this is a problem with the original platform, the fact I’m running off an Everdrive, or if the pocket is doing something stupid. It’s likely that I’ve just never noticed how bad GBA audio is up to now.
There’s a 3.5mm headphone jack, advertised as a feature, that would let me confirm if I’m hearing things, but you know, it’s 2022, and I’m way past the point of carrying wired headphones in my bag. Bluetooth would have been nice, you know?
I don’t have a dock, so I’ve not tried hooking it up to my TV.
I’ve also not timed the battery life, but I can say that it’s more than adequate. I’ve had multiple extended play sessions between re-charges, and being able to charge through USB-C means I don’t need to pack a specific cable. Shame the headphone options weren’t as forward looking.
There’re big plans for the Pocket’s OS but right now it’s fairly rudimentary. Depending what mode it’s in — GB/GBC/GBA etc. — you can change colour palettes, display mode, sharpness, saturation and blending, and, er, that’s about it.
But Nano Loop is included, and that’s excellent.
--
The Pocket is, by far, the best way to play GB/GBC games that I’ve ever experienced. The screen can be setup to be chef’s kiss with a couple of tweaks to the settings, and unlike the GPi, there’s absolutely no discernible lag, frame drop, or jitter. The Pocket plays a perfect representation of these games, and I’ve thoroughly enjoyed the experience of going back through old favourites I've not seen in decades.
The GBA is less of a slam-dunk due to the aspect ratio of the screen, and the shoulder buttons. Yes, the games look better on the Pocket, far better, but I don’t think I’ll be putting my Micro away.
If the Pocket could only play games from Nintendo platforms then it’d be hard to recommend it. I’d say it was seriously over-priced. But, there’re adaptors planned for Neo Geo Pocket Colour, PC Engine and Atari Lynx — the first two have incredibly game libraries — and I have no doubt that the Pocket will make them sing. Can you imagine playing a Lynx game for more than 30 minutes without changing batteries? Or having Every. Single. PC Engine game in your pocket? What a time to be alive.
But obviously, being made by Analogue, the adaptors don't come cheap, which pushes the overall price of a fully loaded Pocket to extremely high levels.
Personally, I’ve no regrets at being an early adopter as the financial outlay's been split over multiple years. If you're considering buying Pocket right now, then bear in mind that it's not quite everything that it's hyped up to be. Yet.
Even in its unfinished state it's the best way to play a large number of games, from some of my favourite platforms. My Pocket’s going to be travelling with me for a very long time to come.
]]>Robert Henke's a cracking Techno muscian you'll most often bump into under the Monolake name. He's also one of the programmers of Ableton Live. And, it seems, he's crazy bonkers enough to put on a concert with a gaggle of Commodore Pets.
I'd expect this at Assembly, not in a theatre, and I'm absolutely gutted that I missed it.
Full write up is on his blog
]]>Long Meg sounds like my kinda gal.
We walked via the River Eden, past Lacy's caves, and up to Long Meg. Even found a little church - St Michael and All Angels - on the way home. Good fun. Albeit a little (very) wet.
It turns out that mini-cheddars are no replacement for digestives as far as sheep are concerned. Can't say I blame them.
]]>I promised myself that this year I'd make the most of the Lake District, regardless of the weather, and so far that's been working well. One thing I've noticed about the North: it doesn't matter what the weather forecast actually says, you'll get all seasons in a day. Regardless.
And you know what? It's just as pretty under a stormy sky, as a sunny one.
I've started making some vids, to remember it by:
]]>Bernie’s work is seminal (to those of a certain vintage), defining a quality bar and eccentricity that was rarely matched on the 8bit computers. Prince Charles, on a Dalek? Yeah, that’s Bernie alright; quirky, even at a time when games were being made about Trashmen.
I first encountered his work on Batman, the 8bit isometric arcade adventure that came out when Batman was at the height of uncool... And it was glorious. To this day, Bernie’s chubby, slightly middle-aged take on Batman is my favourite; one I’d love to see in its paunched-glory, swinging through a Rocksteady Batyverse.
I can dream.
Bernie’s probably best known for his work on Head Over Heels, and it’s certainly the game that had the most profound effect on me. The four colour CPC graphics are world class and dripping with personality.
I love how distinctive the biomes are, how each sprite looks alive, and slightly bored. How the floors can guide or warn... And all of it in the tightest of memory constraints.
It's practically impossible to take a bad screenshot of his work, and there are vanishingly few artists from the 80s game industry that I can say that about. We've lost an extrodinary pixel artist.
I never got to meet Bernie, although I would have loved to have had the opportunity. And to my shame, I kinda lost track of where he was and what he was doing after Cranberry Source shuttered. Whtever it was, I’m sure he was doing it with flair...
Bernie, you were one of my game dev heroes, and your work and humour have inspired me many, many times.
Rest in Peace, man.
]]>It's quite the thing. Latest release is on Bart's GitHub so give that a follow and try it out. There're a few people I know using variants of that, and Beebo's GCC toolchain in VS Code. What a time to be alive! :D
]]>I bought a GoPro before we moved up to Cumbria. I figure, of all the places I’m ever going to live, this is probably the one worth capturing on video. I was right, but the GoPro has been a real mixed bag.
The recent release of the Hero 10 explains why I was able to get my bundle for such a cheap price. Every mod – GoPro’s parlance for plugins/adaptors/doodahs – was discounted, and I walked away with extra batteries, a tripod, media adaptor and wide-angle lens.
The camera is as good as I hoped. Super crisp, high framerate video, up to 5k and at crazy wide angles. Stabilisation is impressive and it’s handled low-light situations better than I'd expect a lens of that size.
Ever adaptor (mod) I’ve tried has been excellently designed. They feel robust. Really robust. It’s obvious from the tactile feel and day-to-day use that a great deal of care and attention has gone into them, and once in place – screwed in, clipped on, angled and pointed – there’ve been reassuringly secure.
In my opinion, GoPro’s hardware is fantastic. By far the best small form-factor video camera that I’ve ever seen or used, with a really well designed collection of bolt-ons.
The software platform covers three parts, the device itself, the phone, and the desktop.
The device itself is easy to control. The touchscreen is responsive, even when wet. On-screen controls have been simplified, but you can pretty much dig-in and get at everything you need while on the road, quickly, and reasonably intuitively. It’s crashed a couple of times, which is less than ideal, but for the most part it’s been fine.
The mobile phone acts like a tether and gives you a few more options to play with. In theory, you can preview, wirelessly, from the camera to the phone, download recorded media and edit it, make custom profiles for resolution, lens and framerate, and quickly jump between them. In practice most of these features are a bit of a lottery. In fact, it’s from this point on that the software crumbles.
My phone fails to find and connect to the camera approx one in four times. Regularly enough that it’s muscle memory to hit the back arrow to try again.
Downloading media takes an age. It’s generally faster for me to upload, from the camera, to GoPro’s cloud and then download it to where I want it. This has completely put me off editing a video on the road. It’s also far too easy to delete recordings. The GoPro actually saves long videos as lots of shorter sections, behind the scenes. Depending on where you’re looking at these, you might see one long video, or lots of five-minute bits. And, occasionally, depending where you are, deleting a “short clip” may actually delete the entire “long video”. One of the plus points of GoPro’s cloud is that there’s no limit to the amount of video you can store, so, I’m never going to delete anything, which solves the problem...
The phone software’s a “pass” at best.
On the desktop there’s a driver to use the GoPro as a webcam, and it’s complete garbage. Stands up for minutes, if you're lucky, silently crashes, or just ends up with half the frame updating, the other locked to a static picture. I’ve had to plug my GoPro into a USB HDMI capture card, as that’s been the only reliable way to get 30fps video out of the thing. Apparently, this is quite a common solution, despite the "media mod" being expressly designed for this sort of use case?
Fusion, for desktop, appears to be an electron version of the older iOS software and was riddled with Javascript errors and crashed constantly. GoPro gave up on it entirely over the summer, meaning there’s now no sanctioned way that I’m aware of to download and edit video on the Windows desktop. I’ve not hunted about for the Mac, but I’m guessing it’s the same there.
This isn’t the end of the world, I’m probably happier to downloading my clips from GoPro’s cloud and editing them in Resolve, but for those people stuck in Quik, man I feel your pain.
It’s unfortunate, but at every point, from the device to the computer, GoPro’s software is bug-ridden and crash-prone. I honestly can’t think of another device I’ve owned, whose software-stack has so dramatically tarnished what would otherwise have been an exceptional experience. It is utter fucking garbage from top to bottom.
It’s a real shame, cos I love the hardware. If everything else was the same quality then I’d understand why GoPro is held in such high regard. As it is, I can’t understand why they’re not being dragged over broken glass. Have people just stopped expecting things to work?
]]>Functionally, I thought I'd start out relatively simply and record the following:
For the name I want to have some sort of fuzzy search, to save her from ever having to type the full name, and to allow me to key off it in the back-end. Ideally, I'd like Geolocation to use the GPS on her phone, and/or a navigable map, so she can drop a pin, when she's out, to mark the spot.
Rust has been bubbling up my "should look at this" pipe for a long time. There's been a lot of talk in gamedev circles about using it to develop tools, and in some cases, engines, and I know several 'sceners are using it for their frameworks. I really should kick the tyres...
My personal interest in Rust centres around using it as a "proper" development language for the browser, via Web Assembly. For games, mostly, but given I still pick-up contract work occasionally, it'd be nice to use it for general web-apps, as well.
Birdydex is a slightly different usecase to any of that, though. Despite my natural desire to make an all-singing, all-animating, full 3D "app" (game) out of it, I'm going to resist. At least for now. Just a simple page, and backend. I can build reports, over time, until the cows come home.
So I started looking at the various libraries/frameworks that are available, and a lot didn't suit my needs, or just looked a little immature. But Rocket jumped out.
To quote their spiel, "Rocket is a web framework for Rust that makes it simple to write fast, secure web applications without sacrificing flexibility, usability, or type safety". Flicking through the docs and examples, it looked exactly like the sort of thing I'm after.
What appeals even more, is the client traffic is routed directly to my Rust application, via Nginx. No need for a heavy Apache install. No need for a big Postgres/MySQL backend. Just something light weight, and nippy.
On my last web job I used Handlebars for page templating, and SASS for CSS compilation. Rocket uses Handlebars out of the box, and has an additional fairing for SASS, so going in, I had the warm-fuzzies that I was going to agree with the Rocket developers quite a lot.
JetBrains IDEs have been around for about as long as I have, and for their entire 20 year existence I've laughed at their fat, bloated, java-based asses. I've tried them many times over those years (sometimes forced), and their slow start-up times, incredibly high RAM usage, and propesity to crash have always put me off.
But guess what? Technology has finally caught up with them! It doesn't matter if my text editor is using 4gig of RAM, my browser is using twice as much! Start-up times improve dramatically with NVMe drives, so that's not a problem, and hey, everything crashes!
Oh...
Visual Studio is slow, resource hungry, crashy, prone to random hangs, and it takes an age to start-up. It is, quite honestly, one of the worst pieces of software that I've ever used, but it's got an amazing debugger, and with Visual Assist installed, it's kinda bearable. At least, it is on the days it's not crashing.
I had a brief flirtation with JetBrains Rider while teaching a Unity course, but consigned it to the bin of JetBrains in my head and forgot about it. Then I got invited onto the Rider for UE4 Alpha...
Rider for Unreal Engine is a delight. It's moved quickly to integrate deeply into Unreal and its funky macro-based C++. The Debugger has become extremely competent. I use it daily, and while it's resource hungry and takes an age to start-up, it is at least stable. It doesn't hang. It starts compiling the instant I CTRL-B. I missed Visual Assist at first, but I've thrown myself into Resharper for C++ and it does pretty much everything I need. It's home, for most of my days, so I was secretly hoping that Rider would have a Rust extension, but apparently, that's been reserved for CLion.
Clion isn't Rider. Except when it is. The lines are blurry with JetBrains stuff, but there's enough that's similar to make transitioning to it quick. There is the odd wrinkle when jumping between the two, but a dive in to the settings can make them similar enough.
The Rust integration is great. Good static analysis. Nice build features. Easy to navigate to fix errors. Can even hook into WSL remotely. It ticks every box. And, being JetBrains, it's a couple of plugins away from being a monster IDE that handles Moustache, CSS, Javascript, HTML and XML, all in one box. It's quite the thing.
Over the last 12 months I've gone from laughing at JetBrains IDEs to paying for the full suite. I am a complete convert. Even I'm surprsied by that. I'd love a specialised Rust IDE from them, or at least, Rider for Rust, but to be honest the differences between the IDEs seems to narrow every version, so whatever...
The problem with Rust is the syntatic sugar. Rather than move away from the complicated semantics that have driven C++ into the ground, they've gone whole-hog and created some very unreadable syntax of their own. Because of this, Rust is not an easy language to pick-up and grok, and the brevity in a lot of the documentation makes it non-trivial to "learn-by-doing". To be honest, I've not enjoyed it one bit.
Rust's setup and package management, on first use, appears to be well thought out and simple to use. The compiler's error reporting is probably some of the most useful I've ever seen. It's easy to get going, and it's easy to pull-in code, but that ease gives me pause...
In the end, the Rust part of my application ended up being a couple of hundred lines of well spaced code (written by me), and I-have-absolutely-no-idea how many thousand lines of code from the packages that were imported. There's so much that's hidden from me that I'm a little bothered by it... Yes, I can kinda dig down in the IDE and get to it -- and it is, of course, all open source and on GitHub if I can be boether to search for it -- but that's not how it tries to present itself.
Rust really likes its black boxes and, well, from bitter experience, I don't...
Hilariously, my "project to learn Rust" ended up with me writing as much Javascript as I did Rust. But, and this isn't to be sniffed at, the entire thing is "not very much code". It is blazingly fast and it uses no resources at all. For the most part I'm serving what amounts to a static site, even if it's made up from a lot of templated parts to avoid repetition. Javascript took care of the fuzzy search on name and I used a 3rd party mapping service, along with a smidge of client-side code, to handle the geolocation. Rocket sets up the routes and I do a little bit of validation and parsing, and talk to the DB.
During dev, the compile/refresh/iterate times were miniscule, meaning I could bounce between the browser and the IDE, make changes, and test things quickly.
This has been one of the better web dev experiences that I've had.
Obviously I'm not quite finished with the project. I need to finish the database integration and deploy the app to one of my servers. After that, it's a case of data-mining, making reports, and on-going maintenance.
It's unfair to make much of an assessment at this stage, but I wouldn't be here if I didn't have some thoughts:
I'm going to need to find something else to do to give Rust a proper chance...
]]>Raise a glass to OS 3.1.4. I only installed the ROMS back in December, and here we are, time to whip them out and upgrade to OS 3.2.
And not a minute too soon. Yesterday the machine kept booting into the Red Screen of Death, just as I was prepping it for the upgrade...
The documentation states that it's preferable to install the new ROMs before beginning the installation of Workbench, but that didn't work for me. The 1200 wouldn't boot from HD, and very weirdly, when booting from ADF none of the HDs were visible in HDToolBox.
After a bit of faff, and many resets to get the old 3.1.4 ROMs to actually boot, I was able to get back to my old Workbench and begin the install.
Unfortunately my CDRom seems to have died (maybe? Did it ever work in 3.1.4? I have no idea..) which meant that I couldn't try any of the fancy new installation methods. I was sorta looking forward to that, but, I'd already copied the ADFs to USB so I installed from the Gotek, which worked perfectly.
3.2 feels like a finished product. With both of my 3.1.4 installs I needed to do a bit of tinkering to get setup correctly; Glow Icons were missing in places, the new backgrounds didn't get installed, some default settings needed a tweak and perf wasn't as impressive as I hoped. All quickly sorted, but none of these issues appeared with 3.2.
The quality of life improvements are impressive. ADF mounting is one of those things that, once you use it, you can't imagine having lived without. Much like resizing windows from any corner and dragging them off-screen! WBPattern has much improved layout and dither options, and using PNGs as desktop backgrounds feels much much quicker, which I guess is due to the new datatypes.
But my most used feature, by far, is Auto Arrange Icons, which does exactly what it says on the tin, as well as resizing and centering the containing window. A massive time saver, especially if you've just copied over a couple of gigs of WHDLoad demos... Ahem.
There're a couple of other killer features: "Failsafe Boot" mode, and Trace Startup Sequence.
Failsafe Boot is essentially Safe Mode, for Workbench. It quickly boots you up to a basic WB with enough mounted for you to run commands and make changes. It is lovely.
Trace Startup Sequence boots as normal, but pops up a cli that lists each command in the startup-sequence, in turn, asking you if you want to execute it or not. My A1200 has taken a long time to get into workbench so I used this to step-through each line and see where the stall was occuring. The culprit was DefIcons, in the user-startup, so I booted into failsafe mode, ran the new Text Editor and deleted the offending line and... Bingo!
This all feels positively...modern! :D
--
As ever, politics in the Amiga scene is a complete shit-show, which I try not to think about. But, I love how cosy it feels to use Workbench these days, and I have the utmost respect for the devs that spend their time working on it. It's crazy -- even more so with all the shit that flies around -- but in a very, very good way.
If you've not upgraded an Amiga in a while then now is the time to do it. This is the best, fastest Workbench for none RTG Amigas that I've ever used.
Long live the King!
]]>I know Hideo Kojima's work isn't for everyone -- even I struggle with some of the non-interactive elements he puts in -- but, like it or loath it, Metal Gear Solid is seminal. What's more remarkable (in my opinion) is that it was born, practically fully-formed, on the 8 bits.
If you're a European then your first experience of the franchise may well have been Metal Gear Solid [PS1], a game I marvelled at technically and studied from a design perspective. Sure, the dialog can be all over the place and there're some issues with requiring the player to remember radio frequencies that I'd probably fix nowadays, but it had an ambition and scope way beyond anything I'd ever seen before. And you've got to remember, this was before GTA 3 landed. But unbeknownest to me Metal Gear Solid was actually a sequel; I'd discover much much later that "Solid" was just an excellent way to say "now in 3D", and the roots went all the way back to the MSX*.
Living in europe I was more likely to bump into a PC Engine than an MSX, so I didn't get to play the original until recently, but I did have a copy of Metal Gear on the Gameboy, and that is, in all honesty, utterly brilliant. There's so much at a level-design and gameplay-mechanics level that's instantly recognisable from the 3D games that I've given it to some of my students as a coursework to break-down. It's genuinely fun to play and pull apart.
So yeah, I'm a bit of a fan, and I'm completely made up that in 2021 -- the year of the Amiga -- I get to see a proper version land on my fav machine! The scene's one and only H0ffman has taken it upon himself to do a line-by-line source conversion, and not only that, he's improved the music, added some missing graphics and done a load of touch-ups on the side. For free!
It is a thing of absolute and complete beauty that I'm genuinely in awe of. It plays fantastically, and is a great entry-point into the franchise if you've never played it before. I cannot recommend it enough.
This is H0ff's first game project. God only knows what the man's going to come up with next if this is his starting point. I doff my cap, sir!!
So yeah, give this some love:
https://h0ffman.itch.io/metalgear-amiga
*I'm ignoring the NES games; the first port is modified, and as far as I know, Kojima-san had nothing to do with Snake's revenge.
]]>If, back in 1994, you told me that I'd buy more Amiga games in 2021 than I had for most of that '90s, I'd laugh in your face. Yet here we are; I've bought my second boxed Amiga game...
And it's a cracker! An arcade faithful port of Super Sprint, that uses the Amiga's PAL high-res interlaced screenmode to get as pixel accurate to the original as possible. It's AGA only -- probably because of this -- but worked on my 1200 without any issues. So, KS 3.1.4 and accelerator friendly.
I've not played the arcade in a long, long time, but this looks great, sounds great, supports multi-player, and seems to have everything I remember from the original, and there's still as much of a knack to steering those little bastard cars around as there's always been.
To be honest, at first and second glance it looks like it's emulated, I'm hard pressed to spot a difference, and the FPS is rock-solid. If you have any love for Super Sprint at all, I can safely say: this is the definitive version for home computers.
I love that people are crazy enough to do this stuff. It's an awesome technical feat, that's really playable.
You can grab a copy from Itch. Boxed pre-orders are also available: https://mcgeezer.itch.io/turbo-sprint
]]>By default they're setup for an Atari ST, so to use it on my Amiga I had to do a little bit of configuration, but the process is simple:
The MouSTer's firmware has been updated, but it's not yet been configured to work on the Amiga:
From here it's good to go.
Every mouse I've tried has worked with zero issues, even a cheapo wireless one with it's own wireless adaptor. I've tried a couple of USB joypads (XBox) and they work perfectly, as well! It's really quite remarkable.
So I guess that's the end of the road for my old tank mouse. I salute you, old mouse chum, and your fluffy mouse ball...
]]>I installed it into my A600 over the weekend and I'm extremely pleased with the results. The board comes on a plastic caddy with screw holes that match those of the old internal drive, meaning it's a doddle to fit in place and screw down. My A600 has the Individual trapdoor RAM expansion, which uses a riser to screw in under one of the drives' holes, which conflicted slightly with the plastic bit used to secure the bottom of the GOEX, but by chipping away slightly at the plastic I was able to get a good fit.
Operation is simple; load an SD Card with ADFs -- they can be organised in folders -- and pop the SD Card in. A small wheel (that pokes out of the drive bay slightly) allows selection of ADFs. A fast spin will jump quickly through a list, much like the old iPod wheels. Pressing the wheel in operates as a select/eject toggle, as well as confirming menu options.
As you can see, I opted for the small LCD display, which I believe is essential. This shows the currently selected ADF and any menu options that might be available.
Mine has a small speaker attached, which makes a little sound as the drive is accessed. It's not emulating an old floppy's audio, but it is reassuring to hear the drive in operation. You might find that annoying, though.
For my money this is an excellent little device, and I think I prefer having the small SD card in the drive than a larger USB stick poking out of the side of the machine. That said, if I didn't have an SD Card reader on my laptop my feelings might change...
While I was messing around, I tried the Trond Bluetooth audio adaptor on the A600 and it worked amazingly well. No lag. Great sound quality. I think I'm going to get one for each Amiga and have them permanently connected...
]]>