| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 | #include "fw.h"#include "io.h"#include "abcio.h"#include "sys.h"#include "console.h"/* Configure ABC memory map */struct abc_mem_init {    unsigned int addr;    uint16_t len;    uint8_t flags;    const char *data;		/* May not be const, but... */};#define RD (ABCMEMMAP_RD >> 24)#define WR (ABCMEMMAP_WR >> 24)extern const char rom_ufddos80[];extern const char rom_print80_29[];/* Not really NV, but matches NVRAM in some expansions */static char __dram_bss __aligned(512) abc80_nvram[2 << 10];/* 16K external memory to expand to 512K */static char __dram_bss __aligned(512) abc80_extmem[16 << 10];static const struct abc_mem_init mem_init[] = {    { 0x5000,  2 << 10, RD|WR, abc80_nvram },    { 0x6000,  4 << 10, RD,    rom_ufddos80 },    { 0x7400,  1 << 10, RD,    rom_print80_29 },    { 0x8000, 16 << 10, RD|WR, abc80_extmem },    { -1U, 0, 0, NULL }};void __cold abc_init_memmap(void){    volatile uint32_t *pg = &ABCMEMMAP_PAGE(0);    const struct abc_mem_init *next = &mem_init[0];    for (unsigned int addr = 0; addr < 0x10000; addr += 512) {	if (addr >= next->addr + next->len)	    next++;	if (addr < next->addr) {	    *pg++ = 0;	} else {	    *pg++ = ((size_t)(next->data + (addr - next->addr))		     & SDRAM_MASK) | (next->flags << 24);	}    }}
 |