If you're happy to use a cross-compiler and move the resultant BIN/HEX over to your RC2014 using xmodem or similar, then imho z88dk is the best bet. And specifically using the (z)sdcc compiler for example.
z88dk has the standard
inp() aond
outp() functions for compliance, but there's a much faster method described in the
SDCC Manual in section 3.5.2, which we use almost exclusively.
The compiler recognises these special function registers ports and generates in a,(*) and out (*),a (or the relevant register where the info is to be accessed) directly.
This takes 18 cycles to output a byte, typically.
Example of writing 0x01 to the ROM toggle port, and then reading the ACIA status register, and using the compiler to do this.
<arch/rc2014.h> // defines __sfr for these ports (special function registers)
uint8_t status;
io_rom_toggle = 1; // writes 0x01 to the port
status = io_acia_status; // reads the ACIA status port
You can also do this via the standard inp() and outp() functions, but it is much much slower.
It takes approximately 100 cycles to achieve the same outcome.
If we take an example of using the
outp() callee function, the resulting assembly looks like this:
_z80_outp_callee:
pop af ;10
pop bc ;10
dec sp ;6
pop hl ;10
push af ;11
ld l,h ;4
jp asm_z80_outp ;10
asm_z80_outp:
; enter : bc = port
; l = data
; uses : none
out (c),l ;12
ret ;10