1
0
mirror of https://github.com/livingcomputermuseum/UniBone.git synced 2026-05-01 13:57:19 +00:00

Big summer rework:

Interrupt and DMA system now handles multiple levels and multiple devices in parallel
Interrupt Register changes synced with INTR transaction
DL11 and KW11 clock pass the ZDLDI0 diagnostic.
Devices can now be enabled and disabled individually.
This commit is contained in:
Joerg Hoppe
2019-08-02 16:45:54 +02:00
parent 471df2d8ea
commit 974aeed8eb
89 changed files with 4350 additions and 3085 deletions

View File

@@ -32,9 +32,8 @@
#include "device.hpp"
#define _PARAMETER_CPP_
parameter_c::parameter_c(parameterized_c *parameterized, string name, string shortname,
bool readonly, string unit, string format, string info) {
bool readonly, string unit, string format, string info) {
this->parameterized = parameterized;
this->name = name;
this->shortname = shortname;
@@ -53,8 +52,7 @@ parameter_c::~parameter_c() {
// to be implemented in subclass
void parameter_c::parse(string text) {
throw bad_parameter_parse(
"parameter_c::parse(" + text + ") to be implemented in subclass");
throw bad_parameter_parse("parameter_c::parse(" + text + ") to be implemented in subclass");
}
// convert to text
@@ -74,21 +72,20 @@ parameter_string_c::~parameter_string_c() {
}
void parameter_string_c::set(string new_value) {
if (value == new_value)
return ; // call "on_change" only on change
this->new_value = new_value ;
return; // call "on_change" only on change
this->new_value = new_value;
// reject parsed value, if device parameter check complains
if (parameterized == NULL || parameterized->on_param_changed(this))
value = new_value;
}
// string parsing is just copying
void parameter_string_c::parse(string text) {
if (readonly)
throw bad_parameter_readonly("Parameter \"" + name + "\" is read-only");
set(text) ;
set(text);
}
string *parameter_string_c::render() {
@@ -96,20 +93,19 @@ string *parameter_string_c::render() {
return &printbuffer;
}
parameter_bool_c::parameter_bool_c(parameterized_c *parameterized, string name, string shortname,
parameter_bool_c::parameter_bool_c(parameterized_c *parameterized, string name,
string shortname,
bool readonly, string info) :
parameter_c(parameterized, name, shortname, readonly, "", "", info) {
value = false;
}
void parameter_bool_c::set(bool new_value) {
if (value == new_value)
return ; // call "on_change" only on change
return; // call "on_change" only on change
// reject parsed value, if device parameter check complains
this->new_value = new_value ;
this->new_value = new_value;
if (parameterized == NULL || parameterized->on_param_changed(this))
value = new_value;
}
@@ -130,7 +126,7 @@ void parameter_bool_c::parse(string text) {
new_value = false;
else
throw bad_parameter_parse("Illegal boolean expression \"" + text + "\"");
set(new_value) ;
set(new_value);
}
string *parameter_bool_c::render() {
@@ -150,12 +146,11 @@ parameter_unsigned_c::parameter_unsigned_c(parameterized_c *parameterized, strin
value = 0;
}
void parameter_unsigned_c::set(unsigned new_value) {
if (value == new_value)
return ; // call "on_change" only on change
this->new_value = new_value ;
return; // call "on_change" only on change
this->new_value = new_value;
// reject parsed value, if device parameter check complains
if (parameterized == NULL || parameterized->on_param_changed(this))
value = new_value;
@@ -168,12 +163,11 @@ void parameter_unsigned_c::parse(string text) {
TRIM_STRING(text);
new_value = strtol(text.c_str(), &endptr, base);
if (*endptr)
throw bad_parameter_parse(
"Format error in \"" + text + "\" at \"" + *endptr + "\"");
throw bad_parameter_parse("Format error in \"" + text + "\" at \"" + *endptr + "\"");
if (new_value & ~BitmaskFromLen32[bitwidth]) //
throw bad_parameter_parse(
"Number " + to_string(new_value) + " exceeds bitwidth " + to_string(bitwidth));
set(new_value) ;
set(new_value);
}
string *parameter_unsigned_c::render() {
@@ -194,9 +188,9 @@ parameter_unsigned64_c::parameter_unsigned64_c(parameterized_c *parameterized, s
void parameter_unsigned64_c::set(uint64_t new_value) {
if (value == new_value)
return ; // call "on_change" only on change
this->new_value = new_value ;
return; // call "on_change" only on change
this->new_value = new_value;
// reject parsed value, if device parameter check complains
if (parameterized == NULL || parameterized->on_param_changed(this))
value = new_value;
@@ -209,12 +203,11 @@ void parameter_unsigned64_c::parse(string text) {
TRIM_STRING(text);
new_value = strtoll(text.c_str(), &endptr, base);
if (*endptr)
throw bad_parameter_parse(
"Format error in \"" + text + "\" at \"" + *endptr + "\"");
throw bad_parameter_parse("Format error in \"" + text + "\" at \"" + *endptr + "\"");
if (new_value & ~BitmaskFromLen64[bitwidth]) //
throw bad_parameter_parse(
"Number " + to_string(new_value) + " exceeds bitwidth " + to_string(bitwidth));
set(new_value) ;
set(new_value);
}
string *parameter_unsigned64_c::render() {
@@ -224,7 +217,6 @@ string *parameter_unsigned64_c::render() {
return &printbuffer;
}
// add reference to parameter. It will be automatically deleted
parameter_c *parameterized_c::param_add(parameter_c *param) {
parameter.push_back(param);
@@ -247,4 +239,3 @@ parameter_c *parameterized_c::param_by_name(string name) {
return NULL;
}