Next: Hook functions, Previous: Additional functions, Up: Using mixguile
Scheme is a powerful language, and you can use it inside mixguile
to easily extend the MIX interpreter's capabilities. For example, you
can easily define a function that loads a file, prints its name,
executes it and, finally, shows the registers contents, all in one shot:
guile> (define my-load-and-run <RET>
(lambda (file) <RET>
(mix-load file) <RET>
(display "File loaded: ") <RET>
(mix-pprog) <RET>
(mix-run) <RET>
(mix-preg))) <RET>
guile>
and use it to run your programs:
guile> (my-load-and-run "hello")
Program loaded. Start address: 3000
File loaded: hello.mix
Running ...
MIXAL HELLO WORLD
... done
Elapsed time: 11 /Total program time: 11 (Total uptime: 33)
rA: + 00 00 00 00 00 (0000000000)
rX: + 00 00 00 00 00 (0000000000)
rJ: + 00 00 (0000)
rI1: + 00 00 (0000) rI2: + 00 00 (0000)
rI3: + 00 00 (0000) rI4: + 00 00 (0000)
rI5: + 00 00 (0000) rI6: + 00 00 (0000)
guile>
Or, maybe, you want a function which sets a breakpoint at a specified line number before executing it:
guile> (define my-load-and-run-with-bp
(lambda (file line)
(mix-load file)
(mix-sbp line)
(mix-run)))
guile> (my-load-and-run-with-bp "samples/primes" 10)
Program loaded. Start address: 3000
Breakpoint set at line 10
Running ...
... stopped: breakpoint at line 10 (address 3001)
Elapsed time: 1 /Total program time: 1 (Total uptime: 45)
guile>
As a third example, the following function loads a program, runs it and prints the contents of the memory between the program's start and end addresses:
guile> (define my-run
(lambda (file)
(mix-load file)
(let ((start (mix-loc)))
(mix-run)
(mix-pmem start (mix-loc)))))
guile> (my-run "hello")
Program loaded. Start address: 3000
Running ...
MIXAL HELLO WORLD
... done
Elapsed time: 11 /Total program time: 11 (Total uptime: 11)
3000: + 46 58 00 19 37 (0786957541)
3001: + 00 00 00 02 05 (0000000133)
3002: + 14 09 27 01 13 (0237350989)
guile>
As you can see, the possibilities are virtually unlimited. Of course,
you don't need to type a function definition each time you start
mixguile. You can write it in a file, and load it using Scheme's
load function. For instance, you can create a file named, say,
functions.scm with your definitions (or any Scheme expression)
and load it at the mixguile prompt:
guile> (load "functions.scm")
Alternatively, you can make mixguile to load it for you. When
mixguile starts, it looks for a file named mixguile.scm in
your MDK configuration directory (~/.mdk) and, if it exists,
loads it before entering the REPL. Therefore, you can copy your
definitions in that file, or load the functions.scm file in
mixguile.scm.