-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmemory.s
More file actions
119 lines (109 loc) · 1.5 KB
/
memory.s
File metadata and controls
119 lines (109 loc) · 1.5 KB
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# Memory management
verb code fetch "@>"
minstk 1
mov $0x0000FFFFFFFFFFFF, ACC
and ACC, TOS
mov (TOS), TOS
jmp next
fetchb: codeword
minstk 1
movb (TOS), TOSB
and $0xFF, TOS
jmp next
verb code store ">@"
minstk 2
mov $0x0000FFFFFFFFFFFF, ACC
and ACC, TOS
mov (SP), ACC
mov ACC, (TOS)
jmp _drop2
.macro storei value:req variable
.ifnb \variable
const value
const variable
.else
const value
do SWAP
.endif
do store
.endm
storeb: codeword
minstk 2
mov (SP), ACC
movb ACCB, (TOS)
jmp _drop2
verb forth QUADCMP
2: do DUP
if 1f
do drop2
do DROP
do TRUE
endword
1: do pushret # Count
do dup2 #
do indneq #
if 0f #
do inc #
do SWAP #
do inc #
do SWAP #
do popret #
do dec
goto 2b
0: do drop2 # (Count)
do popret #
do DROP
do FALSE
endword
verb forth STRCMP
do dup2
do fetch
do SWAP
do fetch
do equal
unless 0f
do OVER
do fetch
const 8
do divmod
do SWAP
do pushret # Quotient
do DUP #
do pushret # # Remainder
do plus # #
do SWAP # #
do popret # #
do plus #
do popret #
do inc
do QUADCMP
endword
0: do drop2
do FALSE
endword
verb forth CMOVE
2: test equal 0 1f
do dec
do pushret # Count
do OVER #
do fetchb #
do OVER #
do storeb #
const 8 #
do plus #
do SWAP #
const 8 #
do plus #
do SWAP #
do popret #
goto 2
1: do DROP
do drop2
endword
verb forth STRMOVE
do OVER
do fetch
const 8
do plus
do CMOVE
endword