////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
//
|
//
|
// Filename: regdefs.h
|
// Filename: regdefs.h
|
//
|
//
|
// Project: OpenArty, an entirely open SoC based upon the Arty platform
|
// Project: OpenArty, an entirely open SoC based upon the Arty platform
|
//
|
//
|
// Purpose:
|
// Purpose:
|
//
|
//
|
// Creator: Dan Gisselquist, Ph.D.
|
// Creator: Dan Gisselquist, Ph.D.
|
// Gisselquist Technology, LLC
|
// Gisselquist Technology, LLC
|
//
|
//
|
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
//
|
//
|
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
|
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
|
//
|
//
|
// This program is free software (firmware): you can redistribute it and/or
|
// This program is free software (firmware): you can redistribute it and/or
|
// modify it under the terms of the GNU General Public License as published
|
// modify it under the terms of the GNU General Public License as published
|
// by the Free Software Foundation, either version 3 of the License, or (at
|
// by the Free Software Foundation, either version 3 of the License, or (at
|
// your option) any later version.
|
// your option) any later version.
|
//
|
//
|
// This program is distributed in the hope that it will be useful, but WITHOUT
|
// This program is distributed in the hope that it will be useful, but WITHOUT
|
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
|
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
// for more details.
|
// for more details.
|
//
|
//
|
// You should have received a copy of the GNU General Public License along
|
// You should have received a copy of the GNU General Public License along
|
// with this program. (It's in the $(ROOT)/doc directory, run make with no
|
// with this program. (It's in the $(ROOT)/doc directory, run make with no
|
// target there if the PDF file isn't present.) If not, see
|
// target there if the PDF file isn't present.) If not, see
|
// <http://www.gnu.org/licenses/> for a copy.
|
// <http://www.gnu.org/licenses/> for a copy.
|
//
|
//
|
// License: GPL, v3, as defined and found on www.gnu.org,
|
// License: GPL, v3, as defined and found on www.gnu.org,
|
// http://www.gnu.org/licenses/gpl.html
|
// http://www.gnu.org/licenses/gpl.html
|
//
|
//
|
//
|
//
|
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
//
|
//
|
//
|
//
|
//
|
//
|
#include <stdio.h>
|
#include <stdio.h>
|
#include <stdlib.h>
|
#include <stdlib.h>
|
#include <strings.h>
|
#include <strings.h>
|
#include <ctype.h>
|
#include <ctype.h>
|
#include "regdefs.h"
|
#include "regdefs.h"
|
|
|
const REGNAME raw_bregs[] = {
|
const REGNAME raw_bregs[] = {
|
{ R_VERSION, "VERSION" },
|
{ R_VERSION, "VERSION" },
|
{ R_ICONTROL, "ICONTROL" },
|
{ R_ICONTROL, "ICONTROL" },
|
{ R_ICONTROL, "INT" },
|
{ R_ICONTROL, "INT" },
|
{ R_ICONTROL, "PIC" },
|
{ R_ICONTROL, "PIC" },
|
{ R_BUSERR, "BUSERR" },
|
{ R_BUSERR, "BUSERR" },
|
{ R_BUSERR, "BUS" },
|
{ R_BUSERR, "BUS" },
|
{ R_PWCOUNT, "PWRCOUNT" },
|
{ R_PWCOUNT, "PWRCOUNT" },
|
{ R_BTNSW, "BTNSW" },
|
{ R_BTNSW, "BTNSW" },
|
{ R_BTNSW, "BTNS" },
|
{ R_BTNSW, "BTNS" },
|
{ R_BTNSW, "BTN" },
|
{ R_BTNSW, "BTN" },
|
{ R_BTNSW, "SW" },
|
{ R_BTNSW, "SW" },
|
{ R_BTNSW, "SWITCHES" },
|
{ R_BTNSW, "SWITCHES" },
|
{ R_BTNSW, "SWITCH" },
|
{ R_BTNSW, "SWITCH" },
|
{ R_LEDS, "LEDS" },
|
{ R_LEDS, "LEDS" },
|
{ R_LEDS, "LED" },
|
{ R_LEDS, "LED" },
|
{ R_UART_SETUP, "UARTSETUP" },
|
{ R_UART_SETUP, "UARTSETUP" },
|
{ R_UART_SETUP, "UART" },
|
{ R_UART_SETUP, "UART" },
|
{ R_UART_SETUP, "AUXSETUP" },
|
{ R_UART_SETUP, "AUXSETUP" },
|
{ R_UART_SETUP, "AUX" },
|
{ R_UART_SETUP, "AUX" },
|
{ R_GPS_SETUP, "GPSSETUP" },
|
{ R_GPS_SETUP, "GPSSETUP" },
|
{ R_GPS_SETUP, "GPSUART" },
|
{ R_GPS_SETUP, "GPSUART" },
|
{ R_CLR0, "CLRLED0" },
|
{ R_CLR0, "CLRLED0" },
|
{ R_CLR1, "CLRLED1" },
|
{ R_CLR1, "CLRLED1" },
|
{ R_CLR2, "CLRLED2" },
|
{ R_CLR2, "CLRLED2" },
|
{ R_CLR3, "CLRLED3" },
|
{ R_CLR3, "CLRLED3" },
|
{ R_CLR0, "CLR0" },
|
{ R_CLR0, "CLR0" },
|
{ R_CLR1, "CLR1" },
|
{ R_CLR1, "CLR1" },
|
{ R_CLR2, "CLR2" },
|
{ R_CLR2, "CLR2" },
|
{ R_CLR3, "CLR3" },
|
{ R_CLR3, "CLR3" },
|
{ R_DATE, "DATE" },
|
{ R_DATE, "DATE" },
|
{ R_GPIO, "GPIO" },
|
{ R_GPIO, "GPIO" },
|
{ R_UARTRX, "AUXRX" },
|
{ R_UARTRX, "AUXRX" },
|
{ R_UARTRX, "RX" },
|
{ R_UARTRX, "RX" },
|
{ R_UARTTX, "AUXTX" },
|
{ R_UARTTX, "AUXTX" },
|
{ R_UARTTX, "TX" },
|
{ R_UARTTX, "TX" },
|
//
|
//
|
{ R_GPSRX, "GPSRX" },
|
{ R_GPSRX, "GPSRX" },
|
{ R_GPSTX, "GPSTX" },
|
{ R_GPSTX, "GPSTX" },
|
// Scope registers--these scopes may or may not be present depending
|
// Scope registers--these scopes may or may not be present depending
|
// upon your current configuration.
|
// upon your current configuration.
|
{ R_QSCOPE, "SCOPE" }, // Scope zero
|
{ R_QSCOPE, "SCOPE" }, // Scope zero
|
{ R_QSCOPE, "SCOP" },
|
{ R_QSCOPE, "SCOP" },
|
{ R_QSCOPED, "SCOPDATA" },
|
{ R_QSCOPED, "SCOPDATA" },
|
{ R_QSCOPED, "SCDATA" },
|
{ R_QSCOPED, "SCDATA" },
|
{ R_QSCOPED, "SCOPED" },
|
{ R_QSCOPED, "SCOPED" },
|
{ R_QSCOPED, "SCOPD" },
|
{ R_QSCOPED, "SCOPD" },
|
|
{ R_CPUSCOPE, "CPUSCOPE" },
|
|
{ R_CPUSCOPED, "CPUSCOPD" },
|
|
{ R_CPUSCOPED, "CPUSCOPED" },
|
{ R_GPSCOPE, "GPSSCOPE" }, // Scope one
|
{ R_GPSCOPE, "GPSSCOPE" }, // Scope one
|
{ R_GPSCOPE, "GPSSCOP" },
|
{ R_GPSCOPE, "GPSSCOP" },
|
{ R_GPSCOPED, "GPSSCDATA" },
|
{ R_GPSCOPED, "GPSSCDATA" },
|
{ R_GPSCOPED, "GPSSCD" },
|
{ R_GPSCOPED, "GPSSCD" },
|
{ R_GPSCOPED, "GPSDATA" },
|
{ R_GPSCOPED, "GPSDATA" },
|
{ R_CFGSCOPE, "CFGSCOPE" }, // Scope one
|
{ R_CFGSCOPE, "CFGSCOPE" }, // Scope one
|
{ R_CFGSCOPE, "CFGSCOP" },
|
{ R_CFGSCOPE, "CFGSCOP" },
|
{ R_CFGSCOPED, "CFGSCDATA" },
|
{ R_CFGSCOPED, "CFGSCDATA" },
|
{ R_CFGSCOPED, "CFGSCD" },
|
{ R_CFGSCOPED, "CFGSCD" },
|
|
{ R_BUSSCOPE, "BUSSCOPE" }, // Scope one
|
|
{ R_BUSSCOPED, "BUSSCOPD" },
|
{ R_RAMSCOPE, "RAMSCOPE" }, // Scope two
|
{ R_RAMSCOPE, "RAMSCOPE" }, // Scope two
|
{ R_RAMSCOPE, "RAMSCOP" },
|
{ R_RAMSCOPE, "RAMSCOP" },
|
{ R_RAMSCOPED, "RAMSCOPD" },
|
{ R_RAMSCOPED, "RAMSCOPD" },
|
{ R_NETSCOPE, "NETSCOPE" }, // Scope three
|
{ R_NETSCOPE, "NETSCOPE" }, // Scope three
|
{ R_NETSCOPE, "NETSCOP" },
|
{ R_NETSCOPE, "NETSCOP" },
|
{ R_NETSCOPED, "NETSCOPED" },
|
{ R_NETSCOPED, "NETSCOPED" },
|
{ R_NETSCOPED, "NETSCOPD" },
|
{ R_NETSCOPED, "NETSCOPD" },
|
// RTC registers
|
// RTC registers
|
{ R_CLOCK, "CLOCK" },
|
{ R_CLOCK, "CLOCK" },
|
{ R_CLOCK, "TIME" },
|
{ R_CLOCK, "TIME" },
|
{ R_TIMER, "TIMER" },
|
{ R_TIMER, "TIMER" },
|
{ R_STOPWATCH, "STOPWACH" },
|
{ R_STOPWATCH, "STOPWACH" },
|
{ R_STOPWATCH, "STOPWATCH" },
|
{ R_STOPWATCH, "STOPWATCH" },
|
{ R_CKALARM, "CKALARM" },
|
{ R_CKALARM, "CKALARM" },
|
{ R_CKALARM, "ALARM" },
|
{ R_CKALARM, "ALARM" },
|
// SDCard registers
|
// SDCard registers
|
{ R_SDCARD_CTRL, "SDCARD" },
|
{ R_SDCARD_CTRL, "SDCARD" },
|
{ R_SDCARD_DATA, "SDDATA" },
|
{ R_SDCARD_DATA, "SDDATA" },
|
{ R_SDCARD_FIFOA, "SDFIF0" },
|
{ R_SDCARD_FIFOA, "SDFIF0" },
|
{ R_SDCARD_FIFOA, "SDFIFO" },
|
{ R_SDCARD_FIFOA, "SDFIFO" },
|
{ R_SDCARD_FIFOA, "SDFIFA" },
|
{ R_SDCARD_FIFOA, "SDFIFA" },
|
{ R_SDCARD_FIFOA, "SDFIFO0" },
|
{ R_SDCARD_FIFOA, "SDFIFO0" },
|
{ R_SDCARD_FIFOA, "SDFIFOA" },
|
{ R_SDCARD_FIFOA, "SDFIFOA" },
|
{ R_SDCARD_FIFOB, "SDFIF1" },
|
{ R_SDCARD_FIFOB, "SDFIF1" },
|
{ R_SDCARD_FIFOB, "SDFIFB" },
|
{ R_SDCARD_FIFOB, "SDFIFB" },
|
{ R_SDCARD_FIFOB, "SDFIFO1" },
|
{ R_SDCARD_FIFOB, "SDFIFO1" },
|
{ R_SDCARD_FIFOB, "SDFIFOB" },
|
{ R_SDCARD_FIFOB, "SDFIFOB" },
|
// GPS control loop control
|
// GPS control loop control
|
{ R_GPS_ALPHA, "ALPHA" },
|
{ R_GPS_ALPHA, "ALPHA" },
|
{ R_GPS_BETA, "BETA" },
|
{ R_GPS_BETA, "BETA" },
|
{ R_GPS_GAMMA, "GAMMA" },
|
{ R_GPS_GAMMA, "GAMMA" },
|
{ R_GPS_STEP, "GPSSTEP" },
|
{ R_GPS_STEP, "GPSSTEP" },
|
// Network packet interface (not built yet)
|
// Network packet interface (not built yet)
|
// OLED Control
|
// OLED Control
|
{ R_OLED_CMD, "OLED" },
|
{ R_OLED_CMD, "OLED" },
|
{ R_OLED_CDATA, "OLEDCA" },
|
{ R_OLED_CDATA, "OLEDCA" },
|
{ R_OLED_CDATB, "OLEDCB" },
|
{ R_OLED_CDATB, "OLEDCB" },
|
{ R_OLED_DATA, "ODATA" },
|
{ R_OLED_DATA, "ODATA" },
|
// Unused section
|
// Unused section
|
// GPS Testbench
|
// GPS Testbench
|
{ R_GPSTB_FREQ, "GPSFREQ" },
|
{ R_GPSTB_FREQ, "GPSFREQ" },
|
{ R_GPSTB_JUMP, "GPSJUMP" },
|
{ R_GPSTB_JUMP, "GPSJUMP" },
|
{ R_GPSTB_ERRHI, "ERRHI" },
|
{ R_GPSTB_ERRHI, "ERRHI" },
|
{ R_GPSTB_ERRLO, "ERRLO" },
|
{ R_GPSTB_ERRLO, "ERRLO" },
|
{ R_GPSTB_COUNTHI, "CNTHI" },
|
{ R_GPSTB_COUNTHI, "CNTHI" },
|
{ R_GPSTB_COUNTLO, "CNTLO" },
|
{ R_GPSTB_COUNTLO, "CNTLO" },
|
{ R_GPSTB_STEPHI, "STEPHI" },
|
{ R_GPSTB_STEPHI, "STEPHI" },
|
{ R_GPSTB_STEPLO, "STEPLO" },
|
{ R_GPSTB_STEPLO, "STEPLO" },
|
//
|
// Ethernet, packet control registers
|
|
{ R_NET_RXCMD, "RXCMD" },
|
|
{ R_NET_RXCMD, "NETRX" },
|
|
{ R_NET_TXCMD, "TXCMD" },
|
|
{ R_NET_TXCMD, "NETTX" },
|
|
{ R_NET_MACHI, "MACHI" },
|
|
{ R_NET_MACLO, "MACLO" },
|
|
{ R_NET_RXMISS, "NETMISS" },
|
|
{ R_NET_RXERR, "NETERR" },
|
|
{ R_NET_RXCRC, "NETXCRC" },
|
// Ethernet MDIO registers
|
// Ethernet MDIO registers
|
{ R_MDIO_BMCR, "BMCR" },
|
{ R_MDIO_BMCR, "BMCR" },
|
{ R_MDIO_BMSR, "BMSR" },
|
{ R_MDIO_BMSR, "BMSR" },
|
{ R_MDIO_PHYIDR1, "PHYIDR1" },
|
{ R_MDIO_PHYIDR1, "PHYIDR1" },
|
{ R_MDIO_PHYIDR2, "PHYIDR2" },
|
{ R_MDIO_PHYIDR2, "PHYIDR2" },
|
{ R_MDIO_ANAR, "ANAR" },
|
{ R_MDIO_ANAR, "ANAR" },
|
{ R_MDIO_ANLPAR, "ANLPAR" },
|
{ R_MDIO_ANLPAR, "ANLPAR" },
|
{ R_MDIO_ANER, "ANER" },
|
{ R_MDIO_ANER, "ANER" },
|
{ R_MDIO_ANNPTR, "ANNPTR" },
|
{ R_MDIO_ANNPTR, "ANNPTR" },
|
{ R_MDIO_PHYSTS, "PHYSTS" },
|
{ R_MDIO_PHYSTS, "PHYSTS" },
|
{ R_MDIO_FCSCR, "FCSCR" },
|
{ R_MDIO_FCSCR, "FCSCR" },
|
{ R_MDIO_RECR, "RECR" },
|
{ R_MDIO_RECR, "RECR" },
|
{ R_MDIO_PCSR, "PCSR" },
|
{ R_MDIO_PCSR, "PCSR" },
|
{ R_MDIO_RBR, "RBR" },
|
{ R_MDIO_RBR, "RBR" },
|
{ R_MDIO_LEDCR, "LEDCR" },
|
{ R_MDIO_LEDCR, "LEDCR" },
|
{ R_MDIO_PHYCR, "PHYCR" },
|
{ R_MDIO_PHYCR, "PHYCR" },
|
{ R_MDIO_BTSCR, "BTSCR" },
|
{ R_MDIO_BTSCR, "BTSCR" },
|
{ R_MDIO_CDCTRL, "CDCTRL" },
|
{ R_MDIO_CDCTRL, "CDCTRL" },
|
{ R_MDIO_EDCR, "EDCR" },
|
{ R_MDIO_EDCR, "EDCR" },
|
//
|
//
|
// Flash configuration register names
|
// Flash configuration register names
|
{ R_QSPI_EREG, "QSPIEREG" },
|
{ R_QSPI_EREG, "QSPIEREG" },
|
{ R_QSPI_EREG, "QSPIE" },
|
{ R_QSPI_EREG, "QSPIE" },
|
{ R_QSPI_STAT, "QSPIS" },
|
{ R_QSPI_STAT, "QSPIS" },
|
{ R_QSPI_NVCONF,"QSPINVCF" },
|
{ R_QSPI_NVCONF,"QSPINVCF" },
|
{ R_QSPI_NVCONF,"QSPINV" },
|
{ R_QSPI_NVCONF,"QSPINV" },
|
{ R_QSPI_VCONF, "QSPIVCNF" },
|
{ R_QSPI_VCONF, "QSPIVCNF" },
|
{ R_QSPI_VCONF, "QSPIV" },
|
{ R_QSPI_VCONF, "QSPIV" },
|
{ R_QSPI_EVCONF,"QSPIEVCF" },
|
{ R_QSPI_EVCONF,"QSPIEVCF" },
|
{ R_QSPI_EVCONF,"QSPIEV" },
|
{ R_QSPI_EVCONF,"QSPIEV" },
|
{ R_QSPI_LOCK, "QSPILOCK" },
|
{ R_QSPI_LOCK, "QSPILOCK" },
|
{ R_QSPI_FLAG, "QSPIFLAG" },
|
{ R_QSPI_FLAG, "QSPIFLAG" },
|
{ R_QSPI_ID, "QSPIID" },
|
{ R_QSPI_ID, "QSPIID" },
|
{ R_QSPI_IDA, "QSPIIDA" },
|
{ R_QSPI_IDA, "QSPIIDA" },
|
{ R_QSPI_IDB, "QSPIIDB" },
|
{ R_QSPI_IDB, "QSPIIDB" },
|
{ R_QSPI_IDC, "QSPIIDC" },
|
{ R_QSPI_IDC, "QSPIIDC" },
|
{ R_QSPI_IDD, "QSPIIDD" },
|
{ R_QSPI_IDD, "QSPIIDD" },
|
{ R_QSPI_OTPWP, "QSPIOTPWP" },
|
{ R_QSPI_OTPWP, "QSPIOTPWP" },
|
{ R_QSPI_OTP, "QSPIOTP" },
|
{ R_QSPI_OTP, "QSPIOTP" },
|
//
|
//
|
{ R_CFG_CRC, "FPGACRC" },
|
{ R_CFG_CRC, "FPGACRC" },
|
{ R_CFG_FAR, "FPGAFAR" },
|
{ R_CFG_FAR, "FPGAFAR" },
|
{ R_CFG_FDRI, "FPGAFDRI" },
|
{ R_CFG_FDRI, "FPGAFDRI" },
|
{ R_CFG_FDRO, "FPGAFDRO" },
|
{ R_CFG_FDRO, "FPGAFDRO" },
|
{ R_CFG_CMD, "FPGACMD" },
|
{ R_CFG_CMD, "FPGACMD" },
|
{ R_CFG_CTL0, "FPGACTL0" },
|
{ R_CFG_CTL0, "FPGACTL0" },
|
{ R_CFG_MASK, "FPGAMASK" },
|
{ R_CFG_MASK, "FPGAMASK" },
|
{ R_CFG_STAT, "FPGASTAT" },
|
{ R_CFG_STAT, "FPGASTAT" },
|
{ R_CFG_LOUT, "FPGALOUT" },
|
{ R_CFG_LOUT, "FPGALOUT" },
|
{ R_CFG_COR0, "FPGACOR0" },
|
{ R_CFG_COR0, "FPGACOR0" },
|
{ R_CFG_MFWR, "FPGAMFWR" },
|
{ R_CFG_MFWR, "FPGAMFWR" },
|
{ R_CFG_CBC, "FPGACBC" },
|
{ R_CFG_CBC, "FPGACBC" },
|
{ R_CFG_IDCODE, "FPGAIDCODE" },
|
{ R_CFG_IDCODE, "FPGAIDCODE" },
|
{ R_CFG_AXSS, "FPGAAXSS" },
|
{ R_CFG_AXSS, "FPGAAXSS" },
|
{ R_CFG_COR0, "FPGACOR1" },
|
{ R_CFG_COR0, "FPGACOR1" },
|
{ R_CFG_WBSTAR, "WBSTAR" },
|
{ R_CFG_WBSTAR, "WBSTAR" },
|
{ R_CFG_TIMER, "CFGTIMER" },
|
{ R_CFG_TIMER, "CFGTIMER" },
|
{ R_CFG_BOOTSTS,"BOOTSTS" },
|
{ R_CFG_BOOTSTS,"BOOTSTS" },
|
{ R_CFG_CTL1, "FPGACTL1" },
|
{ R_CFG_CTL1, "FPGACTL1" },
|
{ R_CFG_BSPI, "FPGABSPI" },
|
{ R_CFG_BSPI, "FPGABSPI" },
|
//
|
//
|
{ R_ZIPCTRL, "ZIPCTRL" },
|
{ R_ZIPCTRL, "ZIPCTRL" },
|
{ R_ZIPCTRL, "ZIPC" },
|
{ R_ZIPCTRL, "ZIPC" },
|
{ R_ZIPCTRL, "CPU" },
|
{ R_ZIPCTRL, "CPU" },
|
{ R_ZIPCTRL, "CPUC" },
|
{ R_ZIPCTRL, "CPUC" },
|
{ R_ZIPDATA, "ZIPDATA" },
|
{ R_ZIPDATA, "ZIPDATA" },
|
{ R_ZIPDATA, "ZIPD" },
|
{ R_ZIPDATA, "ZIPD" },
|
{ R_ZIPDATA, "CPUD" },
|
{ R_ZIPDATA, "CPUD" },
|
{ EQSPIFLASH, "FLASH" },
|
{ EQSPIFLASH, "FLASH" },
|
{ MEMBASE, "BLKRAM" },
|
{ MEMBASE, "BLKRAM" },
|
{ MEMBASE, "MEM" },
|
{ MEMBASE, "MEM" },
|
{ RAMBASE, "DDR3SDRAM" },
|
{ RAMBASE, "DDR3SDRAM" },
|
{ RAMBASE, "SDRAM" },
|
{ RAMBASE, "SDRAM" },
|
{ RAMBASE, "RAM" }
|
{ RAMBASE, "RAM" }
|
};
|
};
|
|
|
#define RAW_NREGS (sizeof(raw_bregs)/sizeof(bregs[0]))
|
#define RAW_NREGS (sizeof(raw_bregs)/sizeof(bregs[0]))
|
|
|
const REGNAME *bregs = raw_bregs;
|
const REGNAME *bregs = raw_bregs;
|
const int NREGS = RAW_NREGS;
|
const int NREGS = RAW_NREGS;
|
|
|
unsigned addrdecode(const char *v) {
|
unsigned addrdecode(const char *v) {
|
if (isalpha(v[0])) {
|
if (isalpha(v[0])) {
|
for(int i=0; i<NREGS; i++)
|
for(int i=0; i<NREGS; i++)
|
if (strcasecmp(v, bregs[i].m_name)==0)
|
if (strcasecmp(v, bregs[i].m_name)==0)
|
return bregs[i].m_addr;
|
return bregs[i].m_addr;
|
fprintf(stderr, "Unknown register: %s\n", v);
|
fprintf(stderr, "Unknown register: %s\n", v);
|
exit(-2);
|
exit(-2);
|
} else
|
} else
|
return strtoul(v, NULL, 0);
|
return strtoul(v, NULL, 0);
|
}
|
}
|
|
|
const char *addrname(const unsigned v) {
|
const char *addrname(const unsigned v) {
|
for(int i=0; i<NREGS; i++)
|
for(int i=0; i<NREGS; i++)
|
if (bregs[i].m_addr == v)
|
if (bregs[i].m_addr == v)
|
return bregs[i].m_name;
|
return bregs[i].m_name;
|
return NULL;
|
return NULL;
|
}
|
}
|
|
|
|
|