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.