00001
00011 #include "mem.h"
00012 #include <memory.h>
00013 #include <windows.h>
00014
00015 #include <stdio.h>
00016
00017
00018
00019 #ifdef DEBUG
00020 #define POCET 1000000
00021 typedef struct { BOOL read; UINT adr; unsigned char data; } item;
00022 item DArr[POCET];
00023 FILE* fil;
00024 int volatile uk = 0;
00025 #endif
00026
00027 unsigned char memory[MEMSIZE + 4];
00028 pIOFunc memio[IOHI - IOLO + 1];
00029
00030 CRITICAL_SECTION CSMemory;
00031
00032 unsigned char memgetb(UINT adr)
00033 {
00034 unsigned char bget;
00035 EnterCriticalSection(&CSMemory);
00036 #ifdef DEBUG
00037 if (uk>POCET) {
00038 int i;
00039 fil = fopen("out.txt", "a");
00040 for (i = 0; i<= POCET; i++) {
00041 if (DArr[i].read == TRUE) {
00042 fprintf(fil, "cti(%04x) = %02x\n", DArr[i].adr, DArr[i].data);
00043 } else {
00044 fprintf(fil, "nastav(%04x)<---%02x\n", DArr[i].adr, DArr[i].data);
00045 }
00046 fflush(fil);
00047 }
00048 uk = 0;
00049 fflush(fil);
00050 fclose(fil);
00051 }
00052 if (adr < 0xA000 || adr >= 0xD000){
00053 DArr[uk].adr = adr;
00054 DArr[uk].read = TRUE;
00055 }
00056 #endif
00057 if (adr < IOLO || adr > IOHI || memio[adr - IOLO] == NULL) {
00058 bget = memory[adr];
00059 }
00060 else {
00061 (memio[adr - IOLO])(adr, &bget, IOREAD);
00062 }
00063 #ifdef DEBUG
00064 if (adr < 0xA000 || adr >= 0xD000){
00065 DArr[uk].data = bget;
00066 uk++;
00067 }
00068 #endif
00069 LeaveCriticalSection(&CSMemory);
00070 return bget;
00071 }
00072
00073 void memsetb(UINT adr, unsigned char bset)
00074 {
00075 EnterCriticalSection(&CSMemory);
00076 #ifdef DEBUG
00077 if (adr < 0xA000 || adr >= 0xD000){
00078 DArr[uk].adr = adr;
00079 DArr[uk].read = FALSE;
00080 }
00081 #endif
00082 if (adr < IOLO || adr > IOHI || memio[adr - IOLO] == NULL) {
00083 memory[adr] = bset;
00084 }
00085 else {
00086 (memio[adr - IOLO])(adr, &bset, IOWRITE);
00087 }
00088 #ifdef DEBUG
00089 if (adr < 0xA000 || adr >= 0xD000){
00090 DArr[uk].data = bset;
00091 uk++;
00092 }
00093 #endif
00094 LeaveCriticalSection(&CSMemory);
00095 }
00096
00097 void InitMem()
00098 {
00099 UINT i;
00100 #ifdef DEBUG
00101
00102 #endif
00103 for (i = 0; i <= IOHI - IOLO; i++) {
00104 memio[i] = NULL;
00105 }
00106 InitializeCriticalSection(&CSMemory);
00107 }
00108
00109 void SetIOFunc(pIOFunc piof, UINT loadr, UINT hiadr)
00110 {
00111 UINT i;
00112 for (i = loadr - IOLO; i <= hiadr - IOLO; i++) {
00113 memio[i] = piof;
00114 }
00115 }
00116
00117 void SetMemory(char *buf)
00118 {
00119 memcpy(memory, buf, MEMSIZE);
00120 }
00121
00122 #ifdef DEBUG
00123 void printmsg(char* msg)
00124 {
00125 fprintf(fil, "%s", msg);
00126 }
00127 #endif