diff options
Diffstat (limited to 'src/zx81.c')
-rw-r--r-- | src/zx81.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/zx81.c b/src/zx81.c new file mode 100644 index 0000000..59b5960 --- /dev/null +++ b/src/zx81.c @@ -0,0 +1,152 @@ +/* + + ezx81 - X11 ZX81 emulator + + Copyright (C) 2003 Ian Cowburn (ianc@noddybox.demon.co.uk) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------- + + Provides the emulation for the ZX81 + +*/ +static const char ident[]="$Id$"; + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include "zx81.h" +#include "exit.h" + +static const char ident_h[]=EZX81_ZX81_H; + + +/* ---------------------------------------- STATICS +*/ +static const int ROMLEN=0x2000; +static const int ROM_SAVE=0x2fc; +static const int ROM_LOAD=0x347; + +static Z80Byte mem[0x10000]; + +static Z80Word RAMBOT=0; +static Z80Word RAMTOP=0; +static Z80Word RAMLEN=0; + + +/* ---------------------------------------- PRIVATE FUNCTIONS +*/ +void ULA_Video_Shifter(Z80 *z80, Z80Byte val) +{ +} + + +/* ---------------------------------------- EXPORTED INTERFACES +*/ +void ZX81_Init(void) +{ + /* TODO: Config for ROM + */ + const char rom[]="/files/emu/ROM/zx81.rom"; + FILE *fp; + Z80Word f; + + if (!(fp=fopen(rom,"rb"))) + Exit("Failed to open ZX81 ROM - %s\n",rom); + + if (fread(mem,1,ROMLEN,fp)!=ROMLEN) + { + fclose(fp); + Exit("ROM file must be %d bytes long\n",ROMLEN); + } + + /* Mirror the ROM + */ + memcpy(mem+ROMLEN,mem,ROMLEN); + + RAMBOT=0x4000; + + /* TODO: Memory size (1 or 16K) + */ + RAMLEN=0x2000; + RAMTOP=RAMBOT+RAMLEN; + + for(f=RAMBOT;f<=RAMTOP;f++) + mem[f]=0; +} + + +Z80Byte ZX81_ReadMem(Z80 *z80, Z80Word addr) +{ + /* Memory reads above 32K invoke the ULA + */ + if (addr>0x7fff) + { + Z80Byte b; + + /* B6 of R is tied to the IRQ line (only when HSYNC active?) + if ((HSYNC)&&(!(z80->R&0x40))) + z80->IRQ=TRUE; + */ + + b=mem[addr&0x7fff]; + + /* If bit 6 of the opcode is set the opcode is sent as is to the + Z80. If it's not, the byte is interretted by the ULA. + */ + if (b&0x40) + { + ULA_Video_Shifter(z80,0); + } + else + { + ULA_Video_Shifter(z80,b); + b=0; + } + + return b; + } + else + return mem[addr&0x7fff]; + +} + + +void ZX81_WriteMem(Z80 *z80, Z80Word addr, Z80Byte val) +{ + if (addr>=RAMBOT && addr<=RAMTOP) + mem[addr&0x7fff]=val; +} + + +Z80Byte ZX81_ReadPort(Z80 *z80, Z80Word port) +{ + return 0; +} + + +void ZX81_WritePort(Z80 *z80, Z80Word port, Z80Byte val) +{ +} + + +Z80Byte ZX81_ReadForDisassem(Z80 *z80, Z80Word addr) +{ + return mem[addr&0x7fff]; +} + + +/* END OF FILE */ |