You can absolutely grab a generic gcc/binutils cross toolchain for an ARM Cortex-M, an AVR, or even an Intel Quark board and start writing simple to-the-metal code today. It's not hard, or at least it's not meaningfully harder than Apple II or C64 hacking.
It's just that no one does it. All the vendors ship integration libraries and fancy IDEs for all these boards, so what everyone chooses in practice is one of these, or an RTOS that provides an even more abstracted view. And that's not a bad idea either of course.
But the hardware is still there, and still fun, and still useful for real tasks in the modern world. Start hacking.
Also, the MSP430X has 20-bit registers, just for that added level of surreality.
However, even I have limits: stay clear of PIC12. It's just... bizarre, and not in a good way.
(Somewhere I have 2/3 of an 8080 emulator for the MSP430, written in machine code. It ran on the basic Launchpad, with 2kB of RAM, and booted CP/M using an SD card for storage and an external serial SRAM device for memory swap. Sadly, while I got it talking to an AT keyboard, I never got a screen to work, and I've since broken up the hardware for other projects. The emulator core was 1kloc of assembly. The 8080 is surprisingly orthogonal.)
A while back I had an STM32F7 (ST cortex M7) board that I wrote some assembly code for. Getting correct clock signals and power to all the peripherals and bringing up RAM and configuring devices sure was complex (and it's not explained by the datasheet in a particularly straightforward way), but doing it that way is certainly enlightening and interesting, compared to fiddling with a vendor-supplied toolchain.
However... I would recommend not using a Cortex M device if you decide to go the ARM route. Pick a full classic-arm-ISA device so you can use the more human-oriented instruction set. You can stills witch to THUMB if you want, but you won't be forced to deal with its quirks and limitations.
Beautiful assembly language, and a software assisted video system combine to make a lot of fun. It's possible to output video that closely matches the 8 bit era and then add sprites, etc...
I had a lot of fun duplicating old school effects, displaying images with artifacts, etc...
You can get a dev board, or just wire one up on a breadboard. Easy.
There are 6502 and Z80 emulations done too.
The real fun part is this chip is a concurrent multiprocessor. Makes combining a 6502, say video system and sound easy and fun.
I ended up learning a ton and have sense used the chip for some industrial R&D. Nice spiff, for having a play.
Apropos amazing things on limited environments, here is a working 3D modelling environment, with Blender model import, running on .. the PICO-8 fantasy console:
The software world is full of cute treats!
Since it's a javascript 6502 emulator, you get maybe 60% of the fun of programming for a C64, but just by visiting a web page. On a single page, they take you from making 3 colored pixels to a functioning snake game with explanations of what's happening along the way.
Though I've never seen the Accumulator referred to as the "A register"...
LDA #$c0 ;Load the hex value $c0 into the A register
In my peer group back then, it was "load A" for LDA, not "load accumulator"
Now it does!
define appleL $00 ; screen location of apple, low byte
(Looks like the feature was added in November 2014.)