[HN Gopher] Cpm65: CP/M for the 6502
       ___________________________________________________________________
        
       Cpm65: CP/M for the 6502
        
       Author : ingve
       Score  : 115 points
       Date   : 2022-10-05 12:41 UTC (10 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | tambourine_man wrote:
       | Any plans for the Apple II?
       | 
       | IIRC, Apple IIc had an interrupt built-in, if that's neeeded.
        
         | thought_alarm wrote:
         | Building it on top of ProDOS might be fairly doable.
         | 
         | ProDOS provides an API for block-based file I/O that's fairly
         | simple and supports multiple different drive types. On a 128k
         | system you'd get a 64k RAM disk for free. It might fit nicely
         | with the current code.
         | 
         | And ProDOS already lives in the bank-switched Language Card
         | area, so there would be good chunk of main RAM to work with, a
         | little under 46K from $0800 to $BF00.
        
         | mrunkel wrote:
         | I think you'd be much better served with the z80 card for the
         | Apple II chassis.
        
           | tambourine_man wrote:
           | It's a 6502 project. It doesn't run on the z80 ISA.
        
             | VyseofArcadia wrote:
             | I think the point is that if your use-case actually needs
             | stable CP/M, the original Z80 version running on an add-on
             | card is more useful than a hobbiest port.
        
               | TedDoesntTalk wrote:
               | If your use-case is that you need stable CP/M on Apple II
               | in 2022, I'm worried for you.
        
               | reaperducer wrote:
               | You're worried that someone might want to demonstrate for
               | their children how they did business computing in a
               | different generation?
        
               | nsxwolf wrote:
               | Old 8-bit systems still run many businesses just fine.
               | 
               | I'd rather run some critical part of my business on an
               | Apple II with software that's had 30 years to eliminate
               | every last bug than some IoT piece of crap.
               | 
               | A couple years ago I shut down Chicago's premier burger
               | joint for an hour because I tried to pay with cash. Their
               | IoT cash register locked itself and their fancy iPad
               | based POS system refused to take any new orders. They
               | were trying to figure out who to call in SF, had to @
               | them on Twitter for support.
               | 
               | It was ridiculous. Normalize running your business on
               | small computer systems.
        
               | laumars wrote:
               | Running a business on an Apple II is at least as silly as
               | running it on an iPad since any kind of hardware failure
               | is going to be harder to quickly resolve (unless you're
               | the kind of business that has electrical engineers to
               | hand. But even then, it's still not as quick as buying a
               | new stick of RAM from the local computer store).
               | 
               | There is a sane middle ground between your experience and
               | running CP/M on a 40 year old computer.
               | 
               | > software that's had 30 years to eliminate every last
               | bug
               | 
               | Bugs can exist in hardware too. Plus I wouldn't be so
               | quick to assume that every last software bug would be
               | fixed. For starters any bug fixes in that time could
               | introduce new bugs. And there are often bugs that are
               | time specific (like epoch overflows).
        
               | kjs3 wrote:
               | The guy wanted to see if it could be done on a 6502. Who
               | said it had to be 'useful'? Why are you so sure your
               | definition of 'useful' and his definition of 'useful' are
               | the same here? Why does virtually every post on HN about
               | someone's personal, possibly quixotic quest to do
               | something _for fun_ attract a pack of tech-Karens who
               | tut-tut it with  "well OBVIOUSLY you should have done
               | something different than what you did. I should tell the
               | Manager.".
        
               | VyseofArcadia wrote:
               | Don't reply to me, reply to GP. I think it's a cool
               | project. I was just trying to clarify why it is valid to
               | talk about a Z80 version.
        
               | kjs3 wrote:
               | I was replying to you specifically. You are exactly the
               | kind of person I'm describing.
        
               | teh_klev wrote:
               | Sure and if you own a BBC Micro/Master you could do the
               | same via something like the Torch Z80 second processor.
               | The whole point of this project was to build CP/M for the
               | 6502, most likely to scratch an itch which many of these
               | comments seem to completely miss.
        
           | kjs3 wrote:
           | I think you missed the point.
        
           | tssva wrote:
           | Both of the currently supported platforms, C64 & BBC Micro,
           | also had Z80 add-ons available which allowed running CP/M. I
           | don't think the project is necessarily about it serving
           | people better.
        
             | ikari_pl wrote:
             | There is also C128 with a very creative native support :)
        
               | classichasclass wrote:
               | C128 CP/M is slow compared to other CP/M systems due to
               | oddities of its implementation, but it works, it's native
               | on the Z80, and with a 1571 you even get disk
               | compatibility. In 80 column mode, it's certainly fast
               | enough.
        
       | ikari_pl wrote:
       | Does anyone want to buy a paperback copy (2022 reprint) of CP/M
       | 3.0 System Guide? :) I have a few copies (had to get 10 printed
       | to get anything printed), so far only on Polish allegro.pl, not
       | yet eBay
        
         | [deleted]
        
       | EvanAnderson wrote:
       | There is an 8080 emulator for the 6502 from back in the late 70s:
       | https://www.pagetable.com/?p=824
       | 
       | I wonder if this could be creatively incorporated to allow
       | running 8080 CP/M programs (albeit likely very, very slowly). I
       | would imagine API calls could be forwarded up to the bare metal
       | CP/M OS.
        
         | dark-star wrote:
         | I was wondering the same, but then I thought it would probably
         | be easier to just translate the z80 CPM binaries to 6502...
         | That should be relatively straightforward, and since CP/M
         | relies heavily on the BIOS/BDOS ther shouldn't be _that_ many
         | issues... But I 'll probably just watch his series on YouTube
         | first, maybe that's something he's planning/thinking about too
        
           | simonblack wrote:
           | _but then I thought it would probably be easier to just
           | translate the z80 CPM binaries to 6502_
           | 
           | All the CP/M binaries are for the 8080, not the Z80. The only
           | place you might find Z80 code in a CP/M system is the
           | machine-dependent I/O code in the CP/M BIOS. That will
           | necessarily be different for any 6502-based computer
           | hardware, and need to be rewritten, anyway. Or in the third-
           | party apps. Though even there, most of the third-party
           | companies restricted their software to using only 8080 code
           | so their user-base was as large as possible.
           | 
           | The important part of the CP/M architecture was the thousands
           | of independent apps that used CP/M as their underlying OS.
           | 
           | Very probably, the best 6502-based approach would be to keep
           | all the CP/M system software and apps as 8080/Z80 code and
           | use a 6502-based Z80 emulator. The BIOS itself could be
           | replaced with native 6502 code as it uses a jump-table for
           | the entry points.
        
           | stormbrew wrote:
           | I dunno about cp/m binaries in particular, but static
           | translation of machine code from that era can be really
           | difficult because of mingled code and data, self modifying
           | code, and unclear bounds on jump tables.
           | 
           | So it might not be very easy at all, depending on how clever
           | the people who wrote it were.
        
       | johnklos wrote:
       | Since CP/M is a primarily text-based OS, I wonder if I could port
       | it to the 65CE02 in a Commodore A2232 serial card. It only has
       | 16K of RAM, but the RAM is fully accessible by the m68k in the
       | host system, so it should be easy to load the OS and give it
       | access to a virtual disk.
       | 
       | I feel a project coming on...
        
         | EvanAnderson wrote:
         | This is an interesting rabbit hole. I'd never really looked
         | into the 65CE02[0]. I guess I always just assumed it was a die
         | shrink of the 65C02. I didn't realize that the chip had really
         | interesting new features. It's a really cool evolution of the
         | 6502.
         | 
         | [0] https://en.wikipedia.org/wiki/CSG_65CE02
        
       | ngcc_hk wrote:
       | "Why?
       | 
       | Why not."
       | 
       | The most simple and straight answers that I cannot stop laughing
       | in a very joyful way. That is life.
        
         | kwertyoowiyop wrote:
         | It's at LEAST as useful as climbing Mt. Everest!
        
           | tomcam wrote:
           | and much less likely to leave an unattended corpse behind
        
       | Lio wrote:
       | It's interesting to note the smaller TPA size on the Master
       | (25kB) vs C64 (46kB) as the Master came with 128K minimum.
       | 
       | I know that the Master still had a 16bit address bus but I was
       | under the impression that it would still be possible to get
       | access to a full 64K in one go if needed (the rest being paged in
       | and out).
        
         | isthisnametaken wrote:
         | No, the Master followed the BBC Micro architecture, which was
         | 32K RAM followed by 32K ROM, made up of 16K paged ROM then 16K
         | of OS and memory mapped peripherals. The other 96K that made up
         | the 128 was 64K in sideways RAM (which could be paged into the
         | pages ROM area, 20K that could be paged over the top of the RAM
         | (where the screen data would live) and 12K that could be paged
         | over parts of the OS ROM.
        
       | eterps wrote:
       | Any good books or articles that describe developing a CP/M like
       | OS as a learning experience?
       | 
       | (sort of like the Xinu approach book, but for CP/M instead)
        
         | whartung wrote:
         | Honestly, any deep dive into the CP/M BIOS/BDOS architecture
         | should suit you.
         | 
         | It's really quite basic.
         | 
         | The BDOS was common across platforms, with the machine specific
         | BIOS acting as the interface layer between the BDOS and the raw
         | hardware. The BIOS deals with all of the interrupts and shoving
         | values in and out of I/O ports (or addresses) hoping the
         | hardware behaves.
         | 
         | A better approach would be to compare things like CP/M, FLEX
         | for the 6800, and even TRSDOS for the TRS-80. CP/M and FLEX are
         | similar in that they're "generic" OSes for different hardware.
         | TRSDOS is interesting because the DOS offered actual system
         | services.
         | 
         | These are more interesting than the ROM based "OS" of things
         | like the C64 and Atari. For example, the C64 doesn't really
         | have a "DOS", it has a smart peripheral that you connect to
         | over a serial interface and send commands. The "DOS" is
         | actually implemented on the disk drive, not the host machine.
         | Similarly with the Atari, it had a very nice device driver
         | level abstraction, but that was as far as it went.
         | 
         | The novelty of this project is the relocatable binary loader.
         | CP/M didn't have one of these (it didn't need one). The memory
         | maps of the various 6502 machines are quite varied. Having
         | large chunks of the RAM mapped to video displays didn't help
         | matters much. And all of the systems were pretty fast and loose
         | with low memory.
         | 
         | CP/M needs, like, 16 bytes of low memory "committed" for the
         | OS, then everything else is shoved to the end in high memory.
         | The 8080/Z80 used I/O ports compared to the 6502s memory mapped
         | I/O (yet more holes in the 6502 memory map).
         | 
         | To be fair, the TRS-80 has a much different memory structure
         | than a random CP/M machine. CP/M machines were designed FOR
         | CP/M, but the BIOS let them have all sorts of flexibility for
         | disk drives, I/O and other hardware. Out of the box, raw CP/M
         | can not run on the early TRS-80s, lower memory simply isn't
         | available.
        
       | NegativeLatency wrote:
       | Took me a minute to realize SSSD was not a typo for an SSD
        
         | djmips wrote:
         | What is SSSD?
        
           | rwmj wrote:
           | Single-Sided Single Density floppy disks.
        
           | basementcat wrote:
           | Single sided single density
           | https://en.m.wikipedia.org/wiki/Floppy_disk_format
        
         | [deleted]
        
       | foodstances wrote:
       | David has a video series developing this:
       | 
       | https://www.youtube.com/user/hjalfi/videos
        
         | classichasclass wrote:
         | I'm bothered a bit about the use of llvm-mos (or really any C
         | compiler) for developing low-level 6502 code. The 6502 is my
         | favourite CPU, but it's not very well suited to C, and most C
         | compilers don't emit well-optimized 6502 assembly compared to
         | what a manual coder would do.
         | 
         | If he had to use a C compiler just so he didn't go insane,
         | however (which I sympathize with), it seems to me that cc65
         | would have been a better choice and certainly more widely used.
         | But most assemblers implement a good macro system which helps
         | with sanity.
        
           | KerrAvon wrote:
           | llvm-mos seems to optimize better than cc65, see discussion
           | here:
           | 
           | https://forums.atariage.com/topic/335414-llvm-mos-simple-
           | rog...
           | 
           | >The above code fills a graphics 8 screen. CC65 ran in 4587
           | jiffies while MOS did so in 2631. Another test leveraging
           | lookups saw CC65 running in 2663 jiffies while MOS ran in 396
           | jiffies.
           | 
           | > I have C code that leverages page zero that brings CC65
           | down to 664 jiffies while MOS runs in 358.
        
             | stormbrew wrote:
             | It's not surprising to me that llvm-mos does better than
             | cc65 just because an immense amount of person-hours have
             | gone into it by comparison, but when I read a while back
             | about how llvm-mos uses the zero page as more or less a
             | register file it seemed pretty inevitable that it would do
             | amazingly well.
        
             | classichasclass wrote:
             | Interesting post, thanks. It certainly seems like llvm-mos'
             | codegen is improving markedly modulo some concerns brought
             | up over bloat. But I also note that a number of the
             | performance recommendations (prefer using more globals,
             | avoid passing structures presumably due to the limited
             | hardware stack) aren't exactly current programming
             | convention - and for that matter, they're exactly what you
             | would do writing assembly by hand. These recommendations
             | would be true for cc65 too of course, but it still makes
             | the point that using C to develop on 6502 is just making
             | the dog walk, not the dog walking well.
        
               | mysterymath wrote:
               | The AtariAge results are fairly out-of-date; I think
               | that's even before we started doing whole-program zero-
               | page allocation.
               | 
               | The only real 6502-specific C caveat left for llvm-mos is
               | that you should strongly prefer structs of arrays to
               | arrays of structs; and that's not even that
               | 6502-specific. Otherwise, standard C gives fairly tight
               | assembly.
               | 
               | That being said, every couple hundred lines of generated
               | assembly for any reasonably-sized C program will contain
               | at least one WTF, from a human point of view. Removing
               | those WTFs one at a time is the long tail of a compiler
               | engineer. Still, I'm not going anywhere!
        
             | homarp wrote:
             | see also https://llvm-mos.org/wiki/Rationale
             | 
             | "As for the code itself, we perform a remarkably effective
             | loop optimization that detects 16-bit index operations that
             | can be converted to a 16-bit index plus an 8-bit offset.
             | The latter is a directly-supported addressing mode on the
             | 6502, and 8-bit index manipulation can be done in a single
             | instruction.
             | 
             | This allows us to convert idiomatic 16-bit "int c" loops
             | into something much more suitable for the 6502. Eventually,
             | we hope that optimizations of this kind will transform
             | standard, naive C code into tightly optimized 6502 code. "
        
           | convolvatron wrote:
           | I feel kinda sad that macro assembly is a lost branch of the
           | programming language tree. to me it feels pretty lisp-like in
           | that its more of an exercise in world-building than 'a then b
           | then c'. it also makes it alot more feasible to use all those
           | interesting processor-specific frobs.
           | 
           | I guess assemblers would have had to have evolved past
           | fighting over intel vs at&t.
        
       | mrlonglong wrote:
       | Turbo Pascal used to run on CP/M, maybe someone could port it to
       | 6502 or something.
        
       ___________________________________________________________________
       (page generated 2022-10-05 23:01 UTC)