aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuanma Barranquero2003-06-16 21:33:54 +0000
committerJuanma Barranquero2003-06-16 21:33:54 +0000
commit0a2d0bd4dbf5fad1c0c6f09c4e815001e9f303d2 (patch)
treeee477005332167855e7c54fc8e157cc81e33a1b9
parent259be4e69d4c412a8287c9842c214ed85ebd4631 (diff)
downloademacs-0a2d0bd4dbf5fad1c0c6f09c4e815001e9f303d2.tar.gz
emacs-0a2d0bd4dbf5fad1c0c6f09c4e815001e9f303d2.zip
New file.
-rw-r--r--lisp/ChangeLog9
-rw-r--r--lisp/progmodes/mixal-mode.el1313
2 files changed, 1322 insertions, 0 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 687a0e326a8..732aada7c3b 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,12 @@
12003-06-16 Pieter E.J. Pareit <pieter.pareit@skynet.be>
2
3 * progmodes/mixal-mode.el: New file.
4
52003-06-16 Markus Rost <rost@math.ohio-state.edu>
6
7 * files.el (recover-session-finish): Don't give up when there are
8 two consecutive empty lines in the auto-save-list file.
9
12003-06-14 Stefan Monnier <monnier@cs.yale.edu> 102003-06-14 Stefan Monnier <monnier@cs.yale.edu>
2 11
3 * emacs-lisp/copyright.el (copyright-update-year): New function 12 * emacs-lisp/copyright.el (copyright-update-year): New function
diff --git a/lisp/progmodes/mixal-mode.el b/lisp/progmodes/mixal-mode.el
new file mode 100644
index 00000000000..5a1f7e2e80d
--- /dev/null
+++ b/lisp/progmodes/mixal-mode.el
@@ -0,0 +1,1313 @@
1;;; mixal-mode.el --- Major mode for the mix asm language.
2
3;; Copyright (C) 2003 Free Software Foundation
4
5;; This program is free software; you can redistribute it and/or
6;; modify it under the terms of the GNU General Public License as
7;; published by the Free Software Foundation; either version 2 of
8;; the License, or (at your option) any later version.
9
10;; This program is distributed in the hope that it will be
11;; useful, but WITHOUT ANY WARRANTY; without even the implied
12;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13;; PURPOSE. See the GNU General Public License for more details.
14
15;; You should have received a copy of the GNU General Public
16;; License along with this program; if not, write to the Free
17;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
18;; MA 02111-1307 USA
19
20;; Author: Pieter E.J. Pareit <pieter.pareit@skynet.be>
21;; Maintainer: Pieter E.J. Pareit <pieter.pareit@skynet.be>
22;; Created: 09 Nov 2002
23;; Version: 0.1
24;; Keywords: Knuth mix mixal asm mixvm "The Art Of Computer Programming"
25
26;;; Commentary:
27;; Major mode for the mix asm language.
28;; The mix asm language is described in "The Art Of Computer Programming".
29;;
30;; For optimal use, also use GNU MDK. Compiling needs mixasm, running
31;; and debugging needs mixvm and mixvm.el from GNU MDK. You can get
32;; GNU MDK from `https://savannah.gnu.org/projects/mdk/' and
33;; `ftp://ftp.gnu.org/pub/gnu/mdk'.
34;;
35;; To use this mode, place the following in your .emacs file:
36;; `(load-file "/PATH-TO-FILE/mixal-mode.el")'.
37;; When you load a file with the extension .mixal the mode will be started
38;; automatic. If you want to start the mode manual, use `M-x mixal-mode'.
39;; Font locking will work, the behavior of tabs is the same as emacs
40;; default behavior. You can compile a source file with `C-c c' you can
41;; run a compiled file with `C-c r' or run it in debug mode with `C-c d'.
42;; You can get more information about a particular operation code by using
43;; mixal-describe-operation-code or `C-h o'.
44;;
45;; Have fun.
46
47;;; History:
48;; Version 0.1:
49;; Version 0.1.1:
50;; 22/11/02: bugfix in fontlocking, needed to add a '-' to the regex.
51;; 19/11/02: completed implementing mixal-describe-operation-code.
52;; 13/11/02: implemented compile, mixal-run and mixal-debug.
53;; 10/11/02: implemented font-locking and syntax table.
54;; 09/11/02: started mixal-mode.
55
56;;; Code:
57
58;;; Key map
59(defvar mixal-mode-map
60 (let ((map (make-sparse-keymap)))
61 (define-key map "\C-cc" 'compile)
62 (define-key map "\C-cr" 'mixal-run)
63 (define-key map "\C-cd" 'mixal-debug)
64 (define-key map "\C-ho" 'mixal-describe-operation-code)
65 map)
66 "Keymap for `mixal-mode'.")
67; (makunbound 'mixal-mode-map)
68
69;;; Syntax table
70(defvar mixal-mode-syntax-table
71 (let ((st (make-syntax-table)))
72 (modify-syntax-entry ?* "<" st)
73 (modify-syntax-entry ?\n ">" st)
74 st)
75 "Syntax table for `dot-mode'.")
76
77(defvar mixal-font-lock-label-face 'font-lock-variable-name-face
78 "Face name to use for label names.
79Default value is that of `font-lock-variable-name-face', but you can modify
80its value.")
81
82(defvar mixal-font-lock-operation-code-face 'font-lock-keyword-face
83 "Face name to use for operation code names.
84Default value is that of `font-lock-keyword-face', but you can modify its
85value.")
86
87(defvar mixal-font-lock-assembly-pseudoinstruction-face 'font-lock-builtin-face
88 "Face name to use for assembly pseudoinstruction names.
89Default value is that of `font-lock-builtin-face', but you can modify its
90value.")
91
92(defvar mixal-operation-codes
93 '("NOP" "ADD" "FADD" "SUB" "FSUB" "MUL" "FMUL" "DIV" "FDIV" "NUM" "CHAR"
94 "HLT" "SLA" "SRA" "SLAX" "SRAX" "SLC" "SRC" "MOVE" "LDA" "LD1" "LD2" "LD3"
95 "LD4" "LD5" "LD6" "LDX" "LDAN" "LD1N" "LD2N" "LD3N" "LD4N" "LD5N" "LD6N"
96 "LDXN" "STA" "ST1" "ST2" "ST3" "ST4" "ST5" "ST6" "STX" "STJ" "STZ" "JBUS"
97 "IOC" "IN" "OUT" "JRAD" "JMP" "JSJ" "JOV" "JNOV"
98 "JAN" "J1N" "J2N" "J3N" "J4N" "J5N" "J6N" "JXN"
99 "JAZ" "J1Z" "J2Z" "J3Z" "J4Z" "J5Z" "J6Z" "JXZ"
100 "JAP" "J1P" "J2P" "J3P" "J4P" "J5P" "J6P" "JXP"
101 "JANN" "J1NN" "J2NN" "J3NN" "J4NN" "J5NN" "J6NN" "JXNN"
102 "JANZ" "J1NZ" "J2NZ" "J3NZ" "J4NZ" "J5NZ" "J6NZ" "JXNZ"
103 "JANP" "J1NP" "J2NP" "J3NP" "J4NP" "J5NP" "J6NP" "JXNP"
104 "INCA" "DECA" "ENTA" "ENNA" "INC1" "DEC1" "ENT1" "ENN1"
105 "INC2" "DEC2" "ENT2" "ENN2" "INC3" "DEC3" "ENT3" "ENN3" "INC4" "DEC4"
106 "ENT4" "ENN4" "INC5" "DEC5" "ENT5" "ENN5" "INC6" "DEC6" "ENT6" "ENN6"
107 "INCX" "DECX" "ENTX" "ENNX" "CMPA" "FCMP" "CMP1" "CMP2" "CMP3" "CMP4"
108 "CMP5" "CMP6" "CMPX")
109 "List of possible operation codes as strings.")
110; (makunbound 'mixal-operation-codes)
111
112(defvar mixal-assembly-pseudoinstructions
113 '("ORIG" "EQU" "CON" "ALF" "END")
114 "List of possible assembly pseudoinstructions")
115
116;;; Font-locking:
117(defvar mixal-font-lock-keywords
118 `(("^\\([A-Z0-9a-z]+\\).*$"
119 (1 mixal-font-lock-label-face))
120 (,(regexp-opt mixal-operation-codes 'words)
121 . mixal-font-lock-operation-code-face)
122 (,(regexp-opt
123 mixal-assembly-pseudoinstructions 'words)
124 . mixal-font-lock-assembly-pseudoinstruction-face)
125 ("^[A-Z0-9a-z]*[ \t]+[A-Z0-9a-z]+[ \t]+[\\-A-Z0-9a-z,():]*[\t]+\\(.*\\)$"
126 (1 font-lock-comment-face)))
127 "Keyword highlighting specification for `mixal-mode'.")
128; (makunbound 'mixal-font-lock-keywords)
129
130;;;; Compilation
131;; Output from mixasm is compatible with default behavior of emacs,
132;; I just added a key (C-cc) and modified the make-command.
133
134;;;; Indentation
135;; Tabs works well by default.
136
137;;;; Describe
138(defvar mixal-operation-codes-alist '()
139 "Alist that contains all the possible operation codes for mix.
140Each elt has the form (OP-CODE GROUP FULL-NAME C-BYTE F-BYTE DESCRIPTION EXECUTION-TIME)
141Where OP-CODE is the text of the opcode as an symbol, FULL-NAME is the human readable name
142as a string, C-BYTE is the operation code telling what operation is to be performed, F-BYTE holds
143an modification of the operation code which can be a symbol or a number, DESCRIPTION contains
144an string with a description about the operation code and EXECUTION-TIME holds info
145about the time it takes, number or string.")
146; (makunbound 'mixal-operation-codes-alist)
147
148(defun mixal-add-operation-code (op-code group full-name C-byte F-byte description execution-time)
149 "Add an operation code to the list that contains information about possible op code's."
150 (setq mixal-operation-codes-alist (cons (list op-code group full-name C-byte F-byte
151 description execution-time)
152 mixal-operation-codes-alist )))
153
154;; now add each operation code
155
156(mixal-add-operation-code
157 'LDA 'loading "load A" 8 'field
158 "Put in rA the contents of cell no. M.
159Uses a + when there is no sign in subfield. Subfield is left padded with
160zeros to make a word."
161 2)
162
163(mixal-add-operation-code
164 'LDX 'loading "load X" 15 'field
165 "Put in rX the contents of cell no. M.
166Uses a + when there is no sign in subfield. Subfield is left padded with
167zeros to make a word."
168 2)
169
170(mixal-add-operation-code
171 'LD1 'loading "load I1" (+ 8 1) 'field
172 "Put in rI1 the contents of cell no. M.
173Uses a + when there is no sign in subfield. Subfield is left padded with
174zeros to make a word. Index registers only have 2 bytes and a sign, Trying
175to set anything more that that will result in undefined behavior."
176 2)
177
178(mixal-add-operation-code
179 'LD2 'loading "load I2" (+ 8 2) 'field
180 "Put in rI2 the contents of cell no. M.
181Uses a + when there is no sign in subfield. Subfield is left padded with
182zeros to make a word. Index registers only have 2 bytes and a sign, Trying
183to set anything more that that will result in undefined behavior."
184 2)
185
186(mixal-add-operation-code
187 'LD3 'loading "load I3" (+ 8 3) 'field
188 "Put in rI3 the contents of cell no. M.
189Uses a + when there is no sign in subfield. Subfield is left padded with
190zeros to make a word. Index registers only have 2 bytes and a sign, Trying
191to set anything more that that will result in undefined behavior."
192 2)
193
194(mixal-add-operation-code
195 'LD4 'loading "load I4" (+ 8 4) 'field
196 "Put in rI4 the contents of cell no. M.
197Uses a + when there is no sign in subfield. Subfield is left padded with
198zeros to make a word. Index registers only have 2 bytes and a sign, Trying
199to set anything more that that will result in undefined behavior."
200 2)
201
202(mixal-add-operation-code
203 'LD5 'loading "load I5" (+ 8 5) 'field
204 "Put in rI5 the contents of cell no. M.
205Uses a + when there is no sign in subfield. Subfield is left padded with
206zeros to make a word. Index registers only have 2 bytes and a sign, Trying
207to set anything more that that will result in undefined behavior."
208 2)
209
210(mixal-add-operation-code
211 'LD6 'loading "load I6" (+ 8 6) 'field
212 "Put in rI6 the contents of cell no. M.
213Uses a + when there is no sign in subfield. Subfield is left padded with
214zeros to make a word. Index registers only have 2 bytes and a sign, Trying
215to set anything more that that will result in undefined behavior."
216 2)
217
218(mixal-add-operation-code
219 'LDAN 'loading "load A negative" 16 'field
220 "Put in rA the contents of cell no. M, with opposite sign.
221Uses a + when there is no sign in subfield, otherwise use the opposite sign.
222Subfield is left padded with zeros to make a word."
223 2)
224
225(mixal-add-operation-code
226 'LDXN 'loading "load X negative" 23 'field
227 "Put in rX the contents of cell no. M, with opposite sign.
228Uses a + when there is no sign in subfield, otherwise use the opposite sign.
229Subfield is left padded with zeros to make a word."
230 2)
231
232(mixal-add-operation-code
233 'LD1N 'loading "load I1 negative" (+ 16 1) 'field
234 "Put in rI1 the contents of cell no. M, with opposite sign.
235Uses a + when there is no sign in subfield, otherwise use the opposite sign.
236Subfield is left padded with zeros to make a word. Index registers only
237have 2 bytes and a sign, Trying to set anything more that that will result
238in undefined behavior."
239 2)
240
241(mixal-add-operation-code
242 'LD2N 'loading "load I2 negative" (+ 16 2) 'field
243 "Put in rI2 the contents of cell no. M, with opposite sign.
244Uses a + when there is no sign in subfield, otherwise use the opposite sign.
245Subfield is left padded with zeros to make a word. Index registers only
246have 2 bytes and a sign, Trying to set anything more that that will result
247in undefined behavior."
248 2)
249
250(mixal-add-operation-code
251 'LD3N 'loading "load I3 negative" (+ 16 3) 'field
252 "Put in rI3 the contents of cell no. M, with opposite sign.
253Uses a + when there is no sign in subfield, otherwise use the opposite sign.
254Subfield is left padded with zeros to make a word. Index registers only
255have 2 bytes and a sign, Trying to set anything more that that will result
256in undefined behavior."
257 2)
258
259(mixal-add-operation-code
260 'LD4N 'loading "load I4 negative" (+ 16 4) 'field
261 "Put in rI4 the contents of cell no. M, with opposite sign.
262Uses a + when there is no sign in subfield, otherwise use the opposite sign.
263Subfield is left padded with zeros to make a word. Index registers only
264have 2 bytes and a sign, Trying to set anything more that that will result
265in undefined behavior."
266 2)
267
268(mixal-add-operation-code
269 'LD5N 'loading "load I5 negative" (+ 16 5) 'field
270 "Put in rI5 the contents of cell no. M, with opposite sign.
271Uses a + when there is no sign in subfield, otherwise use the opposite sign.
272Subfield is left padded with zeros to make a word. Index registers only
273have 2 bytes and a sign, Trying to set anything more that that will result
274in undefined behavior."
275 2)
276
277(mixal-add-operation-code
278 'LD6N 'loading "load I6 negative" (+ 16 6) 'field
279 "Put in rI6 the contents of cell no. M, with opposite sign.
280Uses a + when there is no sign in subfield, otherwise use the opposite sign.
281Subfield is left padded with zeros to make a word. Index registers only
282have 2 bytes and a sign, Trying to set anything more that that will result
283in undefined behavior."
284 2)
285
286(mixal-add-operation-code
287 'STA 'storing "store A" 24 'field
288 "Store in cell Nr. M the contents of rA.
289The modification of the operation code represents the subfield of the
290memory cell that is to be overwritten with bytes from a register. These
291bytes are taken beginning by the rightmost side of the register. The
292sign of the memory cell is not changed, unless it is part of the subfield."
293 2)
294
295(mixal-add-operation-code
296 'STX 'storing "store X" 31 'field
297 "Store in cell Nr. M the contents of rX.
298The modification of the operation code represents the subfield of the
299memory cell that is to be overwritten with bytes from a register. These
300bytes are taken beginning by the rightmost side of the register. The
301sign of the memory cell is not changed, unless it is part of the subfield."
302 2)
303
304(mixal-add-operation-code
305 'ST1 'storing "store I1" (+ 24 1) 'field
306 "Store in cell Nr. M the contents of rI1.
307The modification of the operation code represents the subfield of the
308memory cell that is to be overwritten with bytes from a register. These
309bytes are taken beginning by the rightmost side of the register. The
310sign of the memory cell is not changed, unless it is part of the subfield.
311Because index registers only have 2 bytes and a sign, the rest of the bytes
312are assumed to be 0."
313 2)
314
315(mixal-add-operation-code
316 'ST2 'storing "store I2" (+ 24 2) 'field
317 "Store in cell Nr. M the contents of rI2.
318The modification of the operation code represents the subfield of the
319memory cell that is to be overwritten with bytes from a register. These
320bytes are taken beginning by the rightmost side of the register. The
321sign of the memory cell is not changed, unless it is part of the subfield.
322Because index registers only have 2 bytes and a sign, the rest of the bytes
323are assumed to be 0."
324 2)
325
326(mixal-add-operation-code
327 'ST3 'storing "store I3" (+ 24 3) 'field
328 "Store in cell Nr. M the contents of rI3.
329The modification of the operation code represents the subfield of the
330memory cell that is to be overwritten with bytes from a register. These
331bytes are taken beginning by the rightmost side of the register. The
332sign of the memory cell is not changed, unless it is part of the subfield.
333Because index registers only have 2 bytes and a sign, the rest of the bytes
334are assumed to be 0."
335 2)
336
337(mixal-add-operation-code
338 'ST4 'storing "store I4" (+ 24 4) 'field
339 "Store in cell Nr. M the contents of rI4.
340The modification of the operation code represents the subfield of the
341memory cell that is to be overwritten with bytes from a register. These
342bytes are taken beginning by the rightmost side of the register. The
343sign of the memory cell is not changed, unless it is part of the subfield.
344Because index registers only have 2 bytes and a sign, the rest of the bytes
345are assumed to be 0."
346 2)
347
348(mixal-add-operation-code
349 'ST5 'storing "store I5" (+ 24 5) 'field
350 "Store in cell Nr. M the contents of rI5.
351The modification of the operation code represents the subfield of the
352memory cell that is to be overwritten with bytes from a register. These
353bytes are taken beginning by the rightmost side of the register. The
354sign of the memory cell is not changed, unless it is part of the subfield.
355Because index registers only have 2 bytes and a sign, the rest of the bytes
356are assumed to be 0."
357 2)
358
359(mixal-add-operation-code
360 'ST6 'storing "store I6" (+ 24 6) 'field
361 "Store in cell Nr. M the contents of rI6.
362The modification of the operation code represents the subfield of the
363memory cell that is to be overwritten with bytes from a register. These
364bytes are taken beginning by the rightmost side of the register. The
365sign of the memory cell is not changed, unless it is part of the subfield.
366Because index registers only have 2 bytes and a sign, the rest of the bytes
367are assumed to be 0."
368 2)
369
370(mixal-add-operation-code
371 'STJ 'storing "store J" 32 'field
372 "Store in cell Nr. M the contents of rJ.
373The modification of the operation code represents the subfield of the
374memory cell that is to be overwritten with bytes from a register. These
375bytes are taken beginning by the rightmost side of the register. The sign
376of rJ is always +, sign of the memory cell is not changed, unless it is
377part of the subfield. The default field for STJ is (0:2)."
378 2)
379
380(mixal-add-operation-code
381 'STZ 'storing "store zero" 33 'field
382 "Store in cell Nr. M '+ 0'.
383The modification of the operation code represents the subfield of the
384memory cell that is to be overwritten with zeros."
385 2)
386
387(mixal-add-operation-code
388 'ADD 'arithmetic "add" 1 'field
389 "Add to A the contents of cell Nr. M.
390Subfield is padded with zero to make a word.
391If the result is to large, the operation result modulo 1,073,741,823 (the
392maximum value storable in a MIX word) is stored in `rA', and the overflow
393toggle is set to TRUE."
394 2)
395
396(mixal-add-operation-code
397 'SUB 'arithmetic "subtract" 2 'field
398 "Subtract to A the contents of cell Nr. M.
399Subfield is padded with zero to make a word.
400If the result is to large, the operation result modulo 1,073,741,823 (the
401maximum value storable in a MIX word) is stored in `rA', and the overflow
402toggle is set to TRUE."
403 2)
404
405(mixal-add-operation-code
406 'MUL 'arithmetic "multiply" 3 'field
407 "Multiplies the contents of cell Nr. M with A, result is 10 bytes and stored in rA and rX.
408The sign is + if the sign of rA and cell M where the same, otherwise, it is -"
409 10)
410
411(mixal-add-operation-code
412 'DIV 'arithmetic "divide" 4 'field
413 "Both rA and rX are taken together and divided by cell Nr. M, quotient is placed in rA, remainder in rX.
414The sign is taken from rA, and after the divide the sign of rA is set to + when
415both the sign of rA and M where the same. Divide by zero and overflow of rA result
416in undefined behavior."
417 12)
418
419(mixal-add-operation-code
420 'ENTA 'address-transfer "enter A" 48 2
421 "Literal value is stored in rA.
422Indexed, stores value of index in rA."
423 1)
424
425(mixal-add-operation-code
426 'ENTX 'address-transfer "enter X" 55 2
427 "Literal value is stored in rX.
428Indexed, stores value of index in rX."
429 1)
430
431(mixal-add-operation-code
432 'ENT1 'address-transfer "Enter rI1" (+ 48 1) 2
433 "Literal value is stored in rI1.
434Indexed, stores value of index in rI1."
435 1)
436
437(mixal-add-operation-code
438 'ENT2 'address-transfer "Enter rI2" (+ 48 2) 2
439 "Literal value is stored in rI2.
440Indexed, stores value of index in rI2."
441 1)
442
443(mixal-add-operation-code
444 'ENT3 'address-transfer "Enter rI3" (+ 48 3) 2
445 "Literal value is stored in rI3.
446Indexed, stores value of index in rI3."
447 1)
448
449(mixal-add-operation-code
450 'ENT4 'address-transfer "Enter rI4" (+ 48 4) 2
451 "Literal value is stored in rI4.
452Indexed, stores value of index in rI4."
453 1)
454
455(mixal-add-operation-code
456 'ENT5 'address-transfer "Enter rI5" (+ 48 5) 2
457 "Literal value is stored in rI5.
458Indexed, stores value of index in rI5."
459 1)
460
461(mixal-add-operation-code
462 'ENT6 'address-transfer "Enter rI6" (+ 48 6) 2
463 "Literal value is stored in rI6.
464Indexed, stores value of index in rI6."
465 1)
466
467(mixal-add-operation-code
468 'ENNA 'address-transfer "enter negative A" 48 3
469 "Literal value is stored in rA with opposite sign.
470Indexed, stores value of index in rA with opposite sign."
471 1)
472
473(mixal-add-operation-code
474 'ENNX 'address-transfer "enter negative X" 55 3
475 "Literal value is stored in rX with opposite sign.
476Indexed, stores value of index in rX with opposite sign."
477 1)
478
479(mixal-add-operation-code
480 'ENN1 'address-transfer "Enter negative rI1" (+ 48 1) 3
481 "Literal value is stored in rI1 with opposite sign.
482Indexed, stores value of index in rI1 with opposite sign."
483 1)
484
485(mixal-add-operation-code
486 'ENN2 'address-transfer "Enter negative rI2" (+ 48 2) 3
487 "Literal value is stored in rI2 with opposite sign.
488Indexed, stores value of index in rI2 with opposite sign."
489 1)
490
491(mixal-add-operation-code
492 'ENN3 'address-transfer "Enter negative rI3" (+ 48 3) 3
493 "Literal value is stored in rI3 with opposite sign.
494Indexed, stores value of index in rI3 with opposite sign."
495 1)
496
497(mixal-add-operation-code
498 'ENN4 'address-transfer "Enter negative rI4" (+ 48 4) 3
499 "Literal value is stored in rI4 with opposite sign.
500Indexed, stores value of index in rI4 with opposite sign."
501 1)
502
503(mixal-add-operation-code
504 'ENN5 'address-transfer "Enter negative rI5" (+ 48 5) 3
505 "Literal value is stored in rI5 with opposite sign.
506Indexed, stores value of index in rI5 with opposite sign."
507 1)
508
509(mixal-add-operation-code
510 'ENN6 'address-transfer "Enter negative rI6" (+ 48 6) 3
511 "Literal value is stored in rI6 with opposite sign.
512Indexed, stores value of index in rI6 with opposite sign."
513 1)
514
515(mixal-add-operation-code
516 'INCA 'address-transfer "increase A" 48 0
517 "Increase register A with the literal value of M.
518On overflow the overflow toggle is set."
519 1)
520
521(mixal-add-operation-code
522 'INCX 'address-transfer "increase X" 55 0
523 "Increase register X with the literal value of M.
524On overflow the overflow toggle is set."
525 1)
526
527(mixal-add-operation-code
528 'INC1 'address-transfer "increase I1" (+ 48 1) 0
529 "Increase register I1 with the literal value of M.
530The result is undefined when the result does not fit in
5312 bytes."
532 1)
533
534(mixal-add-operation-code
535 'INC2 'address-transfer "increase I2" (+ 48 2) 0
536 "Increase register I2 with the literal value of M.
537The result is undefined when the result does not fit in
5382 bytes."
539 1)
540
541(mixal-add-operation-code
542 'INC3 'address-transfer "increase I3" (+ 48 3) 0
543 "Increase register I3 with the literal value of M.
544The result is undefined when the result does not fit in
5452 bytes."
546 1)
547
548(mixal-add-operation-code
549 'INC4 'address-transfer "increase I4" (+ 48 4) 0
550 "Increase register I4 with the literal value of M.
551The result is undefined when the result does not fit in
5522 bytes."
553 1)
554
555(mixal-add-operation-code
556 'INC5 'address-transfer "increase I5" (+ 48 5) 0
557 "Increase register I5 with the literal value of M.
558The result is undefined when the result does not fit in
5592 bytes."
560 1)
561
562(mixal-add-operation-code
563 'INC6 'address-transfer "increase I6" (+ 48 6) 0
564 "Increase register I6 with the literal value of M.
565The result is undefined when the result does not fit in
5662 bytes."
567 1)
568
569(mixal-add-operation-code
570 'DECA 'address-transfer "decrease A" 48 1
571 "Decrease register A with the literal value of M.
572On overflow the overflow toggle is set."
573 1)
574
575(mixal-add-operation-code
576 'DECX 'address-transfer "decrease X" 55 1
577 "Decrease register X with the literal value of M.
578On overflow the overflow toggle is set."
579 1)
580
581(mixal-add-operation-code
582 'DEC1 'address-transfer "decrease I1" (+ 48 1) 1
583 "Decrease register I1 with the literal value of M.
584The result is undefined when the result does not fit in
5852 bytes."
586 1)
587
588(mixal-add-operation-code
589 'DEC2 'address-transfer "decrease I2" (+ 48 2) 1
590 "Decrease register I2 with the literal value of M.
591The result is undefined when the result does not fit in
5922 bytes."
593 1)
594
595(mixal-add-operation-code
596 'DEC3 'address-transfer "decrease I3" (+ 48 3) 1
597 "Decrease register I3 with the literal value of M.
598The result is undefined when the result does not fit in
5992 bytes."
600 1)
601
602(mixal-add-operation-code
603 'DEC4 'address-transfer "decrease I4" (+ 48 4) 1
604 "Decrease register I4 with the literal value of M.
605The result is undefined when the result does not fit in
6062 bytes."
607 1)
608
609(mixal-add-operation-code
610 'DEC5 'address-transfer "decrease I5" (+ 48 5) 1
611 "Decrease register I5 with the literal value of M.
612The result is undefined when the result does not fit in
6132 bytes."
614 1)
615
616(mixal-add-operation-code
617 'DEC6 'address-transfer "decrease I6" (+ 48 6) 1
618 "Decrease register I6 with the literal value of M.
619The result is undefined when the result does not fit in
6202 bytes."
621 1)
622
623(mixal-add-operation-code
624 'CMPA 'comparison "compare A" 56 'field
625 "Compare contents of A with contents of M.
626The field specifier works on both fields. The comparison indicator
627is set to LESS, EQUAL or GREATER depending on the outcome."
628 2)
629
630
631(mixal-add-operation-code
632 'CMPX 'comparison "compare X" 63 'field
633 "Compare contents of rX with contents of M.
634The field specifier works on both fields. The comparison indicator
635is set to LESS, EQUAL or GREATER depending on the outcome."
636 2)
637
638
639(mixal-add-operation-code
640 'CMP1 'comparison "compare I1" (+ 56 1) 'field
641 "Compare contents of rI1 with contents of M.
642The field specifier works on both fields. The comparison indicator
643is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
644have a value of 0."
645 2)
646
647
648(mixal-add-operation-code
649 'CMP2 'comparison "compare I2" (+ 56 2) 'field
650 "Compare contents of rI2 with contents of M.
651The field specifier works on both fields. The comparison indicator
652is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
653have a value of 0."
654 2)
655
656
657(mixal-add-operation-code
658 'CMP3 'comparison "compare I3" (+ 56 3) 'field
659 "Compare contents of rI3 with contents of M.
660The field specifier works on both fields. The comparison indicator
661is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
662have a value of 0."
663 2)
664
665
666(mixal-add-operation-code
667 'CMP4 'comparison "compare I4" (+ 56 4) 'field
668 "Compare contents of rI4 with contents of M.
669The field specifier works on both fields. The comparison indicator
670is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
671have a value of 0."
672 2)
673
674
675(mixal-add-operation-code
676 'CMP5 'comparison "compare I5" (+ 56 5) 'field
677 "Compare contents of rI5 with contents of M.
678The field specifier works on both fields. The comparison indicator
679is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
680have a value of 0."
681 2)
682
683
684(mixal-add-operation-code
685 'CMP6 'comparison "compare I6" (+ 56 6) 'field
686 "Compare contents of rI6 with contents of M.
687The field specifier works on both fields. The comparison indicator
688is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
689have a value of 0."
690 2)
691
692(mixal-add-operation-code
693 'JMP 'jump "jump" 39 0
694 "Unconditional jump.
695Register J is set to the value of the next instruction that would have
696been executed when there was no jump."
697 1)
698
699(mixal-add-operation-code
700 'JSJ 'jump "jump, save J" 39 1
701 "Unconditional jump, but rJ is not modified."
702 1)
703
704(mixal-add-operation-code
705 'JOV 'jump "jump on overflow" 39 2
706 "Jump if OV is set (and turn it off).
707Register J is set to the value of the next instruction that would have
708been executed when there was no jump."
709 1)
710
711(mixal-add-operation-code
712 'JNOV 'jump "Jump on no overflow" 39 3
713 "Jump if OV is not set (and turn it off).
714Register J is set to the value of the next instruction that would have
715been executed when there was no jump."
716 1)
717
718(mixal-add-operation-code
719 'JL 'jump "Jump on less" 39 4
720 "Jump if '[CM] = L'.
721Register J is set to the value of the next instruction that would have
722been executed when there was no jump."
723 1)
724
725
726(mixal-add-operation-code
727 'JE 'jump "Jump on equal" 39 5
728 "Jump if '[CM] = E'.
729Register J is set to the value of the next instruction that would have
730been executed when there was no jump."
731 1)
732
733
734(mixal-add-operation-code
735 'JG 'jump "Jump on greater" 39 6
736 "Jump if '[CM] = G'.
737Register J is set to the value of the next instruction that would have
738been executed when there was no jump."
739 1)
740
741
742(mixal-add-operation-code
743 'JGE 'jump "Jump on not less" 39 7
744 "Jump if '[CM]' does not equal 'L'.
745Register J is set to the value of the next instruction that would have
746been executed when there was no jump."
747 1)
748
749
750(mixal-add-operation-code
751 'JNE 'jump "Jump on not equal" 39 8
752 "Jump if '[CM]' does not equal 'E'.
753Register J is set to the value of the next instruction that would have
754been executed when there was no jump."
755 1)
756
757
758(mixal-add-operation-code
759 'JLE 'jump "Jump on not greater" 39 9
760 "Jump if '[CM]' does not equal 'G'.
761Register J is set to the value of the next instruction that would have
762been executed when there was no jump."
763 1)
764
765(mixal-add-operation-code
766 'JAN 'jump "jump A negative" 40 0
767 "Jump if the content of rA is negative.
768Register J is set to the value of the next instruction that would have
769been executed when there was no jump."
770 1)
771
772
773(mixal-add-operation-code
774 'JAZ 'jump "jump A zero" 40 1
775 "Jump if the content of rA is zero.
776Register J is set to the value of the next instruction that would have
777been executed when there was no jump."
778 1)
779
780
781(mixal-add-operation-code
782 'JAP 'jump "jump A positive" 40 2
783 "Jump if the content of rA is positive.
784Register J is set to the value of the next instruction that would have
785been executed when there was no jump."
786 1)
787
788
789(mixal-add-operation-code
790 'JANN 'jump "jump A non-negative" 40 3
791 "Jump if the content of rA is non-negative.
792Register J is set to the value of the next instruction that would have
793been executed when there was no jump."
794 1)
795
796
797(mixal-add-operation-code
798 'JANZ 'jump "jump A non-zero" 40 4
799 "Jump if the content of rA is non-zero.
800Register J is set to the value of the next instruction that would have
801been executed when there was no jump."
802 1)
803
804
805(mixal-add-operation-code
806 'JANP 'jump "jump A non-positive" 40 5
807 "Jump if the content of rA is non-positive.
808Register J is set to the value of the next instruction that would have
809been executed when there was no jump."
810 1)
811
812(mixal-add-operation-code
813 'JXN 'jump "jump X negative" 47 0
814 "Jump if the content of rX is negative.
815Register J is set to the value of the next instruction that would have
816been executed when there was no jump."
817 1)
818
819
820(mixal-add-operation-code
821 'JXZ 'jump "jump X zero" 47 1
822 "Jump if the content of rX is zero.
823Register J is set to the value of the next instruction that would have
824been executed when there was no jump."
825 1)
826
827
828(mixal-add-operation-code
829 'JXP 'jump "jump X positive" 47 2
830 "Jump if the content of rX is positive.
831Register J is set to the value of the next instruction that would have
832been executed when there was no jump."
833 1)
834
835
836(mixal-add-operation-code
837 'JXNN 'jump "jump X non-negative" 47 3
838 "Jump if the content of rX is non-negative.
839Register J is set to the value of the next instruction that would have
840been executed when there was no jump."
841 1)
842
843
844(mixal-add-operation-code
845 'JXNZ 'jump "jump X non-zero" 47 4
846 "Jump if the content of rX is non-zero.
847Register J is set to the value of the next instruction that would have
848been executed when there was no jump."
849 1)
850
851
852(mixal-add-operation-code
853 'JXNP 'jump "jump X non-positive" 47 5
854 "Jump if the content of rX is non-positive.
855Register J is set to the value of the next instruction that would have
856been executed when there was no jump."
857 1)
858
859(mixal-add-operation-code
860 'J1N 'jump "jump I1 negative" (+ 40 1) 0
861 "Jump if the content of rI1 is negative.
862Register J is set to the value of the next instruction that would have
863been executed when there was no jump."
864 1)
865
866
867(mixal-add-operation-code
868 'J1Z 'jump "jump I1 zero" (+ 40 1) 1
869 "Jump if the content of rI1 is zero.
870Register J is set to the value of the next instruction that would have
871been executed when there was no jump."
872 1)
873
874
875(mixal-add-operation-code
876 'J1P 'jump "jump I1 positive" (+ 40 1) 2
877 "Jump if the content of rI1 is positive.
878Register J is set to the value of the next instruction that would have
879been executed when there was no jump."
880 1)
881
882
883(mixal-add-operation-code
884 'J1NN 'jump "jump I1 non-negative" (+ 40 1) 3
885 "Jump if the content of rI1 is non-negative.
886Register J is set to the value of the next instruction that would have
887been executed when there was no jump."
888 1)
889
890
891(mixal-add-operation-code
892 'J1NZ 'jump "jump I1 non-zero" (+ 40 1) 4
893 "Jump if the content of rI1 is non-zero.
894Register J is set to the value of the next instruction that would have
895been executed when there was no jump."
896 1)
897
898
899(mixal-add-operation-code
900 'J1NP 'jump "jump I1 non-positive" (+ 40 1) 5
901 "Jump if the content of rI1 is non-positive.
902Register J is set to the value of the next instruction that would have
903been executed when there was no jump."
904 1)
905
906(mixal-add-operation-code
907 'J2N 'jump "jump I2 negative" (+ 40 1) 0
908 "Jump if the content of rI2 is negative.
909Register J is set to the value of the next instruction that would have
910been executed when there was no jump."
911 1)
912
913
914(mixal-add-operation-code
915 'J2Z 'jump "jump I2 zero" (+ 40 1) 1
916 "Jump if the content of rI2 is zero.
917Register J is set to the value of the next instruction that would have
918been executed when there was no jump."
919 1)
920
921
922(mixal-add-operation-code
923 'J2P 'jump "jump I2 positive" (+ 40 1) 2
924 "Jump if the content of rI2 is positive.
925Register J is set to the value of the next instruction that would have
926been executed when there was no jump."
927 1)
928
929
930(mixal-add-operation-code
931 'J2NN 'jump "jump I2 non-negative" (+ 40 1) 3
932 "Jump if the content of rI2 is non-negative.
933Register J is set to the value of the next instruction that would have
934been executed when there was no jump."
935 1)
936
937
938(mixal-add-operation-code
939 'J2NZ 'jump "jump I2 non-zero" (+ 40 1) 4
940 "Jump if the content of rI2 is non-zero.
941Register J is set to the value of the next instruction that would have
942been executed when there was no jump."
943 1)
944
945
946(mixal-add-operation-code
947 'J2NP 'jump "jump I2 non-positive" (+ 40 1) 5
948 "Jump if the content of rI2 is non-positive.
949Register J is set to the value of the next instruction that would have
950been executed when there was no jump."
951 1)
952
953
954(mixal-add-operation-code
955 'J3N 'jump "jump I3 negative" (+ 40 1) 0
956 "Jump if the content of rI3 is negative.
957Register J is set to the value of the next instruction that would have
958been executed when there was no jump."
959 1)
960
961
962(mixal-add-operation-code
963 'J3Z 'jump "jump I3 zero" (+ 40 1) 1
964 "Jump if the content of rI3 is zero.
965Register J is set to the value of the next instruction that would have
966been executed when there was no jump."
967 1)
968
969
970(mixal-add-operation-code
971 'J3P 'jump "jump I3 positive" (+ 40 1) 2
972 "Jump if the content of rI3 is positive.
973Register J is set to the value of the next instruction that would have
974been executed when there was no jump."
975 1)
976
977
978(mixal-add-operation-code
979 'J3NN 'jump "jump I3 non-negative" (+ 40 1) 3
980 "Jump if the content of rI3 is non-negative.
981Register J is set to the value of the next instruction that would have
982been executed when there was no jump."
983 1)
984
985
986(mixal-add-operation-code
987 'J3NZ 'jump "jump I3 non-zero" (+ 40 1) 4
988 "Jump if the content of rI3 is non-zero.
989Register J is set to the value of the next instruction that would have
990been executed when there was no jump."
991 1)
992
993
994(mixal-add-operation-code
995 'J3NP 'jump "jump I3 non-positive" (+ 40 1) 5
996 "Jump if the content of rI3 is non-positive.
997Register J is set to the value of the next instruction that would have
998been executed when there was no jump."
999 1)
1000
1001
1002(mixal-add-operation-code
1003 'J4N 'jump "jump I4 negative" (+ 40 1) 0
1004 "Jump if the content of rI4 is negative.
1005Register J is set to the value of the next instruction that would have
1006been executed when there was no jump."
1007 1)
1008
1009
1010(mixal-add-operation-code
1011 'J4Z 'jump "jump I4 zero" (+ 40 1) 1
1012 "Jump if the content of rI4 is zero.
1013Register J is set to the value of the next instruction that would have
1014been executed when there was no jump."
1015 1)
1016
1017
1018(mixal-add-operation-code
1019 'J4P 'jump "jump I4 positive" (+ 40 1) 2
1020 "Jump if the content of rI4 is positive.
1021Register J is set to the value of the next instruction that would have
1022been executed when there was no jump."
1023 1)
1024
1025
1026(mixal-add-operation-code
1027 'J4NN 'jump "jump I4 non-negative" (+ 40 1) 3
1028 "Jump if the content of rI4 is non-negative.
1029Register J is set to the value of the next instruction that would have
1030been executed when there was no jump."
1031 1)
1032
1033
1034(mixal-add-operation-code
1035 'J4NZ 'jump "jump I4 non-zero" (+ 40 1) 4
1036 "Jump if the content of rI4 is non-zero.
1037Register J is set to the value of the next instruction that would have
1038been executed when there was no jump."
1039 1)
1040
1041
1042(mixal-add-operation-code
1043 'J4NP 'jump "jump I4 non-positive" (+ 40 1) 5
1044 "Jump if the content of rI4 is non-positive.
1045Register J is set to the value of the next instruction that would have
1046been executed when there was no jump."
1047 1)
1048
1049
1050(mixal-add-operation-code
1051 'J5N 'jump "jump I5 negative" (+ 40 1) 0
1052 "Jump if the content of rI5 is negative.
1053Register J is set to the value of the next instruction that would have
1054been executed when there was no jump."
1055 1)
1056
1057
1058(mixal-add-operation-code
1059 'J5Z 'jump "jump I5 zero" (+ 40 1) 1
1060 "Jump if the content of rI5 is zero.
1061Register J is set to the value of the next instruction that would have
1062been executed when there was no jump."
1063 1)
1064
1065
1066(mixal-add-operation-code
1067 'J5P 'jump "jump I5 positive" (+ 40 1) 2
1068 "Jump if the content of rI5 is positive.
1069Register J is set to the value of the next instruction that would have
1070been executed when there was no jump."
1071 1)
1072
1073
1074(mixal-add-operation-code
1075 'J5NN 'jump "jump I5 non-negative" (+ 40 1) 3
1076 "Jump if the content of rI5 is non-negative.
1077Register J is set to the value of the next instruction that would have
1078been executed when there was no jump."
1079 1)
1080
1081
1082(mixal-add-operation-code
1083 'J5NZ 'jump "jump I5 non-zero" (+ 40 1) 4
1084 "Jump if the content of rI5 is non-zero.
1085Register J is set to the value of the next instruction that would have
1086been executed when there was no jump."
1087 1)
1088
1089
1090(mixal-add-operation-code
1091 'J5NP 'jump "jump I5 non-positive" (+ 40 1) 5
1092 "Jump if the content of rI5 is non-positive.
1093Register J is set to the value of the next instruction that would have
1094been executed when there was no jump."
1095 1)
1096
1097
1098(mixal-add-operation-code
1099 'J6N 'jump "jump I6 negative" (+ 40 1) 0
1100 "Jump if the content of rI6 is negative.
1101Register J is set to the value of the next instruction that would have
1102been executed when there was no jump."
1103 1)
1104
1105
1106(mixal-add-operation-code
1107 'J6Z 'jump "jump I6 zero" (+ 40 1) 1
1108 "Jump if the content of rI6 is zero.
1109Register J is set to the value of the next instruction that would have
1110been executed when there was no jump."
1111 1)
1112
1113
1114(mixal-add-operation-code
1115 'J6P 'jump "jump I6 positive" (+ 40 1) 2
1116 "Jump if the content of rI6 is positive.
1117Register J is set to the value of the next instruction that would have
1118been executed when there was no jump."
1119 1)
1120
1121
1122(mixal-add-operation-code
1123 'J6NN 'jump "jump I6 non-negative" (+ 40 1) 3
1124 "Jump if the content of rI6 is non-negative.
1125Register J is set to the value of the next instruction that would have
1126been executed when there was no jump."
1127 1)
1128
1129
1130(mixal-add-operation-code
1131 'J6NZ 'jump "jump I6 non-zero" (+ 40 1) 4
1132 "Jump if the content of rI6 is non-zero.
1133Register J is set to the value of the next instruction that would have
1134been executed when there was no jump."
1135 1)
1136
1137
1138(mixal-add-operation-code
1139 'J6NP 'jump "jump I6 non-positive" (+ 40 1) 5
1140 "Jump if the content of rI6 is non-positive.
1141Register J is set to the value of the next instruction that would have
1142been executed when there was no jump."
1143 1)
1144
1145(mixal-add-operation-code
1146 'SLA 'miscellaneous "shift left A" 6 0
1147 "Shift to A, M bytes left.
1148Hero's will be added to the right."
1149 2)
1150
1151
1152(mixal-add-operation-code
1153 'SRA 'miscellaneous "shift right A" 6 1
1154 "Shift to A, M bytes right.
1155Zeros will be added to the left."
1156 2)
1157
1158
1159(mixal-add-operation-code
1160 'SLAX 'miscellaneous "shift left AX" 6 2
1161 "Shift AX, M bytes left.
1162Zeros will be added to the right."
1163 2)
1164
1165
1166
1167(mixal-add-operation-code
1168 'SRAX 'miscellaneous "shift right AX" 6 3
1169 "Shift AX, M bytes right.
1170Zeros will be added to the left."
1171 2)
1172
1173
1174(mixal-add-operation-code
1175 'SLC 'miscellaneous "shift left AX circularly" 6 4
1176 "Shift AX, M bytes left circularly.
1177The bytes that fall off to the left will be added to the right."
1178 2)
1179
1180
1181(mixal-add-operation-code
1182 'SRC 'miscellaneous "shift right AX circularly" 6 4
1183 "Shift AX, M bytes right circularly.
1184The bytes that fall off to the right will be added to the left."
1185 2)
1186
1187(mixal-add-operation-code
1188 'MOVE 'miscellaneous "move" 7 'number
1189 "Move MOD words from M to the location stored in rI1."
1190 '(+ 1 (* 2 number)))
1191
1192(mixal-add-operation-code
1193 'NOP 'miscellaneous "no operation" 0 'ignored
1194 "No operation, M and F are not used by the machine."
1195 1)
1196
1197(mixal-add-operation-code
1198 'HLT 'miscellaneous "halt" 5 2
1199 "Halt.
1200Stop instruction fetching."
1201 1)
1202
1203(mixal-add-operation-code
1204 'IN 'input-output "input" 36 'unit
1205 "Transfer a block of words from the specified unit to memory.
1206The transfer starts at address M."
1207 1)
1208
1209(mixal-add-operation-code
1210 'OUT 'input-output "output" 37 'unit
1211 "Transfer a block of words from memory.
1212The transfer starts at address M to the specified unit."
1213 1)
1214
1215(mixal-add-operation-code
1216 'IOC 'input-output "input-output control" 35 'unit
1217 "Perform a control operation.
1218The control operation is given by M on the specified unit."
1219 1)
1220
1221(mixal-add-operation-code
1222 'JRED 'input-output "jump ready" 38 'unit
1223 "Jump to M if the specified unit is ready."
1224 1)
1225
1226
1227(mixal-add-operation-code
1228 'JBUS 'input-output "jump busy" 34 'unit
1229 "Jump to M if the specified unit is busy."
1230 1)
1231
1232(mixal-add-operation-code
1233 'NUM 'conversion "convert to numeric" 5 0
1234 "Convert rAX to its numerical value and store it in rA.
1235the register rAX is assumed to contain a character representation of
1236a number."
1237 10)
1238
1239(mixal-add-operation-code
1240 'CHAR 'conversion "convert to characters" 5 1
1241 "Convert the number stored in rA to a character representation.
1242The converted character representation is stored in rAX."
1243 10)
1244
1245(defvar mixal-describe-operation-code-history nil
1246 "History list for describe operation code.")
1247
1248(defun mixal-describe-operation-code (&optional op-code)
1249 "Display the full documentation of OP-CODE."
1250 (interactive)
1251 ;; we like to provide completition and history, so do it ourself (interactive "?bla")?
1252 (unless op-code
1253 (let* ((completion-ignore-case t)
1254 ;; we already have a list, but it is not in the right format
1255 ;; transform it to a valid table so completition can use it
1256 (table (mapcar '(lambda (elm)
1257 (cons (symbol-name (car elm)) nil))
1258 mixal-operation-codes-alist))
1259 ;; prompt is different depending on we are close to a valid op-code
1260 (have-default (member (current-word) mixal-operation-codes))
1261 (prompt (concat "Describe operation code "
1262 (if have-default
1263 (concat "(default " (current-word) "): ")
1264 ": "))))
1265 ;; as the operation code to the user
1266 (setq op-code (completing-read prompt table nil t nil
1267 'mixal-describe-operation-code-history
1268 (current-word)))))
1269 ;; get the info on the op-code and output it to the help buffer
1270 (let ((op-code-help (assq (intern-soft op-code) mixal-operation-codes-alist)))
1271 (when op-code-help
1272 (with-output-to-temp-buffer (buffer-name (get-buffer-create "*Help*"))
1273 (princ op-code) (princ " is an mix operation code\n\n")
1274 (princ (nth 5 op-code-help)) (terpri) (terpri)
1275 (princ " group: ") (princ (nth 1 op-code-help)) (terpri)
1276 (princ " nice name: ") (princ (nth 2 op-code-help)) (terpri)
1277 (princ " OPCODE / C: ") (princ (nth 3 op-code-help)) (terpri)
1278 (princ " MOD / F: ") (princ (nth 4 op-code-help)) (terpri)
1279 (princ " time: ") (princ (nth 6 op-code-help)) (terpri)))))
1280
1281;;;; Running
1282(defun mixal-run ()
1283 "Run's mixal file in current buffer, assumes that file has been compiled"
1284 (interactive)
1285 (mixvm (concat "mixvm -r -t -d "
1286 (file-name-sans-extension (buffer-file-name)))))
1287
1288(defun mixal-debug ()
1289 "Starts mixvm for debugging, assumes that file has been compiled with debugging support"
1290 (interactive)
1291 (mixvm (concat "mixvm "
1292 (file-name-sans-extension (buffer-file-name)))))
1293
1294;;;###autoload
1295(define-derived-mode mixal-mode fundamental-mode "mixal"
1296 "Major mode for the mixal asm language.
1297\\{mixal-mode-map}"
1298 (set (make-local-variable 'comment-start) "*")
1299 (set (make-local-variable 'comment-start-skip) "*")
1300 (set (make-local-variable 'font-lock-defaults) '(mixal-font-lock-keywords))
1301; might add an indent function in the future
1302; (set (make-local-variable 'indent-line-function) 'mixal-indent-line)
1303 (set (make-local-variable 'compile-command) (concat "mixasm -g "
1304 buffer-file-name))
1305 ;; mixasm will do strange when there is no final newline,
1306 ;; let emacs ensure that it is always there
1307 (set (make-local-variable 'require-final-newline) t))
1308
1309;;;###autoload
1310(add-to-list 'auto-mode-alist '("\\.mixal\\'" . mixal-mode))
1311
1312(provide 'mixal-mode)
1313;;; mixal-mode.el ends here