Main Page   Data Structures   File List   Data Fields   Globals   Related Pages  

mem.c

Go to the documentation of this file.
00001 
00011 #include "mem.h"
00012 #include <memory.h>
00013 #include <windows.h>
00014 
00015 #include <stdio.h>
00016 
00017 //#define DEBUG
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){// fprintf(fil, "cti(%x)=", adr);
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){// fprintf(fil, "%x\n", bget);
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){// fprintf(fil, "nastav(%x)<--", adr);
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){// fprintf(fil, "%x\n", bset);
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         //fil = fopen("out.txt", "w");
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

Generated on Fri Sep 6 18:32:14 2002 for Emu6502 by doxygen1.2.17