-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathexpander.rkt
114 lines (87 loc) · 2.01 KB
/
expander.rkt
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
#lang racket
(require (for-syntax syntax/parse))
(provide #%top #%app #%datum #%top-interaction
(rename-out [esAsm-mod-begin #%module-begin])
(all-defined-out))
;
; parse to racket
;
(define-syntax (inst stx)
(syntax-parse stx
[(_ type args ...)
#'(λ () (type args ...))]))
(define-syntax (lab-decl stx)
(syntax-parse stx
[(_ lab)
#'lab]))
;
; global data
;
(define registers (make-hash))
(define on-fire #f)
(struct jump-signal (val))
(struct halt-signal ())
;
; helpers for instructions
;
(define (reg r)
(hash-ref registers r))
(define (num n) n)
(define (reg-set! r v)
(hash-set! registers r v))
(define (jump-to lab)
(raise (jump-signal lab)))
;
; instructions
;
(define (SHN val)
(displayln val))
(define (SHA val)
(displayln (integer->char val)))
(define (MOV reg val)
(reg-set! reg val))
(define (ADD reg v1 v2)
(reg-set! reg (+ v1 v2)))
(define (SUB reg v1 v2)
(reg-set! reg (- v1 v2)))
(define (JMP lab)
(jump-to lab))
(define (JLT lab v1 v2)
(when (v1 . < . v2)
(jump-to lab)))
(define (JGT lab v1 v2)
(when (v1 . > . v2)
(jump-to lab)))
(define (JET lab v1 v2)
(when (= v1 v2)
(jump-to lab)))
(define (INP reg)
(reg-set! reg (read)))
(define (HLT)
(raise (halt-signal)))
(define (MFICOFSR reg)
(if on-fire
(reg-set! reg 1)
(reg-set! reg 0)))
(define (run lines)
(define jumping-to #f)
(with-handlers
([halt-signal? void])
(for ([line (in-cycle lines)])
(with-handlers
([jump-signal?
(λ (js)
(set! jumping-to
(jump-signal-val js)))])
(if (string? line)
(when (equal? jumping-to line)
(set! jumping-to #f))
(unless jumping-to
(line)))))))
(define-syntax (esAsm-mod-begin stx)
(syntax-parse stx
[(esAsm-mod-begin (program LINE ...))
#'(#%module-begin
(for ([r (in-range 12)])
(hash-set! registers r 0))
(run (list LINE ...)))]))