| /* |
| YAPE - Yet Another Plus/4 Emulator |
| |
| The program emulates the Commodore 264 family of 8 bit microcomputers |
| |
| This program is free software, you are welcome to distribute it, |
| and/or modify it under certain conditions. For more information, |
| read 'Copying'. |
| |
| (c) 2000, 2001, 2004, 2007 Attila Grósz |
| */ |
| #ifndef _TEDMEM_H |
| #define _TEDMEM_H |
| |
| #define RAMSIZE 65536 |
| #define ROMSIZE 16384 |
| #define SCR_HSIZE 456 |
| #define SCR_VSIZE 312 |
| #define TED_SOUND_CLOCK (110860 * 2) |
| |
| #include "types.h" |
| #include "mem.h" |
| //#include "serial.h" |
| |
| class CPU; |
| class KEYS; |
| class TAP; |
| class Filter; |
| |
| class TED : public MemoryHandler { |
| public: |
| TED(); |
| ~TED(); |
| KEYS *keys; |
| TAP *tap; |
| virtual void UpdateSerialState(unsigned char portval); |
| virtual void Reset(); |
| // read memory through memory decoder |
| virtual unsigned char Read(unsigned int addr); |
| virtual void Write(unsigned int addr, unsigned char value); |
| // read memory directly |
| unsigned char readDMA(unsigned int addr) { return Ram[addr]; } |
| // same as above but with writing |
| void wrtDMA(unsigned int addr, unsigned char value) { Ram[addr]=value; } |
| void setRamMask(unsigned int value) { RAMMask=value;} |
| unsigned int getRamMask(void) { return RAMMask;} |
| // are the ROMs disabled? |
| bool RAMenable; |
| // indicates whether 256K RAM is on |
| bool bigram, bramsm; |
| // /ram/rom path/load variables |
| void loadroms(void); |
| void loadloromfromfile(int nr, char fname[256]); |
| void loadhiromfromfile(int nr, char fname[256]); |
| char romlopath[4][256]; |
| char romhighpath[4][256]; |
| // this is for the FRE support |
| void dump(void *img); |
| void memin(void *img); |
| // screen rendering |
| // raster co-ordinates and boundaries |
| unsigned int beamx, beamy; |
| unsigned char screen[SCR_HSIZE*(SCR_VSIZE*2)]; |
| bool render_ok; |
| void texttoscreen(int x,int y, const char *scrtxt); |
| void chrtoscreen(int x,int y, char scrchr); |
| // cursor stuff |
| unsigned int crsrpos; |
| int crsrphase; |
| bool crsrblinkon; |
| // is joy emulated? |
| bool joyemu; |
| // CPU class pointer |
| CPU *cpuptr; |
| // TED process (main loop of emulation) |
| void ted_process(short *buffer, unsigned int count); |
| void setDS( void *ds); |
| |
| unsigned char Ram[RAMSIZE]; |
| unsigned char RomHi[4][ROMSIZE]; |
| void ChangeMemBankSetup(bool romoff); |
| |
| // timer stuff |
| bool t1on, t2on, t3on; |
| unsigned int timer1, timer2, timer3, t1start; |
| |
| ClockCycle GetClockCount(); |
| static TED *instance() { return instance_; }; |
| void forcedReset(); |
| // PSID support |
| void setMasterVolume(unsigned int shift); |
| void setSampleRate(unsigned int value); |
| unsigned int getSampleRate() { return sampleRate; }; |
| void injectCodeToRAM(unsigned int address, unsigned char *from, size_t len); |
| void oscillatorInit(); |
| void oscillatorReset(); |
| void setPsidPlayAddress(unsigned int addr) { psidReplayAddr = addr; }; |
| unsigned int getPsidPlayAddress() { return psidReplayAddr; }; |
| void setPsid(bool isPsidFormat) { psidFormat = isPsidFormat; }; |
| unsigned int isPsid() { return psidFormat; }; |
| void selectWaveForm(unsigned int wave); |
| void writeProtectedPlayerMemory(unsigned int addr, unsigned char *byte, unsigned int len) { |
| for(unsigned int i = 0; i < len; i++) |
| protectedPlayerMemory[(addr + i) & 0xfff] = *byte++; |
| } |
| void setplaybackSpeed(unsigned int speed); |
| void enableChannel(unsigned int channel, unsigned int enable) { |
| channelMask[channel & 1] = enable ? -1 : 0; |
| } |
| bool isChannelEnabled(unsigned int channel) { |
| return channelMask[channel & 1] != 0; |
| } |
| void storeToBuffer(short *buffer, short sample); |
| void copyToKbBuffer(char *bufferString, unsigned int bufferLength = -1); |
| void getTimeSinceLastReset(int hour, int min, int sec); |
| //void getSoundData(unsigned int nrsamples, short *buffer); |
| |
| private: |
| static TED *instance_; |
| Filter *filter; |
| // memory variables |
| unsigned char RomLo[4][ROMSIZE]; |
| unsigned char *actromlo, *actromhi; |
| unsigned char *mem_8000_bfff, *mem_c000_ffff, *mem_fc00_fcff; |
| unsigned int RAMMask; |
| unsigned char RamExt[4][RAMSIZE]; // Ram slots for 256 K RAM |
| unsigned char *actram; |
| unsigned char prp, prddr; |
| unsigned char pio1; |
| // indicates if screen blank is off |
| bool scrblank; |
| // for vertical/horizontal smooth scroll |
| unsigned int hshift, vshift; |
| unsigned int nrwscr, fltscr; |
| // char/color buffers |
| unsigned char DMAbuf[64*3]; |
| unsigned char *chrbuf, *clrbuf, *tmpClrbuf; |
| int cposy; |
| // rendering functions |
| void (TED::*scrmode)(); |
| inline void hi_text(); |
| void mc_text(); |
| void mc_text_rvs(); |
| void ec_text(); |
| void mcec(); |
| void rv_text(); |
| void hi_bitmap(); |
| void mc_bitmap(); |
| void illegalbank(); |
| bool charrom; |
| int rvsmode, grmode, ecmode; |
| int scrattr, charbank; |
| |
| // border color |
| unsigned int framecol; |
| // various memory pointers |
| unsigned char *colorbank, *charrombank, *charrambank; |
| unsigned char *grbank; |
| unsigned char *scrptr, *endptr, *ramptr; |
| const char *DMAptr; |
| unsigned int fastmode, irqline; |
| unsigned char hcol[2], mcol[4], ecol[4], bmmcol[4], *cset; |
| static ClockCycle CycleCounter; |
| ClockCycle lastResetCycle; |
| // |
| void DoDMA( unsigned char *Buf, unsigned int Offset ); |
| // |
| void setFreq(unsigned int channel, int freq); |
| void writeSoundReg(ClockCycle cycle, unsigned int reg, unsigned char value); |
| void renderSound(unsigned int nrsamples, short *buffer); |
| unsigned int psidReplayAddr; |
| bool psidFormat; |
| unsigned int waveForm; |
| unsigned char protectedPlayerMemory[0x1000]; |
| unsigned int playbackSpeed; |
| unsigned int channelMask[2]; |
| unsigned int sampleRate; |
| }; |
| |
| #define theTed TED::instance() |
| |
| const short HUE[16] = { 0, 0, |
| /*RED*/ 103, /*CYAN */ 283, |
| /*MAGENTA*/ 53,/*GREEN*/ 241, /*BLUE*/347, |
| /*YELLOW*/ 167,/*ORANGE*/123, /*BROWN*/ 148, |
| /*YLLW-GRN*/ 195, /*PINK*/ 83, /*BLU-GRN*/ 265, |
| /*LT-BLU*/ 323, /*DK-BLU*/ /*23 original, but wrong...*/ 355, /*LT-GRN */ 213 |
| }; |
| |
| const double luma[9] = { |
| /* |
| Luminancia Voltages |
| */ |
| 2.00, 2.4, 2.55, 2.7, 2.9, 3.3, 3.6, 4.1, 4.8 }; |
| |
| #endif //_TEDMEM_H |