virtualSoC  0.6.2
baskett
Vcsos.Komponent.Akku Class Reference

Akku des Virtualen SoCs More...

Public Member Functions

 Akku (Core pCpu)
 Konstruktor des Akkus More...
 
void MoveAX (Int32 data)
 Weist dem CPU-Register AX ein wert zu More...
 
int MoveFromAX ()
 lese die Daten aus dem Register AX More...
 
int MoveFromBX ()
 lese die Daten aus dem Register BX More...
 
int Add (int data)
 Addiere den Wert aus Parameter mit dem Register AX More...
 
int Dec (int data)
 Decriment der Daten More...
 
int Inc (int data)
 Increnent More...
 
int CmplTwo (int data)
 Berechne das 2er Kompliment More...
 
int Mul (int data)
 Multipliziere Data mit Register AX More...
 
int Mul (int a, int data)
 
int Div (int data)
 
int Div (int a, int data)
 
int Sub (int data)
 Subtration vom Register AX More...
 
int Sub (int a, int b)
 
int Add (int A, int B)
 Addition zweier Zahlen (32bit) More...
 

Detailed Description

Akku des Virtualen SoCs

Constructor & Destructor Documentation

◆ Akku()

Vcsos.Komponent.Akku.Akku ( Core  pCpu)

Konstruktor des Akkus

Parameters
pCpuDer zu verwendene CPU
41  {
42  m_pCpu = pCpu;
43  }

Member Function Documentation

◆ Add() [1/2]

int Vcsos.Komponent.Akku.Add ( int  data)

Addiere den Wert aus Parameter mit dem Register AX

Parameters
data
Returns
Die Summe der Addition
74  {
75  int result = 0;
76  int carry = (int)(m_pCpu.Register.CarryFlag ? 1 : 0);
77 
78  m_pCpu.Register.OverFlow = Add (m_pCpu.Register.ax, data, ref carry, ref result);
79  m_pCpu.Register.ax = result;
80  m_pCpu.Register.CarryFlag = carry == 1;
81  m_pCpu.Register.UnderFlow = false;
82 
83  return result;
84  }
int ax
Definition: Register.cs:89
Register Register
Definition: Core.cs:51
bool CarryFlag
Definition: Register.cs:54
bool OverFlow
Definition: Register.cs:49
bool UnderFlow
Definition: Register.cs:59
int Add(int data)
Addiere den Wert aus Parameter mit dem Register AX
Definition: Akku.cs:73

◆ Add() [2/2]

int Vcsos.Komponent.Akku.Add ( int  A,
int  B 
)

Addition zweier Zahlen (32bit)

Parameters
AErster Summand der Addition
BZweiter Summand der Addition
Returns
Ergebniss der Addition von A und B
312  {
313  int result = 0;
314  int carry = (int)(m_pCpu.Register.CarryFlag ? 1 : 0);
315 
316  m_pCpu.Register.OverFlow = Add (A, B, ref carry, ref result);
317  m_pCpu.Register.CarryFlag = carry == 1;
318  return result;
319  }
Register Register
Definition: Core.cs:51
bool CarryFlag
Definition: Register.cs:54
bool OverFlow
Definition: Register.cs:49
int Add(int data)
Addiere den Wert aus Parameter mit dem Register AX
Definition: Akku.cs:73

◆ CmplTwo()

int Vcsos.Komponent.Akku.CmplTwo ( int  data)

Berechne das 2er Kompliment

Parameters
dataDie Daten von denen das 2er Kompliment erstellt werden soll
Returns
Das 2er Kompliment
109  {
110  return ~data + 1;
111  }

◆ Dec()

int Vcsos.Komponent.Akku.Dec ( int  data)

Decriment der Daten

Parameters
dataDie zu Decrimente Zahl
Returns
Das ergebniss
91  {
92  return Add (data, -1);
93  }
int Add(int data)
Addiere den Wert aus Parameter mit dem Register AX
Definition: Akku.cs:73

◆ Div() [1/2]

int Vcsos.Komponent.Akku.Div ( int  data)

Dividiere Register AX mit data

Parameters
data
Returns
Das ergebniss der Operation
174  {
175  if (m_pCpu.Register.ax == 0) // Ist Register AX gleich 0...
176  {
177  // Setze Flag DivByZero
178  m_pCpu.Register.DivByZero = true;
179  // gebe null zurück
180  return 0;
181  }
182  // Ist data positive dann setze AkkuHelp auf true
183  m_pCpu.Register.AkkuHelp = (data > 0);
184  // weise data zu - Ist AkkuHelp true dann das 2er Kompliment sonst data
185  data = (!m_pCpu.Register.AkkuHelp) ? CmplTwo(data) : data;
186 
187  // Weise dem Register CX den Wert aus Register AX zu
188  m_pCpu.Register.cx = m_pCpu.Register.ax;
189  // Weise dem Register BX zu - Ist Register AX negative das 2er Kompliment von Register AX
190  // sonst den Wert aus Register AX
191  m_pCpu.Register.bx = (m_pCpu.Register.ax < 0) ?
192  CmplTwo(m_pCpu.Register.ax) : m_pCpu.Register.ax;
193  // Weise dem Register AX null zu
194  m_pCpu.Register.ax = 0;
195 
196  // Führe die Division als Addition durch
197  while (m_pCpu.Register.bx >= data) { // solange wie Register BX größer data ist
198  // Weise dem Register BX das Ergebniss aus der Addition von Register BX und
199  // dem 2er Kompliment von data zu
200  m_pCpu.Register.bx = Add(m_pCpu.Register.bx, ~data + 1);
201  // Weise dem Carry Flag false zu
202  m_pCpu.Register.CarryFlag = false;
203  // Addiere auf Register AX eine 1
204  Add(1);
205  }
206  // Weise dem Register AX das Ergebniss der Division zu
207  m_pCpu.Register.ax = (!m_pCpu.Register.AkkuHelp ^ !(m_pCpu.Register.cx > 0)) ? CmplTwo( m_pCpu.Register.ax)
208  : m_pCpu.Register.ax;
209 
210  // Gebe das Ergebniss aus dem Register AX zurück
211  return m_pCpu.Register.ax;
212  }
int ax
Definition: Register.cs:89
Nachfolgene Bits ist ein Adresse zu einen Register
bool DivByZero
Definition: Register.cs:64
Register Register
Definition: Core.cs:51
bool CarryFlag
Definition: Register.cs:54
int cx
Definition: Register.cs:111
int CmplTwo(int data)
Berechne das 2er Kompliment
Definition: Akku.cs:108
int bx
Definition: Register.cs:106
int Add(int data)
Addiere den Wert aus Parameter mit dem Register AX
Definition: Akku.cs:73

◆ Div() [2/2]

int Vcsos.Komponent.Akku.Div ( int  a,
int  data 
)
214  {
215  if (a == 0) // Ist a gleich 0...
216  {
217  // Setze Flag DivByZero
218  m_pCpu.Register.DivByZero = true;
219  // gebe null zurück
220  return 0;
221  }
222  // Ist data positive dann setze AkkuHelp auf true
223  m_pCpu.Register.AkkuHelp = (data > 0);
224  // weise data zu - Ist AkkuHelp true dann das 2er Kompliment sonst data
225  data = (!m_pCpu.Register.AkkuHelp) ? CmplTwo(data) : data;
226 
227  // Weise dem Register CX den Wert a zu
228  m_pCpu.Register.cx = a;
229  // Weise dem Register BX zu - Ist a negative das 2er Kompliment von a
230  // sonst a
231  m_pCpu.Register.bx = (a < 0) ?
232  CmplTwo(a) : a;
233  // Weise dem Register a null zu
234  a = 0;
235 
236  // Führe die Division als Addition durch
237  while (m_pCpu.Register.bx >= data)
238  { // solange wie Register BX größer data ist
239  // Weise dem Register BX das Ergebniss aus der Addition von Register BX und
240  // dem 2er Kompliment von data zu
241  m_pCpu.Register.bx = Add(m_pCpu.Register.bx, ~data + 1);
242  // Weise dem Carry Flag false zu
243  m_pCpu.Register.CarryFlag = false;
244  // Addiere auf a eine 1
245  Add(a, 1);
246  }
247  // gibt das Ergebniss der Division zu
248  return (!m_pCpu.Register.AkkuHelp ^ !(m_pCpu.Register.cx > 0)) ? CmplTwo(a) : a;
249  }
bool DivByZero
Definition: Register.cs:64
Register Register
Definition: Core.cs:51
bool CarryFlag
Definition: Register.cs:54
int cx
Definition: Register.cs:111
int CmplTwo(int data)
Berechne das 2er Kompliment
Definition: Akku.cs:108
int bx
Definition: Register.cs:106
int Add(int data)
Addiere den Wert aus Parameter mit dem Register AX
Definition: Akku.cs:73

◆ Inc()

int Vcsos.Komponent.Akku.Inc ( int  data)

Increnent

Parameters
datadie zu Incremierende Daten
Returns
100  {
101  return Add (data, +1);
102  }
int Add(int data)
Addiere den Wert aus Parameter mit dem Register AX
Definition: Akku.cs:73

◆ MoveAX()

void Vcsos.Komponent.Akku.MoveAX ( Int32  data)

Weist dem CPU-Register AX ein wert zu

Parameters
data
49  {
50  m_pCpu.Register.ax = data;
51  }
int ax
Definition: Register.cs:89
Register Register
Definition: Core.cs:51

◆ MoveFromAX()

int Vcsos.Komponent.Akku.MoveFromAX ( )

lese die Daten aus dem Register AX

Returns
Daten aus dem Register AX
57  {
58  return m_pCpu.Register.ax;
59  }
int ax
Definition: Register.cs:89
Register Register
Definition: Core.cs:51

◆ MoveFromBX()

int Vcsos.Komponent.Akku.MoveFromBX ( )

lese die Daten aus dem Register BX

Returns
Daten aus dem Register BX
65  {
66  return m_pCpu.Register.bx;
67  }
Register Register
Definition: Core.cs:51
int bx
Definition: Register.cs:106

◆ Mul() [1/2]

int Vcsos.Komponent.Akku.Mul ( int  data)

Multipliziere Data mit Register AX

Parameters
data
Returns
Das Ergebniss der Multiplikation
118  {
119  //AkkuHelp Flag (intern) zuweisen
120  m_pCpu.Register.AkkuHelp = (data > 0);
121  // Testen ob AkkuHelp true ist dann erstelle das 2er Kompliment von data und weise
122  // es data zu (2er Kompliment wenn data eine positive zahl enthält)
123  data = (!m_pCpu.Register.AkkuHelp) ? CmplTwo(data) : data;
124 
125  // Weise dem Register BX den Wert aus dem Register BX zu
126  m_pCpu.Register.bx = m_pCpu.Register.ax;
127 
128  // Addiere Register AX mit Register BX per Schleife (data-1)
129  for (uint i = 0; i < data -1; i++) {
130  m_pCpu.Register.ax = Add (m_pCpu.Register.bx, m_pCpu.Register.ax);
131  }
132  // Wenn Register AX kleiner als Register BX ist dann liegt ein Overflow vor
133  m_pCpu.Register.OverFlow = (m_pCpu.Register.ax < m_pCpu.Register.bx);
134  // Wenn Register AkkuHelp false ist erstelle das 2er Compliment vom Register AX
135  // und weise dies Register AX ist sonst Weise Register AX Revister AX zu
136  m_pCpu.Register.ax = (!m_pCpu.Register.AkkuHelp) ? CmplTwo( m_pCpu.Register.ax)
137  : m_pCpu.Register.ax;
138 
139  // Return das Etgebnoss der Multiplikation
140  return m_pCpu.Register.ax;
141  }
int ax
Definition: Register.cs:89
Register Register
Definition: Core.cs:51
int CmplTwo(int data)
Berechne das 2er Kompliment
Definition: Akku.cs:108
bool OverFlow
Definition: Register.cs:49
int bx
Definition: Register.cs:106
int Add(int data)
Addiere den Wert aus Parameter mit dem Register AX
Definition: Akku.cs:73

◆ Mul() [2/2]

int Vcsos.Komponent.Akku.Mul ( int  a,
int  data 
)
145  {
146  //AkkuHelp Flag (intern) zuweisen
147  m_pCpu.Register.AkkuHelp = (data > 0);
148  // Testen ob AkkuHelp true ist dann erstelle das 2er Kompliment von data und weise
149  // es data zu (2er Kompliment wenn data eine positive zahl enthält)
150  data = (!m_pCpu.Register.AkkuHelp) ? CmplTwo(data) : data;
151 
152  // Weise dem Register BX den Wert aus dem Register BX zu
153  m_pCpu.Register.bx = a;
154 
155  // Addiere Register AX mit Register BX per Schleife (data-1)
156  for (uint i = 0; i < data - 1; i++)
157  {
158  a = Add(m_pCpu.Register.bx, a);
159  }
160  // Wenn Register AX kleiner als Register BX ist dann liegt ein Overflow vor
161  m_pCpu.Register.OverFlow = (a < m_pCpu.Register.bx);
162  // Wenn Register AkkuHelp false ist erstelle das 2er Compliment vom Register AX
163  // und weise dies Register AX ist sonst Weise Register AX Revister AX zu
164  return (!m_pCpu.Register.AkkuHelp) ? CmplTwo(a)
165  : a;
166  }
Register Register
Definition: Core.cs:51
int CmplTwo(int data)
Berechne das 2er Kompliment
Definition: Akku.cs:108
bool OverFlow
Definition: Register.cs:49
int bx
Definition: Register.cs:106
int Add(int data)
Addiere den Wert aus Parameter mit dem Register AX
Definition: Akku.cs:73

◆ Sub() [1/2]

int Vcsos.Komponent.Akku.Sub ( int  data)

Subtration vom Register AX

Parameters
dataDie Zahl die von AX subrrahiert werden soll
Returns
Ergebniss der Subtration
256  {
257  int result = 0; // result : speichern des Ergebnisses
258  int carry = (int)(m_pCpu.Register.CarryFlag ? 1 : 0); // carry : carry-flag als int from bool
259 
260  // Subtraction per Zweiterkompliment und Addition
261  // benutze old carry und speichere das ergebniss in result
262  m_pCpu.Register.OverFlow = Add (m_pCpu.Register.ax, ~data + 1, ref carry, ref result);
263  // speichern des Ergebnisses der Addition in den Register AX
264  m_pCpu.Register.ax = result;
265  // speichern des Carry Flags
266  m_pCpu.Register.CarryFlag = carry == 1;
267 
268  // ist OverFlow (OF) flag gesetzt...
269  if (m_pCpu.Register.OverFlow) {
270  // Dann löscbe das Flag
271  m_pCpu.Register.OverFlow = false;
272  }
273  else
274  // Wenn nicht dann schaue ob underflow vorliegt (TODO)
275  m_pCpu.Register.UnderFlow = (result <= int.MaxValue);
276 
277  // rückgabe der variable result
278  return result;
279  }
int ax
Definition: Register.cs:89
Register Register
Definition: Core.cs:51
bool CarryFlag
Definition: Register.cs:54
bool OverFlow
Definition: Register.cs:49
bool UnderFlow
Definition: Register.cs:59
int Add(int data)
Addiere den Wert aus Parameter mit dem Register AX
Definition: Akku.cs:73

◆ Sub() [2/2]

int Vcsos.Komponent.Akku.Sub ( int  a,
int  b 
)
281  {
282  int result = 0; // result : speichern des Ergebnisses
283  int carry = (int)(m_pCpu.Register.CarryFlag ? 1 : 0); // carry : carry-flag als int from bool
284 
285  // Subtraction per Zweiterkompliment und Addition
286  // benutze old carry und speichere das ergebniss in result
287  m_pCpu.Register.OverFlow = Add(a, ~b + 1, ref carry, ref result);
288 
289  // speichern des Carry Flags
290  m_pCpu.Register.CarryFlag = carry == 1;
291 
292  // ist OverFlow (OF) flag gesetzt...
293  if (m_pCpu.Register.OverFlow)
294  {
295  // Dann löscbe das Flag
296  m_pCpu.Register.OverFlow = false;
297  }
298  else
299  // Wenn nicht dann schaue ob underflow vorliegt (TODO)
300  m_pCpu.Register.UnderFlow = (result <= int.MaxValue);
301 
302  // rückgabe der variable result
303  return result;
304  }
Register Register
Definition: Core.cs:51
bool CarryFlag
Definition: Register.cs:54
bool OverFlow
Definition: Register.cs:49
bool UnderFlow
Definition: Register.cs:59
int Add(int data)
Addiere den Wert aus Parameter mit dem Register AX
Definition: Akku.cs:73

The documentation for this class was generated from the following file: