-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdbo.OpCodes.sql
91 lines (86 loc) · 1.96 KB
/
dbo.OpCodes.sql
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
DROP TABLE IF EXISTS dbo.OpCode
CREATE TABLE dbo.OpCode
(
Code nvarchar(6) PRIMARY KEY CLUSTERED,
Generation nvarchar(200) NOT NULL
)
INSERT dbo.OpCode
SELECT N'PUSH', N'EXEC PUSH %0'
UNION ALL
SELECT N'POP', N'EXEC POP'
UNION ALL
SELECT N'PLUS', N'EXEC PLUS'
UNION ALL
SELECT N'SUB', N'EXEC SUB'
UNION ALL
SELECT N'JUMP', N'EXEC JUMP %0'
UNION ALL
SELECT N'JGZ', N'IF(@ST > 0) EXEC JUMPP %0'
UNION ALL
SELECT N'JLZ', N'IF(@ST < 0) EXEC JUMPP %0'
UNION ALL
SELECT N'JEZ', N'IF(@ST = 0) EXEC JUMPP %0'
UNION ALL
SELECT N'JNZ', N'IF(@ST <> 0) EXEC JUMPP %0'
UNION ALL
SELECT N'NEG', N'EXEC NEG'
UNION ALL
SELECT N'PUTCHR', N'EXEC PUTCHR'
UNION ALL
SELECT N'PUTINT', N'EXEC PUTINT'
UNION ALL
SELECT N'GETINT', N'EXEC GETINT'
UNION ALL
SELECT N'STR', N'EXEC STR %0'
UNION ALL
SELECT N'LOAD', N'EXEC LOAD %0'
UNION ALL
SELECT N'CALL', N'EXEC PUSH %M'
UNION ALL
SELECT N'RET', N'SET @ = @ST EXEC POP EXEC JUMP '
GO
DROP TABLE IF EXISTS dbo.Instructions
CREATE TABLE dbo.Instructions
(
Idx int PRIMARY KEY CLUSTERED IDENTITY(1,1),
Label nvarchar(8) NULL,
OpCode nvarchar(6) NOT NULL,
Arg1 nvarchar(8) NULL,
Arg2 nvarchar(8) NULL
)
IF OBJECT_ID(N'AK_Instructions_Label', N'UQ') IS NOT NULL
CREATE UNIQUE NONCLUSTERED INDEX AK_Instructions_Label ON dbo.Instructions(Label)
WHERE Label IS NOT NULL
INSERT dbo.Instructions
(
Label,
OpCode,
Arg1,
Arg2
)
SELECT Label,
Code,
Arg1,
Arg2
FROM
(
/*SELECT TOP (10) LEFT(CONVERT(nvarchar(36), NEWID()), 8), N'PUSH', N'1'
FROM sys.all_columns c1
CROSS JOIN sys.all_columns c2
UNION ALL
SELECT TOP (10) NULL, N'PLUS', NULL
FROM sys.all_columns c1
CROSS JOIN sys.all_columns c2
UNION ALL
SELECT TOP (10) NULL, N'JUMP', LEFT(CONVERT(nvarchar(36), NEWID()), 8)
FROM sys.all_columns c1
CROSS JOIN sys.all_columns c2*/
--UNION ALL
SELECT NULL, N'PUSH', N'65', NULL
UNION ALL
SELECT NULL, N'JUMP', N'END', NULL
UNION ALL
SELECT NULL, N'PUSH', N'66', NULL
UNION ALL
SELECT N'END', N'PUTCHR', NULL, NULL
) AS Ins(Label, Code, Arg1, Arg2)