File:  [Previous NeXT emulator] / previous / src / dimension / nd_rom.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 19:31:34 2018 UTC (8 years, 3 months ago) by root
Branches: giles, MAIN
CVS tags: branch_realtime, HEAD
Previous NeXT emulator

#include "main.h"
#include "configuration.h"
#include "m68000.h"
#include "sysdeps.h"
#include "file.h"
#include "dimension.h"
#include "nd_mem.h"
#include "nd_rom.h"

/* --------- NEXTDIMENSION EEPROM --------- *
 *                                          *
 *  Intel 28F010 (1024k CMOS Flash Memory)  *
 *                                          */

/* NeXTdimension board memory */
#define ROM_CMD_READ    0x00
#define ROM_CMD_READ_ID 0x90
#define ROM_CMD_ERASE   0x20
#define ROM_CMD_WRITE   0x40
#define ROM_CMD_VERIFY  0x80
#define ROM_CMD_RESET   0xFF

#define ROM_ID_MFG      0x89
#define ROM_ID_DEV      0xB4


Uint8 nd_rom_command = 0x00;
Uint32 nd_rom_last_addr = 0x00;

Uint8 nd_rom_read(Uint32 addr) {
    switch (nd_rom_command) {
        case ROM_CMD_READ:
            return ND_rom[addr];
        case ROM_CMD_READ_ID:
            switch (addr) {
                case 0: return ROM_ID_MFG;
                case 1: return ROM_ID_DEV;
                default: return ROM_ID_DEV;
            }
        case (ROM_CMD_ERASE|ROM_CMD_VERIFY):
            nd_rom_command = ROM_CMD_READ;
            return ND_rom[addr];
        case (ROM_CMD_WRITE|ROM_CMD_VERIFY):
            nd_rom_command = ROM_CMD_READ;
            return ND_rom[nd_rom_last_addr];
        case ROM_CMD_RESET:
        default:
            return 0;
    }
}

void nd_rom_write(Uint32 addr, Uint8 val) {
    int i;
    
    switch (nd_rom_command) {
        case ROM_CMD_WRITE:
            Log_Printf(LOG_WARN, "[ND] ROM: Writing ROM (addr=%04X, val=%02X)",addr,val);
            ND_rom[addr] = val;
            nd_rom_last_addr = addr;
            nd_rom_command = ROM_CMD_READ;
            break;
        case ROM_CMD_ERASE:
            if (val==ROM_CMD_ERASE) {
                Log_Printf(LOG_WARN, "[ND] ROM: Erasing ROM");
                for (i = 0; i < (128*1024); i++)
                    ND_rom[i] = 0xFF;
                break;
            } /* else fall through */
        default:
            Log_Printf(LOG_WARN, "[ND] ROM: Command %02X",val);
            nd_rom_command = val;
            break;
    }
}


/* Load NeXTdimension ROM from file */
void nd_rom_load(void) {
    FILE* romfile;
    
    nd_rom_command = ROM_CMD_READ;
    nd_rom_last_addr = 0;
    
    if (!File_Exists(ConfigureParams.Dimension.szRomFileName)) {
        Log_Printf(LOG_WARN, "[ND] Error: ROM file does not exist or is not readable");
        return;
    }
    
    romfile = File_Open(ConfigureParams.Dimension.szRomFileName, "rb");
    
    if (romfile==NULL) {
        Log_Printf(LOG_WARN, "[ND] Error: Cannot open ROM file");
        return;
    }
    
    fread(ND_rom,1, 128 * 1024 ,romfile);
    
    Log_Printf(LOG_WARN, "[ND] Read ROM from %s",ConfigureParams.Dimension.szRomFileName);
    
    File_Close(romfile);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.