[HN Gopher] SymbOS Z80 multitasking operating system ___________________________________________________________________ SymbOS Z80 multitasking operating system Author : jbverschoor Score : 123 points Date : 2023-12-22 16:57 UTC (6 hours ago) (HTM) web link (www.symbos.de) (TXT) w3m dump (www.symbos.de) | jbverschoor wrote: | I recently played around with this at MSXGOTO40. Crazy to see an | MSX do all of this. Videos at https://www.youtube.com/@Prodatron | FullyFunctional wrote: | Thanks, that gave a good impression of SymbOS which is boggling | my mind a bit. | jbverschoor wrote: | Yeah, I was totally flabbergasted.. Seeing an old rusty MSX | of almost 40 years old pulling off multitasking. They had | quite a few apps and games (even the z80 doom haha). | | I talked to one of the members for a while. | | So basically they use none of the BIOS, so it's purely Z80, | which makes it super portable. | | They do have different drivers for different videocards. So | some configurations work faster than others. I saw a stock | MSX and one with some videocard, but I can't remember | exactly. The stock one was slow with redrawing at times, but | the other one was very smooth. | jbverschoor wrote: | Notable videos: | | lymings (lemmings) with sound | https://www.youtube.com/watch?v=PfkJLP45FWk | | multitasking with pacman | https://www.youtube.com/watch?v=Ish4ReOjdIw | | networking with wget and IRC | https://www.youtube.com/watch?v=bB6X7V6fVyE | PaulHoule wrote: | I've looked at a lot of the old architectures from the 1980s and | gradually came to the conclusion that I liked the Z80 the best, | particularly because it has a follow on | | https://en.wikipedia.org/wiki/Zilog_eZ80 | | which has a 24 bit address space without the horrible compromises | of this guy | | https://en.wikipedia.org/wiki/WDC_65C816 | wslh wrote: | Is this guy the WDC 65C816? Just want to know if I understood | your comment correctly ir if I missed something. | | Interesting that the eZ80 is used in the TI calculators. I | wonder how energy efficient it is comparing to the ARM used in | some HP calculators. | PaulHoule wrote: | Yes I did mean the WDC 65C816. It had a 24 bit physical | address space but it didn't widen the registers enough that | you could easily take advantage of it. | epcoa wrote: | I would guess in terms of raw compute efficiency the ARM will | beat the eZ80 due to the older Z80 architecture (3x faster | than slow is still slow, and the HPs used ARM9 IIRC, while | the eZ80 is more similar to an ARM7 and only a 24 bit ALU, | etc). However for a hand held calculator it's unlikely to | make much difference where hardware process, power | management/clock domains and peripherals are going to be much | bigger issues. | shrubble wrote: | I believe this is the CPU used in the Agon series of retro / | hobbyist single board computers. | PaulHoule wrote: | Yep | | https://www.olimex.com/Products/Retro- | Computers/AgonLight2/o... | | for a while I thought this was pretty cool | | https://www.commanderx16.com/ | | but then I saw the Agon stuff which I think is miles better | not to mention more affordable. | cmrdporcupine wrote: | I was a 6502 guy back in the 80s, before I went 68k, and never | had a machine with the Z80, so have no nostalgia for it. But | when I look on paper, the Z80 really does look like it stood | the test of time better. | | How does the eZ80 extend out into 24 bits without having an | awkward banking system like the '816? (EDIT: I see, it actually | adds a 24-bit register mode.) | | The biggest problem I found with the 816 was that having no | registers larger than 16-bits meant, well, there's no way to | store a pointer in a register, or work with data larger than | 64k. Well, that and the awful 8/16 mode switching. Oh, and the | fact that the stack and direct page are stuck in the first 64k | bank. Damn, I really wish Mensch had designed and built a 65xx | with a proper 16bit (or higher) architecture instead of the meh | that is the 816. | alexisread wrote: | I'd imagine the ez80 uses an extended register fusion setup | ie. You can use 3 8bit registers as a 24bit register. I think | that would take 3 cycles to use the full address space, but | for the first 8bit space I guess it would work like utf8 in | that you just use 1 register (byte). | andyjohnson0 wrote: | I'd be very interested to know how preemptive (rather than | cooperative) multi-tasking is implemented. It's been a while but | I don't remember the Z80 having any suitable primitives upon | which to implement preemption. | | I poked around the website but it seems light on implementation | details. Super-impressive piece of work though. | | Edit to say: thank you to the responders who've backfilled the | gaps in my memory. Interesting what you forget given enough time. | actionfromafar wrote: | Timer interrupt | actionfromafar wrote: | Z80 has two sets of all registers: | | https://retrocomputing.stackexchange.com/questions/7794/did-. | .. | sedatk wrote: | Z80 has a mirror register set that can be swapped immediately. | That makes task switching faster. | CodeWriter23 wrote: | For up to two tasks | sedatk wrote: | No, for kernel code that handles the switching. | CodeWriter23 wrote: | EXX doesn't transfer to RAM, only to the ' register set. | Great for ISRs (as long as you can single-thread the | interrupts) but you're not going to track task state | using it. | cornholio wrote: | Z80 has a non-maskable (NMI) interrupt line that will break | whatever code is currently executing without allowing the | software to opt out (EI/DI instructions), and then jump to a | hardcoded page zero location, I believe it is address 0x66. | | This line is typically tied in popular Z80 machines to the | vertical blanking generator (frame refresh - 50/60Hz). | Presumably, the OS would then schedule the tasks in a round | robin fashion and most tasks will cooperate and yield control | quicker to allow a not too choppy experience. | baz00 wrote: | As other people have said, there's an NMI line. But that's not | usually how it's implemented because you tend to want to mask | it if the thing is doing a real time or time critical task. The | Z80 CTC was the canonical solution. | | Back in the dark ages had an "OS" which had a simple "task | table". This was a circular linked list with enough space after | each pointer to store the CPU state for a task and some stack. | There was one element per task. The task interrupt would fire | every 100ms, the registers/stack pointer/PC would be dumped to | that, the list followed and the next task picked up and loaded | into the CPU, then it'd return from interrupt and off it'd go | again. You could call YIELD at any point if you didn't want the | rest of your time slice. If you had something that needed to | handle an interrupt from the CTC or an NMI, it would disable | interrupts until it was done. | | Notably you didn't tend to create new tasks. They were hard | coded in at assembly time! | | Edit: we also had an 8031 version as well. | andyjohnson0 wrote: | Thanks. Back when I last wrote an z80 asm I didn't have | access to an environment with anything like an os. | | > Notably you didn't tend to create new tasks. They were hard | coded in at assembly time! | | Reminiscent of the "executive" in the Apollo lunar module | computer. | epcoa wrote: | > Z80 having any suitable primitives upon which to implement | preemption. | | In general the only thing needed is an external interrupt | (which the Z80 has). All but the cheapest deeply embedded 8 bit | micros will have one and therefore can support preemption. | stephc_int13 wrote: | I once implemented a pre-emptive kernel and OS on a very crude | hardware, the Hewlett-Packard Graphing Calculator HP48GX, | running a Saturn CPU (4Bits with 64bits registers, a weird | beast). | | It can still be downloaded here : | https://www.hpcalc.org/hp48/apps/shell/ | | You don't need MMU or anything of the sort. | | The only thing you need is programmable interrupts. | | My implementation was using a 64Hz timer, that was also | synchronized on the LCD screen "vsync" as it had to be serviced | for kernel-level double buffering and different modes of | simulated multiple grey levels. | | It is much less difficult than it seems, save registers, save | context, load context, load registers, return to the current | process. | | Optimizing the code is just a good knowledge of the CPU | constraints and bit of juggling with registers. It was a | simpler time, you could benchmark code by counting cycles, | instruction by instruction. No cache, no branch predictors, no | throttling. | GlenTheMachine wrote: | I did something similar on the C64 (6502). Programmatically | user code could mask interrupts, but as long as it didn't it | worked fine. It saved all the registers and restored them | prior to switching execution threads. The unified memory | space required that each thread ask for an absolute memory | offset to be allocated and then voluntarily stay in that | space. | CodeWriter23 wrote: | They're not claiming protected mode multitasking. | jbverschoor wrote: | Yeah they don't have protected mode. They are working on a | language+toolkit to create windowed applications. I guess | something like Visual Basic. | dfawcus wrote: | Even DRI's MP/M from 1979 had preemptive multi-tasking, as long | as the platform supported an clock interrupt. | | You can find the documents on bitsavers, the binaries may well | be there and/or on Gaby's site. | tempodox wrote: | Amstrad CPC! I can remember when you could buy one at the | department store. Computing was adventurous exploration then. | sixothree wrote: | The thing I miss the most is every device having an answer for | "what makes this thing interesting or unique". No longer is | that true or as relevant really. | notorandit wrote: | When I see this type of marvels I stare at my mobile phone and | think about the amount of wasted power. Such powerful hardware | should be able to let me do a lot of things and instead it | doesn't. | rogerkirkness wrote: | Battery life. Compute has overshot battery life. | nxobject wrote: | In line with that, it's crazy to think how portable 8-bits | could once be powered off standard AA batteries... | Affric wrote: | Is it battery life and thermals? | rogerkirkness wrote: | That too! | jbverschoor wrote: | Maximum power dissipation 0.79 Watt | dang wrote: | Related: | | _SymbOS: Graphical Z80 Multitasking Operating System_ - | https://news.ycombinator.com/item?id=16078915 - Jan 2018 (98 | comments) | | _SymbOS: preemptive multitasking OS that can play mp3s, video on | 8-bit Z80 PCs_ - https://news.ycombinator.com/item?id=10749206 - | Dec 2015 (36 comments) | | _Z80 Symbos OS now has networking support on MSX_ - | https://news.ycombinator.com/item?id=9634634 - May 2015 (25 | comments) | | _SymbOS: preemptive multitasking OS that can play mp3s, video on | 8-bit Z80 PCs_ - https://news.ycombinator.com/item?id=4653232 - | Oct 2012 (1 comment) | _joel wrote: | > Preemptive multitasking - 1024 Kb dynamic memory - 2 terabyte | filesystem | | For those occasions you need 2TB attached to a z80... | GeorgeTirebiter wrote: | Congrats on taking this concept far beyond 'proof of concept'; | well done. | | Done many years ago now, there is a preemptive multitasking OS | for the Z80 for the "kiss TNC" used in ham radio: | https://github.com/cheponis/KISS-TNC2/blob/master/KISS-TNC.a... | This only used the interrupts to permit the modem (receive) side | to generate interrupts, but the concepts are the same as if the | interrupt would have come from a timer source. Yes, it uses the | EXX and EX AF,AF' instructions. | | The best Z80 book, which describes the little-known W and Z | registers is http://www.z80.info/zip/zaks_book.pdf start on page | 86 for their description. ___________________________________________________________________ (page generated 2023-12-22 23:00 UTC)