/* 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 #include #include #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 */