about summary refs log blame commit diff stats
path: root/apps/tile/main.mu
blob: ad692f6328d83d0472c74a05faa935b6f2379095 (plain) (tree)
<
parse/0: instruction: 1
parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
parse/0: label: {
parse/0: instruction: 25
parse/0:   ingredient: {name: "+foo", value: 0, type: 0, properties: [+foo: offset]}
parse/0: label: }
brace/0: 24: push (open, 1)
brace/0: push (close, 3)
after-brace/0: recipe main
after-brace/0: copy ...
after-brace/0: jump +foo:offset
pl' href='/akkartik/mu/commit/apps/tile/main.mu?h=main&id=11d3ce71462b192dcbec3daaa4762550cbec6dfe'>11d3ce71 ^
5029dac2 ^

5029dac2 ^

11d3ce71 ^




ebb93c6d ^


11d3ce71 ^





ebb93c6d ^
11d3ce71 ^


ebb93c6d ^
11d3ce71 ^


ebb93c6d ^
11d3ce71 ^



11d3ce71 ^
6833b454 ^



11d3ce71 ^
6833b454 ^

11d3ce71 ^







40d40b83 ^
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



                                                                             


                  
                                          

                                                          
                              





                                                                       

















                                                          

                             



                                                                   



                         
                

                                


                                                        








                                                        

                           

 




                                                        


                                                            





                                                        
                               


                                     
                                                         


                                  
                                                             



                                                 
                                                                   



                                                                         
                                                              

                                                                            







                                          
 
fn main args-on-stack: (addr array addr array byte) -> exit-status/ebx: int {
  var args/eax: (addr array addr array byte) <- copy args-on-stack
  var len/ecx: int <- length args
  $main-body: {
    compare len, 2
    {
      break-if-!=
      # if single arg is 'test', run tests
      var tmp/ecx: (addr addr array byte) <- index args, 1
      var tmp2/eax: boolean <- string-equal? *tmp, "test"
      compare tmp2, 0  # false
      {
        break-if-=
        run-tests
        exit-status <- copy 0  # TODO: get at Num-test-failures somehow
        break $main-body
      }
      # if single arg is 'screen', run in full-screen mode
      tmp2 <- string-equal? *tmp, "screen"
      compare tmp2, 0  # false
      {
        break-if-=
        interactive
        exit-status <- copy 0
        break $main-body
      }
      # if single arg is 'type', run in typewriter mode
      tmp2 <- string-equal? *tmp, "type"
      compare tmp2, 0  # false
      {
        break-if-=
        repl
        exit-status <- copy 0
        break $main-body
      }
    }
    # otherwise error message
    print-string-to-real-screen "usage:\n"
    print-string-to-real-screen "  to run tests: tile test\n"
    print-string-to-real-screen "  full-screen mode: tile screen\n"
    print-string-to-real-screen "  regular REPL: tile type\n"
    exit-status <- copy 1
  }
}

fn interactive {
  enable-screen-grid-mode
  enable-keyboard-immediate-mode
  var env-storage: environment
  var env/esi: (addr environment) <- address env-storage
  initialize-environment env
  draw-screen env
  {
    var key/eax: grapheme <- read-key-from-real-keyboard
    compare key, 0x71  # 'q'
    break-if-=
    process env, key
    render env
    loop
  }
  enable-keyboard-type-mode
  enable-screen-type-mode
}

fn repl {
  enable-keyboard-immediate-mode
  var env-storage: environment
  var env/esi: (addr environment) <- address env-storage
  initialize-environment env
  var stack-storage: value-stack
  var stack/edi: (addr value-stack) <- address stack-storage
  initialize-value-stack stack, 0x10
  print-string-to-real-screen "> "
  $repl:loop: {
    var key/eax: grapheme <- read-key-from-real-keyboard
    print-grapheme-to-real-screen key
    compare key, 4  # ctrl-d
    break-if-=
    compare key, 0xa  # newline
    {
      break-if-!=
      evaluate-environment env, stack
      var empty?/eax: boolean <- value-stack-empty? stack
      {
        compare empty?, 0  # false
        break-if-!=
        var result/eax: int <- pop-int-from-value-stack stack
        print-int32-decimal-to-real-screen result
        print-string-to-real-screen "\n"
      }
      # clear line
      var program-ah/eax: (addr handle program) <- get env, program
      var program/eax: (addr program) <- lookup *program-ah
      var sandbox-ah/eax: (addr handle sandbox) <- get program, sandboxes
      var _sandbox/eax: (addr sandbox) <- lookup *sandbox-ah
      var sandbox/esi: (addr sandbox) <- copy _sandbox
      var line-ah/eax: (addr handle line) <- get sandbox, data
      var line/eax: (addr line) <- lookup *line-ah
      var cursor-word-ah/esi: (addr handle word) <- get sandbox, cursor-word
      initialize-line line, cursor-word-ah
      print-string-to-real-screen "> "
      loop $repl:loop
    }
    process env, key
    loop
  }
  enable-keyboard-type-mode
}