-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstack.go
74 lines (65 loc) · 1.21 KB
/
stack.go
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
69
70
71
72
73
74
package main
type UxnError byte
func (ue UxnError) Error() string {
switch ue {
case ErrUnknown:
return "Error: Unknown"
case ErrUnderflow:
return "Error: Underflow"
case ErrOverflow:
return "Error: Overflow"
case ErrDivByZero:
return "Error: Divide by zero"
}
panic("Unknown error")
}
const (
ErrUnknown UxnError = iota
ErrUnderflow
ErrOverflow
ErrDivByZero
)
type Stack struct {
Data [254]byte
Error UxnError
Pointer byte
}
func (s Stack) String() string {
return HexPrint(s.Data[:s.Pointer])
}
func (s *Stack) Push8(x byte) {
if s.Pointer == 0xff {
s.Error = ErrOverflow
panic("error")
}
s.Data[s.Pointer] = x
s.Pointer++
}
func (s *Stack) Push16(x uint16) {
j := s.Pointer
if j >= 0xfe {
s.Error = ErrOverflow
panic(s.Error)
}
k := x
s.Data[j] = byte(k >> 8)
s.Data[j+1] = byte(k)
s.Pointer = j + 2
}
func (s *Stack) Pop8(srcStackPtr *byte) byte {
if *srcStackPtr == 0 {
s.Error = ErrUnderflow
panic(s.Error)
}
*srcStackPtr--
return s.Data[s.Pointer]
}
func (s *Stack) Pop16(srcStackPtr *byte) uint16 {
if *srcStackPtr <= 1 {
s.Error = ErrUnderflow
panic(s.Error)
}
o := uint16(s.Data[*srcStackPtr-1]) + uint16(s.Data[*srcStackPtr-2])<<8
*srcStackPtr -= 2
return o
}