dev_luna88k.cc Source File
Back to the index.
Go to the documentation of this file.
56 #define TICK_STEPS_SHIFT 14
59 #define LUNA88K_REGISTERS_BASE 0x3ffffff0UL
60 #define LUNA88K_REGISTERS_END 0xff000000UL
61 #define LUNA88K_REGISTERS_LENGTH (LUNA88K_REGISTERS_END - LUNA88K_REGISTERS_BASE)
66 #define BCD(x) ((((x) / 10) << 4) + ((x) % 10))
118 reassert_interrupts(d);
125 reassert_interrupts(d);
129 static void reassert_serial_interrupt(
struct luna88k_data* d)
131 bool assertSerial =
false;
154 assertSerial =
false;
178 reassert_serial_interrupt(d);
182 static void swapBitOrder(uint8_t*
data,
int len)
184 for (
int bo = 0; bo < len; bo ++)
186 uint8_t b = (uint8_t)
data[bo];
188 for (
int i = 0; i < 8; i++)
204 uint64_t idata = 0, odata = 0;
227 odata >>= ((3 - (
addr & 3)) * 8);
230 fatal(
"TODO: luna88k byte write to fuse\n");
257 uint32_t s = 2048 * 1024 / 8;
259 swapBitOrder(
data, len);
260 if (
addr + len - 1 < s) {
264 swapBitOrder(
data, len);
273 uint32_t s = 2048 * 1024 / 8;
275 swapBitOrder(
data, len);
276 if (
addr + len - 1 < s) {
280 swapBitOrder(
data, len);
311 timet = time(NULL); tmp = gmtime(&timet);
312 odata =
BCD(tmp->tm_sec) << 24;
315 timet = time(NULL); tmp = gmtime(&timet);
316 odata =
BCD(tmp->tm_min) << 24;
319 timet = time(NULL); tmp = gmtime(&timet);
320 odata =
BCD(tmp->tm_hour) << 24;
323 timet = time(NULL); tmp = gmtime(&timet);
324 odata =
BCD(tmp->tm_wday + 0) << 24;
327 timet = time(NULL); tmp = gmtime(&timet);
328 odata =
BCD(tmp->tm_mday) << 24;
331 timet = time(NULL); tmp = gmtime(&timet);
332 odata =
BCD(tmp->tm_mon + 1) << 24;
335 timet = time(NULL); tmp = gmtime(&timet);
336 odata =
BCD(tmp->tm_year - 2000) << 24;
376 int regnr = idata & 7;
391 reassert_serial_interrupt(d);
397 ( (d->
fb == NULL && sio_devnr == 0) ||
398 (d->
fb != NULL && sio_devnr == 1)) )
411 if (sio_devnr == 0) {
414 fatal(
"[ luna88k sio dev1 write data: TODO ]\n");
416 if (sio_devnr == 0) {
421 fatal(
"[ luna88k sio dev1 read data: TODO ]\n");
448 if ((idata & 0x03ffffff) != 0x00000000) {
449 fatal(
"[ TODO: luna88k interrupts, idata = 0x%08x, what to do with low bits? ]\n", (uint32_t)idata);
454 reassert_interrupts(d);
457 int highestCurrentStatus = 0;
458 odata = currentMask >> 8;
460 for (
int i = 1; i <= 6; ++i) {
461 int m = 1 << (25 + i);
463 highestCurrentStatus = i;
466 odata |= (highestCurrentStatus << 29);
483 fatal(
"TODO: luna88k write to software interrupts\n");
511 fatal(
"[ TODO: luna88k READ from BMAP_FN ROP register? ]\n");
515 if (idata != 0xffffffff) {
516 fatal(
"[ TODO: luna88k write which does not set ALL bits? ]\n");
554 default:
fatal(
"[ luna88k: unimplemented %s address 0x%x",
555 writeflag ==
MEM_WRITE?
"write to" :
"read from",
558 fatal(
": 0x%x", (
int)idata);
559 fatal(
" (%i bits) ]\n", len * 8);
584 snprintf(tmpstr,
sizeof(tmpstr),
"m8820x addr=0x%x addr2=0", iaddr);
598 snprintf(tmpstr,
sizeof(tmpstr),
"m8820x addr=0x%x addr2=1", daddr);
621 for (
int i = 1; i <= 6; i++) {
625 memset(&templ, 0,
sizeof(templ));
653 1280, 1024, 2048, 1024, 1,
"LUNA 88K");
658 printf(
"LUNA 88K can't have more than 4 CPUs.\n");
struct m8820x_cmmu * cmmu[MAX_M8820X_CMMUS]
void console_putchar(int handle, int ch)
#define INTERRUPT_CONNECT(name, istruct)
#define INTERRUPT_ASSERT(istruct)
uint8_t obio_sio_wr[2][8]
void(* interrupt_deassert)(struct interrupt *)
#define LUNA88K_REGISTERS_BASE
void memory_device_register(struct memory *mem, const char *, uint64_t baseaddr, uint64_t len, int(*f)(struct cpu *, struct memory *, uint64_t, unsigned char *, size_t, int, void *), void *extra, int flags, unsigned char *dyntrans_data)
uint32_t interrupt_status[MAX_CPUS]
int console_charavail(int handle)
#define LUNA88K_REGISTERS_LENGTH
#define SCC_WR1_RXI_ALL_CHAR
uint8_t obio_sio_rr[2][8]
uint32_t software_interrupt_status[MAX_CPUS]
void machine_add_tickfunction(struct machine *machine, void(*func)(struct cpu *, void *), void *extra, int clockshift)
uint32_t reg[M8820X_LENGTH/sizeof(uint32_t)]
void fatal(const char *fmt,...)
uint64_t memory_readmax64(struct cpu *cpu, unsigned char *buf, int len)
void * device_add(struct machine *machine, const char *name_and_params)
int console_readchar(int handle)
uint8_t nvram[NVRAM_SPACE]
int dev_fb_access(struct cpu *cpu, struct memory *mem, uint64_t relative_addr, unsigned char *data, size_t len, int writeflag, void *)
int console_start_slave(struct machine *machine, const char *consolename, int use_for_input)
struct interrupt timer_irq
uint32_t interrupt_enable[MAX_CPUS]
#define SCC_WR1_RXI_FIRST_CHAR
#define INTERRUPT_DEASSERT(istruct)
void(* interrupt_assert)(struct interrupt *)
void interrupt_handler_register(struct interrupt *templ)
void memory_writemax64(struct cpu *cpu, unsigned char *buf, int len, uint64_t data)
uint32_t batc[N_M88200_BATC_REGS]
void add_cmmu_for_cpu(struct devinit *devinit, int cpunr, uint32_t iaddr, uint32_t daddr)
#define TRI_PORT_RAM_SPACE
int timer_tick_counter_bogus
uint32_t fuse_rom[FUSE_ROM_SPACE/sizeof(uint32_t)]
struct vfb_data * dev_fb_init(struct machine *machine, struct memory *mem, uint64_t baseaddr, int vfb_type, int visible_xsize, int visible_ysize, int xsize, int ysize, int bit_depth, const char *name)
#define CHECK_ALLOCATION(ptr)
Generated on Tue Aug 25 2020 19:25:06 for GXemul by
1.8.18