Econet for Arculator (and other emulators)

ask about 32-bit emulators like ArcEm, Red Squirrel, Arculator or RPCEmu here
Post Reply
User avatar
myelin
Posts: 410
Joined: Tue Apr 26, 2016 9:17 pm
Location: San Francisco, CA, USA
Contact:

Econet for Arculator (and other emulators)

Post by myelin » Thu May 31, 2018 10:27 am

Just in case anyone is interested (or also working on this), I've started on an Econet implementation for Arculator. It's a high-level model of the MC68B54 chip as found in MAME and BeebEm, and I'm intending on supporting AUN, so it should be able to talk to aund and beebem's AUN code (and maybe RPCEmu?) when it's done.

(I'm aware I'm reinventing the wheel here and could just port the GPL code from beebem-windows or the 3-clause-BSD code from MAME, but this is partly an educational mission for me, to understand how RISC OS and the Acorn MOS talk to the 6854, so I can one day make my econet_from_scratch board function as an Econet module in a Master or Arc.)

So far, on my macOS build, I have RISC OS 3.11 booting and showing the 'Net' icon in the icon bar, and logging scout packets when I try to do things like browse the network or log in to a file server. I haven't implemented any of the actual networking code yet.
SW/EE from New Zealand, now in San Francisco, making BBC/Electron hardware projects for fun.
Most popular: fast serial port, FX2+PiTubeDirect Tube/Cartridge adapter, USB cart interface.

Ottly
Posts: 139
Joined: Tue Jun 10, 2014 10:34 am
Contact:

Re: Econet for Arculator (and other emulators)

Post by Ottly » Thu May 31, 2018 10:33 am

More the merrier. :-)

I find beebems implementation of econet very buggy. Times out and hangs.

RPCemu is pretty rock solid for RISC OS.

User avatar
Pernod
Posts: 1199
Joined: Fri Jun 08, 2012 10:01 pm
Location: Croydon, UK
Contact:

Re: Econet for Arculator (and other emulators)

Post by Pernod » Thu May 31, 2018 11:15 am

The implementation in MAME is also not complete, it's never worked afaik. I'll be following your progress to hopefully improve MAME too.
- Nigel

BBC Model B, ATPL Sidewise, Acorn Speech, 2xWatford Floppy Drives, AMX Mouse, Viglen case, BeebZIF, etc.

Phlamethrower
Posts: 40
Joined: Fri Nov 24, 2017 1:35 pm
Contact:

Re: Econet for Arculator (and other emulators)

Post by Phlamethrower » Thu May 31, 2018 12:33 pm

Call me crazy, but it would be nice to have an emulator-agnostic "podule emulation API" so that once a podule emulation has been written for one emulator, it can be used with another emulator just by copying the precompiled podule DLL and a few configuration files to the right location.

I'd hope that in terms of emulating a podule this would be pretty straightforward (there are only so many bus operations that can be performed on a podule connector!). But maybe the stumbling block would be working out a user-friendly way of configuring the podules - e.g. configuring how the virtual econet/ethernet podule connects to your real network. Ideally this would be done via the emulator's native configuration UI, but since each emulator will be using its own choice of UI framework, there'd have to be some kind of interface to wrap that as well.

Then you get to the annoying podules which tap into other signals within the system (e.g. video compositing), which would be a lot harder to deal with in an efficient and emulator-agnostic manner. But still, it's nice to dream!

User avatar
myelin
Posts: 410
Joined: Tue Apr 26, 2016 9:17 pm
Location: San Francisco, CA, USA
Contact:

Re: Econet for Arculator (and other emulators)

Post by myelin » Thu May 31, 2018 5:50 pm

Sounds like an excellent plan!

It looks like Arculator and RPCEmu already do this, at least for the simple case (no configuration, no complicated magic like video)... here's the interface podules have to implement to be dynamically loadable:

Code: Select all

typedef struct podule
{
        void (*writeb)(struct podule *p, int easi, uint32_t addr, uint8_t val);
        void (*writew)(struct podule *p, int easi, uint32_t addr, uint16_t val);
        void (*writel)(struct podule *p, int easi, uint32_t addr, uint32_t val);
        uint8_t  (*readb)(struct podule *p, int easi, uint32_t addr);
        uint16_t (*readw)(struct podule *p, int easi, uint32_t addr);
        uint32_t (*readl)(struct podule *p, int easi, uint32_t addr);
        void (*memc_writeb)(struct podule *p, uint32_t addr, uint8_t val);
        void (*memc_writew)(struct podule *p, uint32_t addr, uint16_t val);
        uint8_t  (*memc_readb)(struct podule *p, uint32_t addr);
        uint16_t (*memc_readw)(struct podule *p, uint32_t addr);
        int (*timercallback)(struct podule *p);
        void (*reset)(struct podule *p);
        int irq,fiq;
        int msectimer;
        int broken;
} podule;
For Econet it's a bit different because, at least on the pre-RiscPC machines, the Econet module isn't a podule; it's a custom socket that takes the same module used by the Master 128. The code should be shareable between all the emulators though... I'm hoping to contribute it to as many emulators as possible, under their own licenses (or something compatible with them all to make it easy to share everything).
SW/EE from New Zealand, now in San Francisco, making BBC/Electron hardware projects for fun.
Most popular: fast serial port, FX2+PiTubeDirect Tube/Cartridge adapter, USB cart interface.

User avatar
SarahWalker
Posts: 1085
Joined: Fri Jan 14, 2005 3:56 pm
Contact:

Re: Econet for Arculator (and other emulators)

Post by SarahWalker » Fri Jun 01, 2018 4:44 pm

For basic configuration I was planning to bring the PCem config system over to Arculator. This lets you define this sort of thing :

Code: Select all

static device_config_t sb_config[] =
{
        {
                .name = "addr",
                .description = "Address",
                .type = CONFIG_SELECTION,
                .selection =
                {
                        {
                                .description = "0x210",
                                .value = 0x210
                        },
                        {
                                .description = "0x220",
                                .value = 0x220
                        },
                        {
                                .description = "0x230",
                                .value = 0x230
                        },
                        {
                                .description = "0x240",
                                .value = 0x240
                        },
                        {
                                .description = "0x250",
                                .value = 0x250
                        },
                        {
                                .description = "0x260",
                                .value = 0x260
                        },
                        {
                                .description = ""
                        }
                },
                .default_int = 0x220
        },
        {
                .name = "irq",
                .description = "IRQ",
                .type = CONFIG_SELECTION,
                .selection =
                {
                        {
                                .description = "IRQ 2",
                                .value = 2
                        },
                        {
                                .description = "IRQ 3",
                                .value = 3
                        },
                        {
                                .description = "IRQ 5",
                                .value = 5
                        },
                        {
                                .description = "IRQ 7",
                                .value = 7
                        },
                        {
                                .description = ""
                        }
                },
                .default_int = 7
        },
        {
                .name = "dma",
                .description = "DMA",
                .type = CONFIG_SELECTION,
                .selection =
                {
                        {
                                .description = "DMA 1",
                                .value = 1
                        },
                        {
                                .description = "DMA 3",
                                .value = 3
                        },
                        {
                                .description = ""
                        }
                },
                .default_int = 1
        },
        {
                .type = -1
        }
};
which then gets turned into a dialog box by the emulator :
config.png
config.png (15.47 KiB) Viewed 354 times
This works well for simple stuff (it currently implements integer, binary (ie checkbox), selection (ie listbox) and a special type for MIDI out devices).

For more complex stuff, eg SCSI card configuration, I was intending to allow podule DLLs to implement a custom dialog through wxWidgets. This would work well for Arculator, but if there's a desire for this to be cross-emulator then obviously that's a non-starter.

User avatar
jgharston
Posts: 3053
Joined: Thu Sep 24, 2009 11:22 am
Location: Whitby/Sheffield
Contact:

Re: Econet for Arculator (and other emulators)

Post by jgharston » Sat Jun 02, 2018 2:39 am

Phlamethrower wrote:
Thu May 31, 2018 12:33 pm
Call me crazy, but it would be nice to have an emulator-agnostic "podule emulation API" so that once a podule emulation has been written for one emulator, it can be used with another emulator just by copying the precompiled podule DLL and a few configuration files to the right location.
Exactly what I proposed and pushed for years ago, a Windows equivalent of the RISC OS emulated 6502 I/O and similar RISC OS emulated Z80 I/O service calls. If I dig through the mailing list archive I may even find the original posts.

Code: Select all

$ bbcbasic
PDP11 BBC BASIC IV Version 0.25
(C) Copyright J.G.Harston 1989,2005-2015
>_

User avatar
SarahWalker
Posts: 1085
Joined: Fri Jan 14, 2005 3:56 pm
Contact:

Re: Econet for Arculator (and other emulators)

Post by SarahWalker » Sun Jun 03, 2018 7:06 pm

You mentioned it here : viewtopic.php?f=4&t=3864. You can see quite how little interest there was.

It's probably worth noting that despite RPCemu having had podule support for more than 10 years now, the only publicly released podules were the ones I threw together to test the DLL interface.

It's also worth noting that RPCemu is the only Archimedes/RiscPC emulator that has had a public release in the last 5 years, so being emulator agnostic is perhaps a little unnecessary at this point?

Phlamethrower
Posts: 40
Joined: Fri Nov 24, 2017 1:35 pm
Contact:

Re: Econet for Arculator (and other emulators)

Post by Phlamethrower » Sun Jun 03, 2018 7:38 pm

From my perspective, it would have be nice to have the API defined, so that if/when I eventually add podule support to ArcEm I'd be able to implement support for it there. But since that's likely to be at least a year or two away, I do agree that if no other emulator developers are interested in implementing such a thing then it would just be a bit of a waste of effort.

Post Reply