66 lines
1.2 KiB
C
66 lines
1.2 KiB
C
|
|
|
|
#include "riscv.h"
|
|
#include "stdio.h"
|
|
|
|
|
|
#define PRINT_BASE_ADDR 0x40000000
|
|
#define PRINT_SIZE 0x4
|
|
|
|
#define dev_wr(addr) g_map[(addr-PRINT_BASE_ADDR) >> 2]
|
|
#define dev_wrb(addr) ((uint8_t *)g_map)[(addr-PRINT_BASE_ADDR)]
|
|
#define dev_wrh(addr) ((uint16_t *)g_map)[(addr-PRINT_BASE_ADDR) >> 1]
|
|
|
|
|
|
|
|
static uint32_t g_map[1];
|
|
|
|
static uint32_t read(uint32_t addr) {
|
|
if (!(addr & 0x3)) {
|
|
return dev_wr(addr);
|
|
} else if (!(addr & 0x1)) {
|
|
return dev_wrh(addr);
|
|
} else {
|
|
return dev_wrb(addr);
|
|
}
|
|
}
|
|
|
|
#define BUFF_LEN 1024
|
|
static char g_buff[BUFF_LEN];
|
|
static int g_index;
|
|
|
|
static void write(uint32_t addr, uint32_t data) {
|
|
// printf("print: write data=%x\n", data);
|
|
if (!(addr & 0x3)) {
|
|
dev_wr(addr) = data;
|
|
} else if (!(addr & 0x1)) {
|
|
dev_wrh(addr) = data;
|
|
} else {
|
|
dev_wrb(addr) = data;
|
|
}
|
|
if (g_index < BUFF_LEN) {
|
|
g_buff[g_index++] = data;
|
|
}
|
|
if (data == '\n') {
|
|
g_buff[g_index] = 0;
|
|
printf("\033[33m%s\033[0m", g_buff);
|
|
g_index = 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
const static device_t g_print = {
|
|
.addr = PRINT_BASE_ADDR,
|
|
.size = PRINT_SIZE,
|
|
.read = read,
|
|
.write = write,
|
|
};
|
|
|
|
|
|
const device_t* print_dev() {
|
|
return &g_print;
|
|
}
|
|
|