1
0
mirror of https://github.com/mist-devel/mist-board.git synced 2026-02-05 23:54:41 +00:00
Files
mist-devel.mist-board/tests/tg68k/mem_if_c.c
2016-01-23 21:09:31 +01:00

98 lines
2.1 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// #define DEBUG
#include "mem.h"
#define SULV_U (0) /* Uninitialized */
#define SULV_X (1) /* Forcing Unknown */
#define SULV_0 (2) /* Forcing 0 */
#define SULV_1 (3) /* Forcing 1 */
#define SULV_Z (4) /* High Impedance */
#define SULV_W (5) /* Weak Unknown */
#define SULV_L (6) /* Weak 0 */
#define SULV_H (7) /* Weak 1 */
#define SULV__ (8) /* Don't care */
unsigned char chr[] = { 'U','X','0','1','Z','W','L','H','-' };
void mem_if_c(char clk, char bs[2], char ds[2], char addr[32], char din[16], char dout[16]) {
static unsigned int data_out = 0;
static char init = 0;
static char last_clk = 0;
static unsigned int last_addr = 0xffffffff;
static unsigned short last_data;
int busstate = ((bs[1]==SULV_1)?1:0) + ((bs[0]==SULV_1)?2:0);
int dstrobe = ((ds[1]==SULV_1)?1:0) + ((ds[0]==SULV_1)?2:0);
char wr = (busstate == 3)?SULV_1:SULV_0;
// default: restore previous data_out
int i;
for(i=0;i<16;i++)
dout[i] = (data_out & (0x8000>>i))?SULV_1:SULV_0;
if(busstate == 1)
return;
if(!init) {
// check if a file name was given
if(getenv("TG68K_BIN"))
mem_init(getenv("TG68K_BIN"));
else {
fprintf(stderr, "Please specify a bin file via TG68K_BIN\n");
exit(-1);
}
init=1;
}
// only do something if clock changes
if(clk == last_clk)
return;
last_clk = clk;
// only react on falling clk edge
if(clk == SULV_1) return;
unsigned int a = 0;
for(i=0;i<32;i++) {
a <<= 1;
if((addr[i] == SULV_1)||(addr[i] == SULV_H))
a |= 1;
}
#ifdef DEBUG
printf("mem(%08x/%d/%d) = ", a, dstrobe, busstate);
#endif
if(wr == SULV_1) {
unsigned int d = 0;
for(i=0;i<16;i++) {
d <<= 1;
if((din[i] == SULV_1)||(din[i] == SULV_H))
d |= 1;
}
#ifdef DEBUG
printf("WRITE %x\n", d);
#endif
mem_write(a, d, dstrobe);
} else {
// exit(-1);
int d16 = mem_read(a, 3);
#ifdef DEBUG
printf("READ %x\n", d16);
#endif
for(i=0;i<16;i++)
dout[i] = (d16 & (0x8000>>i))?SULV_1:SULV_0;
data_out = d16;
}
}