-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpmachine.h
69 lines (60 loc) · 1.39 KB
/
pmachine.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Pascal- p-machine
#ifndef __PMACHINE_H
#define __PMACHINE_H
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include "pcode.h"
typedef enum // run-time errors
{
ERR_INPUT, ERR_ZERODIV, ERR_STACK, ERR_CUSTOM
}
RT_error_t;
class pmachine_t
{
private:
pword_t* store; // memory store
pword_t s, b, p; // p-machine registers
pword_t code_top; // length of code in store & offset of stack
pword_t Drop(pword_t n = 1)
{
assert(s>=n);
s -= n;
return s;
}
pword_t Pop(pword_t *v = NULL)
{
assert(s>0);
return v ? (*v = store[s--]) : (store[s--]);
}
pword_t Push(const pword_t v)
{
assert((s+1) < STORE_SIZE);
store[++s] = v;
return s;
}
pword_t Rel(pword_t off) { return store[s+off]; }
pword_t Rel(pword_t off, pword_t v) { return store[s+off] = v; }
pword_t Abs(pword_t off) { return store[off]; }
pword_t Abs(pword_t off, pword_t v) { return store[off] = v; }
pword_t TOS() { return store[s]; }
pword_t TOS(pword_t v) { return store[s] = v; }
pword_t TOS1() { return store[s+1]; }
pword_t TOS1(pword_t v) { return store[s+1] = v; }
pword_t Chain(pword_t level); // follow activation chain
void RunTimeError(RT_error_t err, char *arg = NULL);
int ExecOp();
public:
pmachine_t()
{
store = new pword_t[STORE_SIZE];
assert(store);
s = 0;
}
~pmachine_t()
{
delete store;
}
void LoadAndGo(char *codefile);
};
#endif