mu/shell
Kartik K. Agaram 8be6fe2485 bump up the token limit again
Current state of code in the Mu computer:
  (
    (globals . (
      (hline1 . (fn () (screen y lo hi color)
                  (if (>= lo hi)
                    ()
                    ((fn ()
                       (pixel screen lo y color)
                       (hline1 screen y (+ lo 1) hi color))))))
      (vline1 . (fn () (screen x lo hi color)
                  (if (>= lo hi)
                    ()
                    ((fn ()
                       (pixel screen x lo color)
                       (vline1 screen x (+ lo 1) hi color))))))
      (hline . (fn () (screen y color)
                 (hline1 screen y 0 (width screen) color)))
      (vline . (fn () (screen y color)
                 (vline1 screen y 0 (height screen) color)))
      (andf . (fn () (a b)
                (if a
                  (if b
                    1
                    ())
                  ())))
      (brline . (fn () (screen x0 y0 x1 y1 color)
                   ((fn (dx dy sx sy)
                      ((fn (err)
                         (brline1 screen x0 y0 x1 y1 dx dy sx sy err color))
                       (+ dx dy)))
                    (abs (- x1 x0))
                    (- 0 (abs (- y1 y0)))
                    (sgn (- x1 x0))
                    (sgn (- y1 y0)))))
      (brline1 . (fn () (screen x y xmax ymax dx dy sx sy err color)
                   (pixel screen x y color)
                   (if (andf (= x xmax) (= y ymax))
                     ()
                     ((fn (e2)
                        (brline1 screen
                          (if (>= e2 dy)
                            (+ x sx)
                            x)
                          (if (<= e2 dx)
                            (+ y sy)
                            y)
                          xmax
                          ymax
                          dx
                          dy
                          sx
                          sy
                          (+ err
                             (+
                               (if (>= e2 dy)
                                 dy
                                 0)
                               (if (<= e2 dx)
                                 dx
                                 0)))
                          color))
                      (* err 2)))))
      (read_line_2 . (fn () (keyboard stream)
                       ((fn (c)
                         (if (= c 10)
                           stream
                           (if (= c 0)
                             stream
                             (read_line_2 keyboard (write stream c)))))
                        (key keyboard))))
      (read_line . (fn () (keyboard)
                     (read_line_2 keyboard (stream))))
      (fill_rect . (fn () (screen x1 y1 x2 y2 fill_color)
                     (if (>= y1 y2)
                       ()
                       ((fn ()
                          (hline1 screen y1 x1 x2 fill_color)
                          (fill_rect screen x1 (+ y1 1) x2 y2 fill_color))))))
      (chessboard . (fn () (screen px)
                      (chessboard1 screen px 0 15)))
      (chessboard1 . (fn () (screen px y color)
                      (if (>= y (height screen))
                        ()
                        ((fn ()
                           (chessboard2 screen px y 0 color)
                           (chessboard1 screen px (+ y px) (- 15 color)))))))
      (chessboard2 . (fn () (screen px y x color)
                      (if (>= x (width screen))
                        ()
                        ((fn ()
                           (fill_rect screen x y (+ x px) (+ y px) color)
                           (chessboard2 screen px y (+ x px) (- 15 color)))))))
    ))
    (sandbox . (chessboard screen 8))
  )
2021-04-17 22:35:35 -07:00
..
cell.mu shell: streams that you can append graphemes to 2021-04-10 23:05:16 -07:00
evaluate.mu shell: reenable the trace 2021-04-17 22:33:28 -07:00
gap-buffer.mu add some structure to the serialization format 2021-04-15 19:56:16 -07:00
global.mu loosening a few more buffers 2021-04-17 08:29:43 -07:00
grapheme-stack.mu shell: highlight matching paren for cursor 2021-04-09 21:57:40 -07:00
main.mu load sandbox even if there are no globals 2021-04-17 19:35:02 -07:00
parse.mu parse dotted lists 2021-04-15 19:47:01 -07:00
print.mu . 2021-04-17 08:23:55 -07:00
read.mu bump up the token limit again 2021-04-17 22:35:35 -07:00
README.md . 2021-04-16 20:26:56 -07:00
sandbox.mu shell: reenable the trace 2021-04-17 22:33:28 -07:00
tokenize.mu shell: dot token 2021-04-15 08:48:53 -07:00
trace.mu shell: reenable the trace 2021-04-17 22:33:28 -07:00
vimrc.vim 7842 - new directory organization 2021-03-03 22:21:03 -08:00

A prototype shell for the Mu computer

Currently runs a tiny subset of Lisp. Steps to run it from the top-level:

  1. Build it:
$ ./translate shell/*.mu      # generates code.img
  1. Run it:
$ qemu-system-i386 code.img

or:

$ bochs -f bochsrc

To save typing in a large s-expression, create a secondary disk for data:

$ dd if=/dev/zero of=data.img count=20160

Load an s-expression into it:

$ echo '(+ 1 1)' |dd of=data.img conv=notrunc

Now run with both code and data disks:

$ qemu-system-i386 -hda code.img -hdb data.img

or:

$ bochs -f bochsrc.2disks

You can type in expressions, hit ctrl-s to see their results, and hit Tab to focus on the ... below and browse how the results were computed. Here's a demo. The bottom of the screen shows context-dependent keyboard shortcuts (there's no mouse in the Mu computer at the moment).

Known issues

  • There's no way to save to disk.

  • Don't press keys too quickly (such as by holding down a key). The Mu computer will crash (and often Qemu will segfault).