|
|
1.1 root 1: #include "main.h"
2: #include "configuration.h"
3: #include "m68000.h"
4: #include "sysdeps.h"
5: #include "file.h"
6: #include "dimension.h"
7: #include "nd_mem.h"
8: #include "nd_rom.h"
9:
10: /* --------- NEXTDIMENSION EEPROM --------- *
11: * *
12: * Intel 28F010 (1024k CMOS Flash Memory) *
13: * */
14:
15: /* NeXTdimension board memory */
16: #define ROM_CMD_READ 0x00
17: #define ROM_CMD_READ_ID 0x90
18: #define ROM_CMD_ERASE 0x20
19: #define ROM_CMD_WRITE 0x40
20: #define ROM_CMD_VERIFY 0x80
21: #define ROM_CMD_RESET 0xFF
22:
23: #define ROM_ID_MFG 0x89
24: #define ROM_ID_DEV 0xB4
25:
26:
27: Uint8 nd_rom_command = 0x00;
28: Uint32 nd_rom_last_addr = 0x00;
29:
30: Uint8 nd_rom_read(Uint32 addr) {
31: switch (nd_rom_command) {
32: case ROM_CMD_READ:
33: return ND_rom[addr];
34: case ROM_CMD_READ_ID:
35: switch (addr) {
36: case 0: return ROM_ID_MFG;
37: case 1: return ROM_ID_DEV;
1.1.1.2 ! root 38: default: return ROM_ID_DEV;
1.1 root 39: }
40: case (ROM_CMD_ERASE|ROM_CMD_VERIFY):
41: nd_rom_command = ROM_CMD_READ;
42: return ND_rom[addr];
43: case (ROM_CMD_WRITE|ROM_CMD_VERIFY):
44: nd_rom_command = ROM_CMD_READ;
45: return ND_rom[nd_rom_last_addr];
46: case ROM_CMD_RESET:
47: default:
48: return 0;
49: }
50: }
51:
52: void nd_rom_write(Uint32 addr, Uint8 val) {
53: int i;
54:
55: switch (nd_rom_command) {
56: case ROM_CMD_WRITE:
57: Log_Printf(LOG_WARN, "[ND] ROM: Writing ROM (addr=%04X, val=%02X)",addr,val);
58: ND_rom[addr] = val;
59: nd_rom_last_addr = addr;
60: nd_rom_command = ROM_CMD_READ;
61: break;
62: case ROM_CMD_ERASE:
63: if (val==ROM_CMD_ERASE) {
64: Log_Printf(LOG_WARN, "[ND] ROM: Erasing ROM");
65: for (i = 0; i < (128*1024); i++)
66: ND_rom[i] = 0xFF;
67: break;
68: } /* else fall through */
69: default:
70: Log_Printf(LOG_WARN, "[ND] ROM: Command %02X",val);
71: nd_rom_command = val;
72: break;
73: }
74: }
75:
76:
77: /* Load NeXTdimension ROM from file */
78: void nd_rom_load(void) {
79: FILE* romfile;
80:
1.1.1.2 ! root 81: nd_rom_command = ROM_CMD_READ;
! 82: nd_rom_last_addr = 0;
! 83:
1.1 root 84: if (!File_Exists(ConfigureParams.Dimension.szRomFileName)) {
85: Log_Printf(LOG_WARN, "[ND] Error: ROM file does not exist or is not readable");
86: return;
87: }
88:
89: romfile = File_Open(ConfigureParams.Dimension.szRomFileName, "rb");
90:
91: if (romfile==NULL) {
92: Log_Printf(LOG_WARN, "[ND] Error: Cannot open ROM file");
93: return;
94: }
95:
96: fread(ND_rom,1, 128 * 1024 ,romfile);
97:
98: Log_Printf(LOG_WARN, "[ND] Read ROM from %s",ConfigureParams.Dimension.szRomFileName);
99:
100: File_Close(romfile);
1.1.1.2 ! root 101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.