changeset 83385:1cd4072747c6

Merged from miles@gnu.org--gnu-2005 (patch 593-595) Patches applied: * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-593 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-594 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-595 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-425
author Karoly Lorentey <lorentey@elte.hu>
date Wed, 19 Oct 2005 14:03:44 +0000
parents 08b4dd6a6e87 (current diff) 33c8db02dc18 (diff)
children db4e74787e6f
files lisp/ChangeLog lisp/startup.el man/ChangeLog src/buffer.c src/keyboard.c src/sysdep.c src/xdisp.c src/xterm.c
diffstat 21 files changed, 1320 insertions(+), 1470 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Wed Oct 12 16:14:04 2005 +0000
+++ b/lisp/ChangeLog	Wed Oct 19 14:03:44 2005 +0000
@@ -1,4 +1,76 @@
-2005-10-11  Sven Joachim  <svenjoac@gmx.de>
+2005-10-13  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
+
+	* toolbar/diropen.xpm, toolbar/diropen.pbm: New versions made from
+	Gnome file-manager.png.  Suggested by
+	Joachim Nilsson <joachim.nilsson@vmlinux.org>.
+
+	* toolbar/README: Add diropen.xpm.
+
+2005-10-13  Bill Wohler  <wohler@newt.com>
+
+	* makefile.w32-in (MH_E_SRC): Rename from MH-E-SRC per NMAKE
+	restrictions.  Suggested by David Robinow <drobinow@gmail.com>.
+
+2005-10-13  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* progmodes/mixal-mode.el (mixal-operation-codes-alist):
+	Don't waste the byte-compiler's time on constant data.
+
+2005-10-13  Kenichi Handa  <handa@m17n.org>
+
+	* international/utf-8.el (utf-8-compose): Display an invalid UTF-8
+	byte with `escape-glyph' face.
+
+	* international/fontset.el (ccl-encode-unicode-font):
+	Lookup utf-subst-table-for-encode, not ucs-mule-cjk-to-unicode.
+	Handle the case that ucs-mule-to-mule-unicode translates a character to
+	ASCII (usually for IPA characters).
+
+2005-10-12  Bill Wohler  <wohler@newt.com>
+
+	* makefile.w32-in (MH-E-SRC): New. Used by mh-autoloads.
+	(mh-autoloads): New. Builds mh-e/mh-loaddefs.el. Rebuilds if any
+	files in MH-E-SRC have been updated.
+	(updates, compile, recompile, bootstrap): Depend on mh-autoloads.
+
+2005-10-12  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* progmodes/mixal-mode.el (mixal-operation-codes): Remove.
+	(mixal-mode-syntax-table): Add \n as end-comment.
+	(mixal-operation-codes-alist): Immediately initialize to full value.
+	(mixal-add-operation-code): Remove.
+	(mixal-describe-operation-code): Make the arg non-optional.
+	Use the interactive spec instead.
+	Use mixal-operation-codes-alist rather than mixal-operation-codes.
+	(mixal-font-lock-keywords): Don't highlight comments here any more.
+	(mixal-font-lock-syntactic-keywords): New var.
+	(mixal-mode): Use it.  Fix comment-start-skip.
+
+2005-10-12  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
+
+	* startup.el (command-line-x-option-alist): -nb => -nbi
+
+2005-10-12  Kim F. Storm  <storm@cua.dk>
+
+	* startup.el (fancy-splash-default-action): Discard mouse click in
+	the spash screen window, as it has no sensible meaning in the
+	next window to be selected.  Fixes error reported by Jan D.
+
+2005-10-12  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* desktop.el (desktop-load-file): Do nothing when FUNCTION is nil.
+
+2005-10-11  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* progmodes/mixal-mode.el: Sync with version in the GNU MDK project.
+	Try to fix up minor layout issues like indentation, line break, etc...
+	(mixal-mode-syntax-table): Don't try to specify comment syntax,
+	because it doesn't work.
+	(mixal-operation-codes): Add some more codes.
+	(mixal-font-lock-keywords): Process comments here.
+	(mixal-mode): mixasm no longer needs -g option.
+
+2005-10-11  Sven Joachim  <svenjoac@gmx.de>  (tiny change)
 
 	* progmodes/sh-script.el (sh-tmp-file):
 	Use mktemp -t.  Finish support for es and rc shells.
@@ -798,7 +870,7 @@
 	color rxvt terminals by using the code xterm.el used to use before
 	2005-04-09 in order to match the colors used by rxvt.
 
-2005-09-24  Emanuele Giaquinta <emanuele.giaquinta@gmail.com> (tiny change)
+2005-09-24  Emanuele Giaquinta <emanuele.giaquinta@gmail.com>  (tiny change)
 
 	* term/rxvt.el (rxvt-register-default-colors): Add support for 88
 	colors rxvt-unicode terminals by using the same code as xterm.el.
@@ -5940,8 +6012,8 @@
 
 	* log-view.el (log-view-file, log-view-message): Remove "-face"
 	suffix from face names.
-	(log-view-file-face, log-view-message-face): New
-	backward-compatibility aliases for renamed faces.
+	(log-view-file-face, log-view-message-face):
+	New backward-compatibility aliases for renamed faces.
 	(log-view-file-face, log-view-message-face): Use renamed log-view
 	faces.
 
@@ -5961,8 +6033,8 @@
 	(ruler-mode-margins-face, ruler-mode-fringes-face)
 	(ruler-mode-column-number-face, ruler-mode-fill-column-face)
 	(ruler-mode-comment-column-face, ruler-mode-goal-column-face)
-	(ruler-mode-tab-stop-face, ruler-mode-current-column-face): New
-	backward-compatibility aliases for renamed faces.
+	(ruler-mode-tab-stop-face, ruler-mode-current-column-face):
+	New backward-compatibility aliases for renamed faces.
 	(ruler-mode-pad, ruler-mode-margins, ruler-mode-fringes)
 	(ruler-mode-column-number, ruler-mode-fill-column)
 	(ruler-mode-comment-column, ruler-mode-goal-column)
@@ -6085,8 +6157,7 @@
 	* comint.el (comint-check-proc, make-comint-in-buffer)
 	(comint-source-default): Doc fixes.
 
-	* term.el (term-send-string): Improve argument/docstring
-	consistency.
+	* term.el (term-send-string): Improve argument/docstring consistency.
 
 2005-06-09  Luc Teirlinck  <teirllm@auburn.edu>
 
@@ -6203,12 +6274,11 @@
 	XEmacs code.
 	(flyspell-word): Minor simplification.
 	(flyspell-math-tex-command-p): Quieten the byte-compiler.
-	(flyspell-external-point-words): Remove unused vars `size' and
-	`start'.
-	(flyspell-do-correct): Rename from flyspell-xemacs-correct.  Merge
-	the corresponding Emacs code.
-	(flyspell-correct-word, flyspell-xemacs-popup): Use
-	flyspell-do-correct.
+	(flyspell-external-point-words): Remove unused vars `size' and `start'.
+	(flyspell-do-correct): Rename from flyspell-xemacs-correct.
+	Merge the corresponding Emacs code.
+	(flyspell-correct-word, flyspell-xemacs-popup):
+	Use flyspell-do-correct.
 
 	* emacs-lisp/debug.el (debug): Don't bury the buffer unless it's in
 	a dedicated window.
@@ -6247,8 +6317,7 @@
 	Add a completion-base-size-function property.
 
 	* simple.el (completion-setup-function): Look for
-	completion-base-size-function property of
-	minibuffer-completion-table.
+	completion-base-size-function property of minibuffer-completion-table.
 
 	* files.el (locate-file-completion): Doc fix.
 
--- a/lisp/desktop.el	Wed Oct 12 16:14:04 2005 +0000
+++ b/lisp/desktop.el	Wed Oct 19 14:03:44 2005 +0000
@@ -963,10 +963,11 @@
 
 (defun desktop-load-file (function)
   "Load the file where auto loaded FUNCTION is defined."
-  (let ((fcell (symbol-function function)))
-    (when (and (listp fcell)
-               (eq 'autoload (car fcell)))
-      (load (cadr fcell)))))
+  (when function
+    (let ((fcell (symbol-function function)))
+      (when (and (listp fcell)
+                 (eq 'autoload (car fcell)))
+        (load (cadr fcell))))))
 
 ;; ----------------------------------------------------------------------------
 ;; Create a buffer, load its file, set its mode, ...;
--- a/lisp/info.el	Wed Oct 12 16:14:04 2005 +0000
+++ b/lisp/info.el	Wed Oct 19 14:03:44 2005 +0000
@@ -3666,23 +3666,23 @@
                                   ((equal tag "Up") Info-up-link-keymap))))))
         (when Info-use-header-line
           (goto-char (point-min))
-          (let ((header-end (line-end-position))
-                header)
-            ;; If we find neither Next: nor Prev: link, show the entire
-            ;; node header.  Otherwise, don't show the File: and Node:
-            ;; parts, to avoid wasting precious space on information that
-            ;; is available in the mode line.
-            (if (re-search-forward
-                 "\\(next\\|up\\|prev[ious]*\\): "
-                 header-end t)
-                (progn
-                  (goto-char (match-beginning 1))
-                  (setq header (buffer-substring (point) header-end)))
-              (if (re-search-forward "node:[ \t]*[^ \t]+[ \t]*" header-end t)
-                  (setq header
+          (let* ((header-end (line-end-position))
+                 (header
+                  ;; If we find neither Next: nor Prev: link, show the entire
+                  ;; node header.  Otherwise, don't show the File: and Node:
+                  ;; parts, to avoid wasting precious space on information that
+                  ;; is available in the mode line.
+                  (if (re-search-forward
+                       "\\(next\\|up\\|prev[ious]*\\): "
+                       header-end t)
+                      (progn
+                        (goto-char (match-beginning 1))
+                        (buffer-substring (point) header-end))
+                    (if (re-search-forward "node:[ \t]*[^ \t]+[ \t]*"
+                                           header-end t)
                         (concat "No next, prev or up links  --  "
-                                (buffer-substring (point) header-end)))
-                (setq header (buffer-substring (point) header-end))))
+                                (buffer-substring (point) header-end))
+                      (buffer-substring (point) header-end)))))
             (put-text-property (point-min) (1+ (point-min))
                                'header-line
 			       (replace-regexp-in-string
@@ -3698,9 +3698,15 @@
 
       ;; Fontify titles
       (goto-char (point-min))
-      (when not-fontified-p
-        (while (re-search-forward "\n\\([^ \t\n].+\\)\n\\(\\*\\*+\\|==+\\|--+\\|\\.\\.+\\)$"
-                                  nil t)
+      (when (and font-lock-mode not-fontified-p)
+        (while (and (re-search-forward "\n\\([^ \t\n].+\\)\n\\(\\*\\*+\\|==+\\|--+\\|\\.\\.+\\)$"
+                                       nil t)
+                    ;; Only consider it as an underlined title if the ASCII
+                    ;; underline has the same size as the text.  A typical
+                    ;; counter example is when a continuation "..." is alone
+                    ;; on a line.
+                    (= (- (match-end 1) (match-beginning 1))
+                       (- (match-end 2) (match-beginning 2))))
           (let* ((c (preceding-char))
                  (face
                   (cond ((= c ?*) 'info-title-1)
--- a/lisp/international/fontset.el	Wed Oct 12 16:14:04 2005 +0000
+++ b/lisp/international/fontset.el	Wed Oct 19 14:03:44 2005 +0000
@@ -173,39 +173,42 @@
        ((if (r2 >= 0)
 	    ;; This is a 2D charset.
 	    (r1 = ((r1 << 7) | r2)))
-	(lookup-character ucs-mule-cjk-to-unicode r0 r1)
+	(lookup-character utf-subst-table-for-encode r0 r1)
 	(if r7
 	    ;; We got it!
 	    ((r1 = (r0 >> 8))
 	     (r2 = (r0 & #xFF)))
 	  ;; Look for a translation for non-ASCII chars.
 	  ((translate-character ucs-mule-to-mule-unicode r0 r1)
-	   (if (r0 == ,(charset-id 'latin-iso8859-1))
-	       ((r2 = (r1 + 128))
+	   (if (r0 == ,(charset-id 'ascii))
+	       ((r2 = r1)
 		(r1 = 0))
-	     ((r2 = (r1 & #x7F))
-	      (r1 >>= 7)
-	      (if (r0 == ,(charset-id 'mule-unicode-0100-24ff))
-		  ((r1 *= 96)
-		   (r1 += r2)
-		   (r1 += ,(- #x100 (* 32 96) 32))
-		   (r1 >8= 0)
-		   (r2 = r7))
-		(if (r0 == ,(charset-id 'mule-unicode-2500-33ff))
-		    ((r1 *= 96)
-		     (r1 += r2)
-		     (r1 += ,(- #x2500 (* 32 96) 32))
-		     (r1 >8= 0)
-		     (r2 = r7))
-		  (if (r0 == ,(charset-id 'mule-unicode-e000-ffff))
-		      ((r1 *= 96)
-		       (r1 += r2)
-		       (r1 += ,(- #xe000 (* 32 96) 32))
-		       (r1 >8= 0)
-		       (r2 = r7))
-		    ;; No way, use the glyph for U+FFFD.
-		    ((r1 = #xFF)
-		     (r2 = #xFD)))))))))))))
+	     ((if (r0 == ,(charset-id 'latin-iso8859-1))
+		  ((r2 = (r1 + 128))
+		   (r1 = 0))
+		((r2 = (r1 & #x7F))
+		 (r1 >>= 7)
+		 (if (r0 == ,(charset-id 'mule-unicode-0100-24ff))
+		     ((r1 *= 96)
+		      (r1 += r2)
+		      (r1 += ,(- #x100 (* 32 96) 32))
+		      (r1 >8= 0)
+		      (r2 = r7))
+		   (if (r0 == ,(charset-id 'mule-unicode-2500-33ff))
+		       ((r1 *= 96)
+			(r1 += r2)
+			(r1 += ,(- #x2500 (* 32 96) 32))
+			(r1 >8= 0)
+			(r2 = r7))
+		     (if (r0 == ,(charset-id 'mule-unicode-e000-ffff))
+			 ((r1 *= 96)
+			  (r1 += r2)
+			  (r1 += ,(- #xe000 (* 32 96) 32))
+			  (r1 >8= 0)
+			  (r2 = r7))
+		       ;; No way, use the glyph for U+FFFD.
+		       ((r1 = #xFF)
+			(r2 = #xFD)))))))))))))))
   "Encode characters for display with iso10646 font.
 Translate through the translation-hash-table named
 `ucs-mule-cjk-to-unicode' and the translation-table named
--- a/lisp/international/utf-8.el	Wed Oct 12 16:14:04 2005 +0000
+++ b/lisp/international/utf-8.el	Wed Oct 19 14:03:44 2005 +0000
@@ -934,7 +934,8 @@
 			     'help-echo 'utf-8-help-echo)
 	  (if (= l 2)
 	      (put-text-property (point) (min (point-max) (+ l (point)))
-				 'display (format "\\%03o" ch))
+				 'display (propertize (format "\\%03o" ch)
+						      'face 'escape-glyph))
 	    (compose-region (point) (+ l (point)) ?$,3u=(B))
 	  (forward-char l))
       (forward-char 1))))
--- a/lisp/makefile.w32-in	Wed Oct 12 16:14:04 2005 +0000
+++ b/lisp/makefile.w32-in	Wed Oct 19 14:03:44 2005 +0000
@@ -176,7 +176,7 @@
 	   $(srcdir)/update-subdirs $$file; \
 	done;
 
-updates: update-subdirs autoloads finder-data custom-deps
+updates: update-subdirs autoloads mh-autoloads finder-data custom-deps
 
 # Update the AUTHORS file.
 
@@ -207,7 +207,7 @@
 # compiled find the right files.
 
 # Need separate version for sh and native cmd.exe
-compile: subdirs.el compile-$(SHELLTYPE) doit
+compile: subdirs.el mh-autoloads compile-$(SHELLTYPE) doit
 
 compile-CMD:
 #	-for %%f in ($(lisp) $(WINS)) do for %%g in (%%f\*.elc) do @attrib -r %%g
@@ -282,9 +282,47 @@
 # Note that this doesn't create .elc files.  It only recompiles if an
 # .elc is present.
 
-recompile: doit
+recompile: mh-autoloads doit
 	$(emacs) -f batch-byte-recompile-directory $(lisp)
 
+# Update MH-E internal autoloads. These are not to be confused with
+# the autoloads for the MH-E entry points, which are already in
+# loaddefs.el.
+MH_E_SRC = $(lisp)/mh-e/mh-acros.el $(lisp)/mh-e/mh-alias.el	\
+	$(lisp)/mh-e/mh-comp.el $(lisp)/mh-e/mh-customize.el	\
+	$(lisp)/mh-e/mh-e.el $(lisp)/mh-e/mh-funcs.el		\
+	$(lisp)/mh-e/mh-mime.el $(lisp)/mh-e/mh-pick.el		\
+	$(lisp)/mh-e/mh-print.el $(lisp)/mh-e/mh-inc.el		\
+	$(lisp)/mh-e/mh-init.el $(lisp)/mh-e/mh-index.el	\
+	$(lisp)/mh-e/mh-identity.el $(lisp)/mh-e/mh-junk.el	\
+	$(lisp)/mh-e/mh-seq.el $(lisp)/mh-e/mh-speed.el		\
+	$(lisp)/mh-e/mh-utils.el
+
+mh-autoloads: $(lisp)/mh-e/mh-loaddefs.el
+$(lisp)/mh-e/mh-loaddefs.el: $(MH_E_SRC)
+	echo ";;; mh-loaddefs.el --- automatically extracted autoloads" > $@
+	echo ";;" >> $@
+	echo ";;; Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc." >> $@
+	echo ";;; Author: Bill Wohler <wohler@newt.com>" >> $@
+	echo ";;; Keywords: mail" >> $@
+	echo ";;; Commentary:" >> $@
+	echo ";;; Change Log:" >> $@
+	echo ";;; Code:" >> $@
+	$(EMACS) $(EMACSOPT) \
+	   -l autoload \
+	   --eval "(setq generate-autoload-cookie \";;;###mh-autoload\")" \
+	   --eval "(setq generated-autoload-file \"$(lisp)/mh-e/mh-loaddefs.el\")" \
+	   --eval "(setq make-backup-files nil)" \
+	   -f batch-update-autoloads $(lisp)/mh-e
+	echo "" >> $@
+	echo "(provide 'mh-loaddefs)" >> $@
+	echo ";;; Local Variables:" >> $@
+	echo ";;; version-control: never" >> $@
+	echo ";;; no-byte-compile: t" >> $@
+	echo ";;; no-update-autoloads: t" >> $@
+	echo ";;; End:" >> $@
+	echo ";;; mh-loaddefs.el ends here" >> $@
+
 # Prepare a bootstrap in the lisp subdirectory.
 #
 # Build loaddefs.el to make sure it's up-to-date.  If it's not, that
@@ -316,7 +354,7 @@
 # When done, remove bootstrap-emacs from ../bin, so that
 # it will not be mistaken for an installed binary.
 
-bootstrap: update-subdirs autoloads compile finder-data custom-deps
+bootstrap: update-subdirs autoloads mh-autoloads compile finder-data custom-deps
 	- $(DEL) $(EMACS)
 
 #
--- a/lisp/mh-e/.cvsignore	Wed Oct 12 16:14:04 2005 +0000
+++ b/lisp/mh-e/.cvsignore	Wed Oct 19 14:03:44 2005 +0000
@@ -1,1 +1,2 @@
+mh-autoloads.el
 mh-loaddefs.el
--- a/lisp/progmodes/mixal-mode.el	Wed Oct 12 16:14:04 2005 +0000
+++ b/lisp/progmodes/mixal-mode.el	Wed Oct 19 14:03:44 2005 +0000
@@ -46,6 +46,14 @@
 
 ;;; History:
 ;; Version 0.3:
+;; 12/10/05: Stefan Monnier <monnier@iro.umontreal.ca>
+;;           Use font-lock-syntactic-keywords to detect/mark comments.
+;;           Use [^ \t\n]+ to match the operand part of a line.
+;;           Drop mixal-operation-codes.
+;;           Build the mixal-operation-codes-alist immediately.
+;;           Use `interactive' in mixal-describe-operation-code.
+;;           Remove useless ".*$" at the end of some regexps.
+;;           Fix the definition of comment-start-skip.
 ;; 08/10/05: sync mdk and emacs cvs
 ;;           from emacs: compile-command and require-final-newline
 ;;           from mdk:   see version 0.2
@@ -79,10 +87,12 @@
 ;;; Syntax table
 (defvar mixal-mode-syntax-table
   (let ((st (make-syntax-table)))
-    ;; (modify-syntax-entry ?* "<" st)    we need to do a bit more to make
-    ;; (modify-syntax-entry ?\n ">" st)    fontlocking for comments work
+    ;; We need to do a bit more to make fontlocking for comments work.
+    ;; See mixal-font-lock-syntactic-keywords.
+    ;; (modify-syntax-entry ?* "<" st)
+    (modify-syntax-entry ?\n ">" st)
     st)
-  "Syntax table for `dot-mode'.")
+  "Syntax table for `mixal-mode'.")
 
 (defvar mixal-font-lock-label-face 'font-lock-variable-name-face
   "Face name to use for label names.
@@ -99,48 +109,10 @@
 Default value is that of `font-lock-builtin-face', but you can modify its
 value.")
 
-(defvar mixal-operation-codes
-  '("NOP" "ADD" "FADD" "SUB" "FSUB" "MUL" "FMUL" "DIV" "FDIV" "NUM" "CHAR"
-    "HLT" "SLA" "SRA" "SLAX" "SRAX" "SLC" "SRC" "MOVE" "LDA" "LD1" "LD2" "LD3"
-    "LD4" "LD5" "LD6" "LDX" "LDAN" "LD1N" "LD2N" "LD3N" "LD4N" "LD5N" "LD6N"
-    "LDXN" "STA" "ST1" "ST2" "ST3" "ST4" "ST5" "ST6" "STX" "STJ" "STZ" "JBUS"
-    "IOC" "IN" "OUT" "JRAD" "JMP" "JSJ" "JOV" "JNOV"
-    "JL" "JE" "JG" "JGE" "JNE" "JLE"
-    "JAN" "J1N" "J2N" "J3N" "J4N" "J5N" "J6N" "JXN"
-    "JAZ" "J1Z" "J2Z" "J3Z" "J4Z" "J5Z" "J6Z" "JXZ"
-    "JAP" "J1P" "J2P" "J3P" "J4P" "J5P" "J6P" "JXP"
-    "JANN" "J1NN" "J2NN" "J3NN" "J4NN" "J5NN" "J6NN" "JXNN"
-    "JANZ" "J1NZ" "J2NZ" "J3NZ" "J4NZ" "J5NZ" "J6NZ" "JXNZ"
-    "JANP" "J1NP" "J2NP" "J3NP" "J4NP" "J5NP" "J6NP" "JXNP"
-    "INCA" "DECA" "ENTA" "ENNA" "INC1" "DEC1" "ENT1" "ENN1"
-    "INC2" "DEC2" "ENT2" "ENN2" "INC3" "DEC3" "ENT3" "ENN3" "INC4" "DEC4"
-    "ENT4" "ENN4" "INC5" "DEC5" "ENT5" "ENN5" "INC6" "DEC6" "ENT6" "ENN6"
-    "INCX" "DECX" "ENTX" "ENNX" "CMPA" "FCMP" "CMP1" "CMP2" "CMP3" "CMP4"
-    "CMP5" "CMP6" "CMPX")
-  "List of possible operation codes as strings.")
-;; (makunbound 'mixal-operation-codes)
-
 (defvar mixal-assembly-pseudoinstructions
   '("ORIG" "EQU" "CON" "ALF" "END")
   "List of possible assembly pseudoinstructions.")
 
-;;; Font-locking:
-(defvar mixal-font-lock-keywords
-  `(("^\\([A-Z0-9a-z]+\\).*$"
-     (1 mixal-font-lock-label-face))
-    (,(regexp-opt mixal-operation-codes 'words)
-     . mixal-font-lock-operation-code-face)
-    (,(regexp-opt
-       mixal-assembly-pseudoinstructions 'words)
-     . mixal-font-lock-assembly-pseudoinstruction-face)
-    ("^[A-Z0-9a-z]*[ \t]+[A-ZO-9a-z]+[ \t]+\\(=.*=\\).*$"
-     (1 font-lock-constant-face))
-    ("^[A-Z0-9a-z]*[ \t]+[A-Z0-9a-z]+[ \t]+[A-Z0-9a-z,():+-\\*=\" ]*\t+\\(.*\\)$"
-     (1 font-lock-comment-face))
-    ("^\\*.*$" . font-lock-comment-face))
-  "Keyword highlighting specification for `mixal-mode'.")
-;; (makunbound 'mixal-font-lock-keywords)
-
 ;;;; Compilation
 ;; Output from mixasm is compatible with default behavior of emacs,
 ;; I just added a key (C-cc) and modified the make-command.
@@ -149,7 +121,898 @@
 ;; Tabs works well by default.
 
 ;;;; Describe
-(defvar mixal-operation-codes-alist '()
+(defvar mixal-operation-codes-alist
+  ;; FIXME: the codes FADD, FSUB, FMUL, FDIV, JRAD, and FCMP were in
+  ;; mixal-operation-codes but not here.  They should probably be added here.
+  ;; 
+  ;; We used to define this with a backquote and subexps like ,(+ 8 3) for
+  ;; better clarity, but the resulting code was too big and caused the
+  ;; byte-compiler to eat up all the stack space.  Even using
+  ;; `eval-when-compile' didn't help because the byte-compiler insists on
+  ;; compiling the code before evaluating it.
+  '((LDA loading "load A" 8 field
+         "Put in rA the contents of cell no. M.
+Uses a + when there is no sign in subfield. Subfield is left padded with
+zeros to make a word."
+         2)
+
+    (LDX loading "load X" 15 field
+         "Put in rX the contents of cell no. M.
+Uses a + when there is no sign in subfield. Subfield is left padded with
+zeros to make a word."
+         2)
+
+    (LD1 loading "load I1" 9 field
+         "Put in rI1 the contents of cell no. M.
+Uses a + when there is no sign in subfield. Subfield is left padded with
+zeros to make a word. Index registers only have 2 bytes and a sign, Trying
+to set anything more that that will result in undefined behavior."
+         2)
+
+    (LD2 loading "load I2" 10 field
+         "Put in rI2 the contents of cell no. M.
+Uses a + when there is no sign in subfield. Subfield is left padded with
+zeros to make a word. Index registers only have 2 bytes and a sign, Trying
+to set anything more that that will result in undefined behavior."
+         2)
+
+    (LD3 loading "load I3" 11 field
+         "Put in rI3 the contents of cell no. M.
+Uses a + when there is no sign in subfield. Subfield is left padded with
+zeros to make a word. Index registers only have 2 bytes and a sign, Trying
+to set anything more that that will result in undefined behavior."
+         2)
+
+    (LD4 loading "load I4" 12 field
+         "Put in rI4 the contents of cell no. M.
+Uses a + when there is no sign in subfield. Subfield is left padded with
+zeros to make a word. Index registers only have 2 bytes and a sign, Trying
+to set anything more that that will result in undefined behavior."
+         2)
+
+    (LD5 loading "load I5" 13 field
+         "Put in rI5 the contents of cell no. M.
+Uses a + when there is no sign in subfield. Subfield is left padded with
+zeros to make a word. Index registers only have 2 bytes and a sign, Trying
+to set anything more that that will result in undefined behavior."
+         2)
+
+    (LD6 loading "load I6" 14 field
+         "Put in rI6 the contents of cell no. M.
+Uses a + when there is no sign in subfield. Subfield is left padded with
+zeros to make a word. Index registers only have 2 bytes and a sign, Trying
+to set anything more that that will result in undefined behavior."
+         2)
+
+    (LDAN loading "load A negative" 16 field
+          "Put in rA the contents of cell no. M, with opposite sign.
+Uses a + when there is no sign in subfield, otherwise use the opposite sign.
+Subfield is left padded with zeros to make a word."
+          2)
+
+    (LDXN loading "load X negative" 23 field
+          "Put in rX the contents of cell no. M, with opposite sign.
+Uses a + when there is no sign in subfield, otherwise use the opposite sign.
+Subfield is left padded with zeros to make a word."
+          2)
+
+    (LD1N loading "load I1 negative" 17 field
+          "Put in rI1 the contents of cell no. M, with opposite sign.
+Uses a + when there is no sign in subfield, otherwise use the opposite sign.
+Subfield is left padded with zeros to make a word. Index registers only
+have 2 bytes and a sign, Trying to set anything more that that will result
+in undefined behavior."
+          2)
+
+    (LD2N loading "load I2 negative" 18 field
+          "Put in rI2 the contents of cell no. M, with opposite sign.
+Uses a + when there is no sign in subfield, otherwise use the opposite sign.
+Subfield is left padded with zeros to make a word. Index registers only
+have 2 bytes and a sign, Trying to set anything more that that will result
+in undefined behavior."
+          2)
+
+    (LD3N loading "load I3 negative" 19 field
+          "Put in rI3 the contents of cell no. M, with opposite sign.
+Uses a + when there is no sign in subfield, otherwise use the opposite sign.
+Subfield is left padded with zeros to make a word. Index registers only
+have 2 bytes and a sign, Trying to set anything more that that will result
+in undefined behavior."
+          2)
+
+    (LD4N loading "load I4 negative" 20 field
+          "Put in rI4 the contents of cell no. M, with opposite sign.
+Uses a + when there is no sign in subfield, otherwise use the opposite sign.
+Subfield is left padded with zeros to make a word. Index registers only
+have 2 bytes and a sign, Trying to set anything more that that will result
+in undefined behavior."
+          2)
+
+    (LD5N loading "load I5 negative" 21 field
+          "Put in rI5 the contents of cell no. M, with opposite sign.
+Uses a + when there is no sign in subfield, otherwise use the opposite sign.
+Subfield is left padded with zeros to make a word. Index registers only
+have 2 bytes and a sign, Trying to set anything more that that will result
+in undefined behavior."
+          2)
+
+    (LD6N loading "load I6 negative" 22 field
+          "Put in rI6 the contents of cell no. M, with opposite sign.
+Uses a + when there is no sign in subfield, otherwise use the opposite sign.
+Subfield is left padded with zeros to make a word. Index registers only
+have 2 bytes and a sign, Trying to set anything more that that will result
+in undefined behavior."
+          2)
+
+    (STA storing "store A" 24 field
+         "Store in cell Nr. M the contents of rA.
+The modification of the operation code represents the subfield of the
+memory cell that is to be overwritten with bytes from a register. These
+bytes are taken beginning by the rightmost side of the register. The
+sign of the memory cell is not changed, unless it is part of the subfield."
+         2)
+
+    (STX storing "store X" 31 field
+         "Store in cell Nr. M the contents of rX.
+The modification of the operation code represents the subfield of the
+memory cell that is to be overwritten with bytes from a register. These
+bytes are taken beginning by the rightmost side of the register. The
+sign of the memory cell is not changed, unless it is part of the subfield."
+         2)
+
+    (ST1 storing "store I1" 25 field
+         "Store in cell Nr. M the contents of rI1.
+The modification of the operation code represents the subfield of the
+memory cell that is to be overwritten with bytes from a register. These
+bytes are taken beginning by the rightmost side of the register. The
+sign of the memory cell is not changed, unless it is part of the subfield.
+Because index registers only have 2 bytes and a sign, the rest of the bytes
+are assumed to be 0."
+         2)
+
+    (ST2 storing "store I2" 26 field
+         "Store in cell Nr. M the contents of rI2.
+The modification of the operation code represents the subfield of the
+memory cell that is to be overwritten with bytes from a register. These
+bytes are taken beginning by the rightmost side of the register. The
+sign of the memory cell is not changed, unless it is part of the subfield.
+Because index registers only have 2 bytes and a sign, the rest of the bytes
+are assumed to be 0."
+         2)
+
+    (ST3 storing "store I3" 27 field
+         "Store in cell Nr. M the contents of rI3.
+The modification of the operation code represents the subfield of the
+memory cell that is to be overwritten with bytes from a register. These
+bytes are taken beginning by the rightmost side of the register. The
+sign of the memory cell is not changed, unless it is part of the subfield.
+Because index registers only have 2 bytes and a sign, the rest of the bytes
+are assumed to be 0."
+         2)
+
+    (ST4 storing "store I4" 28 field
+         "Store in cell Nr. M the contents of rI4.
+The modification of the operation code represents the subfield of the
+memory cell that is to be overwritten with bytes from a register. These
+bytes are taken beginning by the rightmost side of the register. The
+sign of the memory cell is not changed, unless it is part of the subfield.
+Because index registers only have 2 bytes and a sign, the rest of the bytes
+are assumed to be 0."
+         2)
+
+    (ST5 storing "store I5" 29 field
+         "Store in cell Nr. M the contents of rI5.
+The modification of the operation code represents the subfield of the
+memory cell that is to be overwritten with bytes from a register. These
+bytes are taken beginning by the rightmost side of the register. The
+sign of the memory cell is not changed, unless it is part of the subfield.
+Because index registers only have 2 bytes and a sign, the rest of the bytes
+are assumed to be 0."
+         2)
+
+    (ST6 storing "store I6" 30 field
+         "Store in cell Nr. M the contents of rI6.
+The modification of the operation code represents the subfield of the
+memory cell that is to be overwritten with bytes from a register. These
+bytes are taken beginning by the rightmost side of the register. The
+sign of the memory cell is not changed, unless it is part of the subfield.
+Because index registers only have 2 bytes and a sign, the rest of the bytes
+are assumed to be 0."
+         2)
+
+    (STJ storing "store J" 32 field
+         "Store in cell Nr. M the contents of rJ.
+The modification of the operation code represents the subfield of the
+memory cell that is to be overwritten with bytes from a register. These
+bytes are taken beginning by the rightmost side of the register. The sign
+of rJ is always +, sign of the memory cell is not changed, unless it is
+part of the subfield. The default field for STJ is (0:2)."
+         2)
+
+    (STZ storing "store zero" 33 field
+         "Store in cell Nr. M '+ 0'.
+The modification of the operation code represents the subfield of the
+memory cell that is to be overwritten with zeros."
+         2)
+
+    (ADD arithmetic "add" 1 field
+         "Add to A the contents of cell Nr. M.
+Subfield is padded with zero to make a word.
+If the result is to large, the operation result modulo 1,073,741,823 (the
+maximum value storable in a MIX word) is stored in `rA', and the overflow
+toggle is set to TRUE."
+         2)
+
+    (SUB arithmetic "subtract" 2 field
+         "Subtract to A the contents of cell Nr. M.
+Subfield is padded with zero to make a word.
+If the result is to large, the operation result modulo 1,073,741,823 (the
+maximum value storable in a MIX word) is stored in `rA', and the overflow
+toggle is set to TRUE."
+         2)
+
+    (MUL arithmetic "multiply" 3 field
+         "Multiplies the contents of cell Nr. M with A, result is 10 bytes and stored in rA and rX.
+The sign is + if the sign of rA and cell M where the same, otherwise, it is -"
+         10)
+
+    (DIV arithmetic "divide" 4 field
+         "Both rA and rX are taken together and divided by cell Nr. M, quotient is placed in rA, remainder in rX.
+The sign is taken from rA, and after the divide the sign of rA is set to + when
+both the sign of rA and M where the same. Divide by zero and overflow of rA
+result in undefined behavior."
+         12)
+
+    (ENTA address-transfer "enter A" 48
+          "Literal value is stored in rA.
+Indexed, stores value of index in rA."
+          1)
+
+    (ENTX address-transfer "enter X" 55
+          "Literal value is stored in rX.
+Indexed, stores value of index in rX."
+          1)
+
+    (ENT1 address-transfer "Enter rI1" 49
+          "Literal value is stored in rI1.
+Indexed, stores value of index in rI1."
+          1)
+
+    (ENT2 address-transfer "Enter rI2" 50
+          "Literal value is stored in rI2.
+Indexed, stores value of index in rI2."
+          1)
+
+    (ENT3 address-transfer "Enter rI3" 51
+          "Literal value is stored in rI3.
+Indexed, stores value of index in rI3."
+          1)
+
+    (ENT4 address-transfer "Enter rI4" 52
+          "Literal value is stored in rI4.
+Indexed, stores value of index in rI4."
+          1)
+
+    (ENT5 address-transfer "Enter rI5" 53
+          "Literal value is stored in rI5.
+Indexed, stores value of index in rI5."
+          1)
+
+    (ENT6 address-transfer "Enter rI6" 54
+          "Literal value is stored in rI6.
+Indexed, stores value of index in rI6."
+          1)
+
+    (ENNA address-transfer "enter negative A" 48
+          "Literal value is stored in rA with opposite sign.
+Indexed, stores value of index in rA with opposite sign."
+          1)
+
+    (ENNX address-transfer "enter negative X" 55
+          "Literal value is stored in rX with opposite sign.
+Indexed, stores value of index in rX with opposite sign."
+          1)
+
+    (ENN1 address-transfer "Enter negative rI1" 49
+          "Literal value is stored in rI1 with opposite sign.
+Indexed, stores value of index in rI1 with opposite sign."
+          1)
+
+    (ENN2 address-transfer "Enter negative rI2" 50
+          "Literal value is stored in rI2 with opposite sign.
+Indexed, stores value of index in rI2 with opposite sign."
+          1)
+
+    (ENN3 address-transfer "Enter negative rI3" 51
+          "Literal value is stored in rI3 with opposite sign.
+Indexed, stores value of index in rI3 with opposite sign."
+          1)
+
+    (ENN4 address-transfer "Enter negative rI4" 52
+          "Literal value is stored in rI4 with opposite sign.
+Indexed, stores value of index in rI4 with opposite sign."
+          1)
+
+    (ENN5 address-transfer "Enter negative rI5" 53
+          "Literal value is stored in rI5 with opposite sign.
+Indexed, stores value of index in rI5 with opposite sign."
+          1)
+
+    (ENN6 address-transfer "Enter negative rI6" 54
+          "Literal value is stored in rI6 with opposite sign.
+Indexed, stores value of index in rI6 with opposite sign."
+          1)
+
+    (INCA address-transfer "increase A" 48
+          "Increase register A with the literal value of M.
+On overflow the overflow toggle is set."
+          1)
+
+    (INCX address-transfer "increase X" 55
+          "Increase register X with the literal value of M.
+On overflow the overflow toggle is set."
+          1)
+
+    (INC1 address-transfer "increase I1" 49
+          "Increase register I1 with the literal value of M.
+The result is undefined when the result does not fit in
+2 bytes."
+          1)
+
+    (INC2 address-transfer "increase I2" 50
+          "Increase register I2 with the literal value of M.
+The result is undefined when the result does not fit in
+2 bytes."
+          1)
+
+    (INC3 address-transfer "increase I3" 51
+          "Increase register I3 with the literal value of M.
+The result is undefined when the result does not fit in
+2 bytes."
+          1)
+
+    (INC4 address-transfer "increase I4" 52
+          "Increase register I4 with the literal value of M.
+The result is undefined when the result does not fit in
+2 bytes."
+          1)
+
+    (INC5 address-transfer "increase I5" 53
+          "Increase register I5 with the literal value of M.
+The result is undefined when the result does not fit in
+2 bytes."
+          1)
+
+    (INC6 address-transfer "increase I6" 54
+          "Increase register I6 with the literal value of M.
+The result is undefined when the result does not fit in
+2 bytes."
+          1)
+
+    (DECA address-transfer "decrease A" 48
+          "Decrease register A with the literal value of M.
+On overflow the overflow toggle is set."
+          1)
+
+    (DECX address-transfer "decrease X" 55
+          "Decrease register X with the literal value of M.
+On overflow the overflow toggle is set."
+          1)
+
+    (DEC1 address-transfer "decrease I1" 49
+          "Decrease register I1 with the literal value of M.
+The result is undefined when the result does not fit in
+2 bytes."
+          1)
+
+    (DEC2 address-transfer "decrease I2" 50
+          "Decrease register I2 with the literal value of M.
+The result is undefined when the result does not fit in
+2 bytes."
+          1)
+
+    (DEC3 address-transfer "decrease I3" 51
+          "Decrease register I3 with the literal value of M.
+The result is undefined when the result does not fit in
+2 bytes."
+          1)
+
+    (DEC4 address-transfer "decrease I4" 52
+          "Decrease register I4 with the literal value of M.
+The result is undefined when the result does not fit in
+2 bytes."
+          1)
+
+    (DEC5 address-transfer "decrease I5" 53
+          "Decrease register I5 with the literal value of M.
+The result is undefined when the result does not fit in
+2 bytes."
+          1)
+
+    (DEC6 address-transfer "decrease I6" 54
+          "Decrease register I6 with the literal value of M.
+The result is undefined when the result does not fit in
+2 bytes."
+          1)
+
+    (CMPA comparison "compare A" 56 field
+          "Compare contents of A with contents of M.
+The field specifier works on both fields. The comparison indicator
+is set to LESS, EQUAL or GREATER depending on the outcome."
+          2)
+
+    (CMPX comparison "compare X" 63 field
+          "Compare contents of rX with contents of M.
+The field specifier works on both fields. The comparison indicator
+is set to LESS, EQUAL or GREATER depending on the outcome."
+          2)
+
+    (CMP1 comparison "compare I1" 57 field
+          "Compare contents of rI1 with contents of M.
+The field specifier works on both fields. The comparison indicator
+is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
+have a value of 0."
+          2)
+
+    (CMP2 comparison "compare I2" 58 field
+          "Compare contents of rI2 with contents of M.
+The field specifier works on both fields. The comparison indicator
+is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
+have a value of 0."
+          2)
+
+    (CMP3 comparison "compare I3" 59 field
+          "Compare contents of rI3 with contents of M.
+The field specifier works on both fields. The comparison indicator
+is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
+have a value of 0."
+          2)
+
+    (CMP4 comparison "compare I4" 60 field
+          "Compare contents of rI4 with contents of M.
+The field specifier works on both fields. The comparison indicator
+is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
+have a value of 0."
+          2)
+
+    (CMP5 comparison "compare I5" 61 field
+          "Compare contents of rI5 with contents of M.
+The field specifier works on both fields. The comparison indicator
+is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
+have a value of 0."
+          2)
+
+    (CMP6 comparison "compare I6" 62 field
+          "Compare contents of rI6 with contents of M.
+The field specifier works on both fields. The comparison indicator
+is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
+have a value of 0."
+          2)
+
+    (JMP jump "jump" 39
+         "Unconditional jump.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (JSJ jump "jump, save J" 39
+         "Unconditional jump, but rJ is not modified."
+         1)
+
+    (JOV jump "jump on overflow" 39
+         "Jump if OV is set (and turn it off).
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (JNOV jump "Jump on no overflow" 39
+          "Jump if OV is not set (and turn it off).
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (JL jump "Jump on less" 39
+        "Jump if '[CM] = L'.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+        1)
+
+    (JE jump "Jump on equal" 39
+        "Jump if '[CM] = E'.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+        1)
+
+    (JG jump "Jump on greater" 39
+        "Jump if '[CM] = G'.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+        1)
+
+    (JGE jump "Jump on not less" 39
+         "Jump if '[CM]' does not equal 'L'.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (JNE jump "Jump on not equal" 39
+         "Jump if '[CM]' does not equal 'E'.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (JLE jump "Jump on not greater" 39
+         "Jump if '[CM]' does not equal 'G'.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (JAN jump "jump A negative" 40
+         "Jump if the content of rA is negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (JAZ jump "jump A zero" 40
+         "Jump if the content of rA is zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (JAP jump "jump A positive" 40
+         "Jump if the content of rA is positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (JANN jump "jump A non-negative" 40
+          "Jump if the content of rA is non-negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (JANZ jump "jump A non-zero" 40
+          "Jump if the content of rA is non-zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (JANP jump "jump A non-positive" 40
+          "Jump if the content of rA is non-positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (JXN jump "jump X negative" 47
+         "Jump if the content of rX is negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (JXZ jump "jump X zero" 47
+         "Jump if the content of rX is zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (JXP jump "jump X positive" 47
+         "Jump if the content of rX is positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (JXNN jump "jump X non-negative" 47
+          "Jump if the content of rX is non-negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (JXNZ jump "jump X non-zero" 47
+          "Jump if the content of rX is non-zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (JXNP jump "jump X non-positive" 47
+          "Jump if the content of rX is non-positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J1N jump "jump I1 negative" 41
+         "Jump if the content of rI1 is negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J1Z jump "jump I1 zero" 41
+         "Jump if the content of rI1 is zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J1P jump "jump I1 positive" 41
+         "Jump if the content of rI1 is positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J1NN jump "jump I1 non-negative" 41
+          "Jump if the content of rI1 is non-negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J1NZ jump "jump I1 non-zero" 41
+          "Jump if the content of rI1 is non-zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J1NP jump "jump I1 non-positive" 41
+          "Jump if the content of rI1 is non-positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J2N jump "jump I2 negative" 41
+         "Jump if the content of rI2 is negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J2Z jump "jump I2 zero" 41
+         "Jump if the content of rI2 is zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J2P jump "jump I2 positive" 41
+         "Jump if the content of rI2 is positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J2NN jump "jump I2 non-negative" 41
+          "Jump if the content of rI2 is non-negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J2NZ jump "jump I2 non-zero" 41
+          "Jump if the content of rI2 is non-zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J2NP jump "jump I2 non-positive" 41
+          "Jump if the content of rI2 is non-positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J3N jump "jump I3 negative" 41
+         "Jump if the content of rI3 is negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J3Z jump "jump I3 zero" 41
+         "Jump if the content of rI3 is zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J3P jump "jump I3 positive" 41
+         "Jump if the content of rI3 is positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J3NN jump "jump I3 non-negative" 41
+          "Jump if the content of rI3 is non-negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J3NZ jump "jump I3 non-zero" 41
+          "Jump if the content of rI3 is non-zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J3NP jump "jump I3 non-positive" 41
+          "Jump if the content of rI3 is non-positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J4N jump "jump I4 negative" 41
+         "Jump if the content of rI4 is negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J4Z jump "jump I4 zero" 41
+         "Jump if the content of rI4 is zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J4P jump "jump I4 positive" 41
+         "Jump if the content of rI4 is positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J4NN jump "jump I4 non-negative" 41
+          "Jump if the content of rI4 is non-negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J4NZ jump "jump I4 non-zero" 41
+          "Jump if the content of rI4 is non-zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J4NP jump "jump I4 non-positive" 41
+          "Jump if the content of rI4 is non-positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J5N jump "jump I5 negative" 41
+         "Jump if the content of rI5 is negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J5Z jump "jump I5 zero" 41
+         "Jump if the content of rI5 is zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J5P jump "jump I5 positive" 41
+         "Jump if the content of rI5 is positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J5NN jump "jump I5 non-negative" 41
+          "Jump if the content of rI5 is non-negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J5NZ jump "jump I5 non-zero" 41
+          "Jump if the content of rI5 is non-zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J5NP jump "jump I5 non-positive" 41
+          "Jump if the content of rI5 is non-positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J6N jump "jump I6 negative" 41
+         "Jump if the content of rI6 is negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J6Z jump "jump I6 zero" 41
+         "Jump if the content of rI6 is zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J6P jump "jump I6 positive" 41
+         "Jump if the content of rI6 is positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+         1)
+
+    (J6NN jump "jump I6 non-negative" 41
+          "Jump if the content of rI6 is non-negative.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J6NZ jump "jump I6 non-zero" 41
+          "Jump if the content of rI6 is non-zero.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (J6NP jump "jump I6 non-positive" 41
+          "Jump if the content of rI6 is non-positive.
+Register J is set to the value of the next instruction that would have
+been executed when there was no jump."
+          1)
+
+    (SLA miscellaneous "shift left A" 6
+         "Shift to A, M bytes left.
+Hero's will be added to the right."
+         2)
+
+    (SRA miscellaneous "shift right A" 6
+         "Shift to A, M bytes right.
+Zeros will be added to the left."
+         2)
+
+    (SLAX miscellaneous "shift left AX" 6
+          "Shift AX, M bytes left.
+Zeros will be added to the right."
+          2)
+
+
+    (SRAX miscellaneous "shift right AX" 6
+          "Shift AX, M bytes right.
+Zeros will be added to the left."
+          2)
+
+    (SLC miscellaneous "shift left AX circularly" 6
+         "Shift AX, M bytes left circularly.
+The bytes that fall off to the left will be added to the right."
+         2)
+
+    (SRC miscellaneous "shift right AX circularly" 6
+         "Shift AX, M bytes right circularly.
+The bytes that fall off to the right will be added to the left."
+         2)
+
+    (MOVE miscellaneous "move" 7 number
+          "Move MOD words from M to the location stored in rI1."
+          (+ 1 (* 2 number)))
+
+    (NOP miscellaneous "no operation" 0 ignored
+         "No operation, M and F are not used by the machine."
+         1)
+
+    (HLT miscellaneous "halt" 5
+         "Halt.
+Stop instruction fetching."
+         1)
+
+    (IN input-output "input" 36 unit
+        "Transfer a block of words from the specified unit to memory.
+The transfer starts at address M."
+        1)
+
+    (OUT input-output "output" 37 unit
+         "Transfer a block of words from memory.
+The transfer starts at address M to the specified unit."
+         1)
+
+    (IOC input-output "input-output control" 35 unit
+         "Perform a control operation.
+The control operation is given by M on the specified unit."
+         1)
+
+    (JRED input-output "jump ready" 38 unit
+          "Jump to M if the specified unit is ready."
+          1)
+
+    (JBUS input-output "jump busy" 34 unit
+          "Jump to M if the specified unit is busy."
+          1)
+
+    (NUM conversion "convert to numeric" 5
+         "Convert rAX to its numerical value and store it in rA.
+the register rAX is assumed to contain a character representation of
+a number."
+         10)
+
+    (CHAR conversion "convert to characters" 5
+          "Convert the number stored in rA to a character representation.
+The converted character representation is stored in rAX."
+          10))
+
   "Alist that contains all the possible operation codes for mix.
 Each elt has the form
   (OP-CODE GROUP FULL-NAME C-BYTE F-BYTE DESCRIPTION EXECUTION-TIME)
@@ -162,1114 +1025,36 @@
 EXECUTION-TIME holds info about the time it takes, number or string.")
 ;; (makunbound 'mixal-operation-codes-alist)
 
-(defun mixal-add-operation-code (op-code group full-name C-byte F-byte
-                                         description execution-time)
-  "Add an operation code to `mixal-operation-codes-alist'."
-  (setq mixal-operation-codes-alist
-        (cons (list op-code group full-name C-byte F-byte
-                    description execution-time)
-              mixal-operation-codes-alist)))
 
-;; now add each operation code
-
-(mixal-add-operation-code
- 'LDA 'loading "load A" 8 'field
- "Put in rA the contents of cell no. M.
-Uses a + when there is no sign in subfield. Subfield is left padded with
-zeros to make a word."
- 2)
-
-(mixal-add-operation-code
- 'LDX 'loading "load X" 15 'field
- "Put in rX the contents of cell no. M.
-Uses a + when there is no sign in subfield. Subfield is left padded with
-zeros to make a word."
- 2)
-
-(mixal-add-operation-code
- 'LD1 'loading "load I1" (+ 8 1) 'field
- "Put in rI1 the contents of cell no. M.
-Uses a + when there is no sign in subfield. Subfield is left padded with
-zeros to make a word. Index registers only have 2 bytes and a sign, Trying
-to set anything more that that will result in undefined behavior."
- 2)
-
-(mixal-add-operation-code
- 'LD2 'loading "load I2" (+ 8 2) 'field
- "Put in rI2 the contents of cell no. M.
-Uses a + when there is no sign in subfield. Subfield is left padded with
-zeros to make a word. Index registers only have 2 bytes and a sign, Trying
-to set anything more that that will result in undefined behavior."
- 2)
-
-(mixal-add-operation-code
- 'LD3 'loading "load I3" (+ 8 3) 'field
- "Put in rI3 the contents of cell no. M.
-Uses a + when there is no sign in subfield. Subfield is left padded with
-zeros to make a word. Index registers only have 2 bytes and a sign, Trying
-to set anything more that that will result in undefined behavior."
- 2)
-
-(mixal-add-operation-code
- 'LD4 'loading "load I4" (+ 8 4) 'field
- "Put in rI4 the contents of cell no. M.
-Uses a + when there is no sign in subfield. Subfield is left padded with
-zeros to make a word. Index registers only have 2 bytes and a sign, Trying
-to set anything more that that will result in undefined behavior."
- 2)
-
-(mixal-add-operation-code
- 'LD5 'loading "load I5" (+ 8 5) 'field
- "Put in rI5 the contents of cell no. M.
-Uses a + when there is no sign in subfield. Subfield is left padded with
-zeros to make a word. Index registers only have 2 bytes and a sign, Trying
-to set anything more that that will result in undefined behavior."
- 2)
-
-(mixal-add-operation-code
- 'LD6 'loading "load I6" (+ 8 6) 'field
- "Put in rI6 the contents of cell no. M.
-Uses a + when there is no sign in subfield. Subfield is left padded with
-zeros to make a word. Index registers only have 2 bytes and a sign, Trying
-to set anything more that that will result in undefined behavior."
- 2)
-
-(mixal-add-operation-code
- 'LDAN 'loading "load A negative" 16 'field
- "Put in rA the contents of cell no. M, with opposite sign.
-Uses a + when there is no sign in subfield, otherwise use the opposite sign.
-Subfield is left padded with zeros to make a word."
- 2)
-
-(mixal-add-operation-code
- 'LDXN 'loading "load X negative" 23 'field
- "Put in rX the contents of cell no. M, with opposite sign.
-Uses a + when there is no sign in subfield, otherwise use the opposite sign.
-Subfield is left padded with zeros to make a word."
- 2)
-
-(mixal-add-operation-code
- 'LD1N 'loading "load I1 negative" (+ 16 1) 'field
- "Put in rI1 the contents of cell no. M, with opposite sign.
-Uses a + when there is no sign in subfield, otherwise use the opposite sign.
-Subfield is left padded with zeros to make a word. Index registers only
-have 2 bytes and a sign, Trying to set anything more that that will result
-in undefined behavior."
- 2)
-
-(mixal-add-operation-code
- 'LD2N 'loading "load I2 negative" (+ 16 2) 'field
- "Put in rI2 the contents of cell no. M, with opposite sign.
-Uses a + when there is no sign in subfield, otherwise use the opposite sign.
-Subfield is left padded with zeros to make a word. Index registers only
-have 2 bytes and a sign, Trying to set anything more that that will result
-in undefined behavior."
- 2)
-
-(mixal-add-operation-code
- 'LD3N 'loading "load I3 negative" (+ 16 3) 'field
- "Put in rI3 the contents of cell no. M, with opposite sign.
-Uses a + when there is no sign in subfield, otherwise use the opposite sign.
-Subfield is left padded with zeros to make a word. Index registers only
-have 2 bytes and a sign, Trying to set anything more that that will result
-in undefined behavior."
- 2)
-
-(mixal-add-operation-code
- 'LD4N 'loading "load I4 negative" (+ 16 4) 'field
- "Put in rI4 the contents of cell no. M, with opposite sign.
-Uses a + when there is no sign in subfield, otherwise use the opposite sign.
-Subfield is left padded with zeros to make a word. Index registers only
-have 2 bytes and a sign, Trying to set anything more that that will result
-in undefined behavior."
- 2)
-
-(mixal-add-operation-code
- 'LD5N 'loading "load I5 negative" (+ 16 5) 'field
- "Put in rI5 the contents of cell no. M, with opposite sign.
-Uses a + when there is no sign in subfield, otherwise use the opposite sign.
-Subfield is left padded with zeros to make a word. Index registers only
-have 2 bytes and a sign, Trying to set anything more that that will result
-in undefined behavior."
- 2)
-
-(mixal-add-operation-code
- 'LD6N 'loading "load I6 negative" (+ 16 6) 'field
- "Put in rI6 the contents of cell no. M, with opposite sign.
-Uses a + when there is no sign in subfield, otherwise use the opposite sign.
-Subfield is left padded with zeros to make a word. Index registers only
-have 2 bytes and a sign, Trying to set anything more that that will result
-in undefined behavior."
- 2)
-
-(mixal-add-operation-code
- 'STA 'storing "store A" 24 'field
- "Store in cell Nr. M the contents of rA.
-The modification of the operation code represents the subfield of the
-memory cell that is to be overwritten with bytes from a register. These
-bytes are taken beginning by the rightmost side of the register. The
-sign of the memory cell is not changed, unless it is part of the subfield."
- 2)
-
-(mixal-add-operation-code
- 'STX 'storing "store X" 31 'field
- "Store in cell Nr. M the contents of rX.
-The modification of the operation code represents the subfield of the
-memory cell that is to be overwritten with bytes from a register. These
-bytes are taken beginning by the rightmost side of the register. The
-sign of the memory cell is not changed, unless it is part of the subfield."
- 2)
-
-(mixal-add-operation-code
- 'ST1 'storing "store I1" (+ 24 1) 'field
- "Store in cell Nr. M the contents of rI1.
-The modification of the operation code represents the subfield of the
-memory cell that is to be overwritten with bytes from a register. These
-bytes are taken beginning by the rightmost side of the register. The
-sign of the memory cell is not changed, unless it is part of the subfield.
-Because index registers only have 2 bytes and a sign, the rest of the bytes
-are assumed to be 0."
- 2)
-
-(mixal-add-operation-code
- 'ST2 'storing "store I2" (+ 24 2) 'field
- "Store in cell Nr. M the contents of rI2.
-The modification of the operation code represents the subfield of the
-memory cell that is to be overwritten with bytes from a register. These
-bytes are taken beginning by the rightmost side of the register. The
-sign of the memory cell is not changed, unless it is part of the subfield.
-Because index registers only have 2 bytes and a sign, the rest of the bytes
-are assumed to be 0."
- 2)
-
-(mixal-add-operation-code
- 'ST3 'storing "store I3" (+ 24 3) 'field
- "Store in cell Nr. M the contents of rI3.
-The modification of the operation code represents the subfield of the
-memory cell that is to be overwritten with bytes from a register. These
-bytes are taken beginning by the rightmost side of the register. The
-sign of the memory cell is not changed, unless it is part of the subfield.
-Because index registers only have 2 bytes and a sign, the rest of the bytes
-are assumed to be 0."
- 2)
-
-(mixal-add-operation-code
- 'ST4 'storing "store I4" (+ 24 4) 'field
- "Store in cell Nr. M the contents of rI4.
-The modification of the operation code represents the subfield of the
-memory cell that is to be overwritten with bytes from a register. These
-bytes are taken beginning by the rightmost side of the register. The
-sign of the memory cell is not changed, unless it is part of the subfield.
-Because index registers only have 2 bytes and a sign, the rest of the bytes
-are assumed to be 0."
- 2)
-
-(mixal-add-operation-code
- 'ST5 'storing "store I5" (+ 24 5) 'field
- "Store in cell Nr. M the contents of rI5.
-The modification of the operation code represents the subfield of the
-memory cell that is to be overwritten with bytes from a register. These
-bytes are taken beginning by the rightmost side of the register. The
-sign of the memory cell is not changed, unless it is part of the subfield.
-Because index registers only have 2 bytes and a sign, the rest of the bytes
-are assumed to be 0."
- 2)
-
-(mixal-add-operation-code
- 'ST6 'storing "store I6" (+ 24 6) 'field
- "Store in cell Nr. M the contents of rI6.
-The modification of the operation code represents the subfield of the
-memory cell that is to be overwritten with bytes from a register. These
-bytes are taken beginning by the rightmost side of the register. The
-sign of the memory cell is not changed, unless it is part of the subfield.
-Because index registers only have 2 bytes and a sign, the rest of the bytes
-are assumed to be 0."
- 2)
-
-(mixal-add-operation-code
- 'STJ 'storing "store J" 32 'field
- "Store in cell Nr. M the contents of rJ.
-The modification of the operation code represents the subfield of the
-memory cell that is to be overwritten with bytes from a register. These
-bytes are taken beginning by the rightmost side of the register. The sign
-of rJ is always +, sign of the memory cell is not changed, unless it is
-part of the subfield. The default field for STJ is (0:2)."
- 2)
-
-(mixal-add-operation-code
- 'STZ 'storing "store zero" 33 'field
- "Store in cell Nr. M '+ 0'.
-The modification of the operation code represents the subfield of the
-memory cell that is to be overwritten with zeros."
- 2)
-
-(mixal-add-operation-code
- 'ADD 'arithmetic "add" 1 'field
- "Add to A the contents of cell Nr. M.
-Subfield is padded with zero to make a word.
-If the result is to large, the operation result modulo 1,073,741,823 (the
-maximum value storable in a MIX word) is stored in `rA', and the overflow
-toggle is set to TRUE."
- 2)
-
-(mixal-add-operation-code
- 'SUB 'arithmetic "subtract" 2 'field
- "Subtract to A the contents of cell Nr. M.
-Subfield is padded with zero to make a word.
-If the result is to large, the operation result modulo 1,073,741,823 (the
-maximum value storable in a MIX word) is stored in `rA', and the overflow
-toggle is set to TRUE."
- 2)
-
-(mixal-add-operation-code
- 'MUL 'arithmetic "multiply" 3 'field
- "Multiplies the contents of cell Nr. M with A, result is 10 bytes and stored in rA and rX.
-The sign is + if the sign of rA and cell M where the same, otherwise, it is -"
- 10)
-
-(mixal-add-operation-code
- 'DIV 'arithmetic "divide" 4 'field
- "Both rA and rX are taken together and divided by cell Nr. M, quotient is placed in rA, remainder in rX.
-The sign is taken from rA, and after the divide the sign of rA is set to + when
-both the sign of rA and M where the same. Divide by zero and overflow of rA result
-in undefined behavior."
- 12)
-
-(mixal-add-operation-code
- 'ENTA 'address-transfer "enter A" 48 2
- "Literal value is stored in rA.
-Indexed, stores value of index in rA."
- 1)
-
-(mixal-add-operation-code
- 'ENTX 'address-transfer "enter X" 55 2
- "Literal value is stored in rX.
-Indexed, stores value of index in rX."
- 1)
-
-(mixal-add-operation-code
- 'ENT1 'address-transfer "Enter rI1" (+ 48 1) 2
- "Literal value is stored in rI1.
-Indexed, stores value of index in rI1."
- 1)
-
-(mixal-add-operation-code
- 'ENT2 'address-transfer "Enter rI2" (+ 48 2) 2
- "Literal value is stored in rI2.
-Indexed, stores value of index in rI2."
- 1)
-
-(mixal-add-operation-code
- 'ENT3 'address-transfer "Enter rI3" (+ 48 3) 2
- "Literal value is stored in rI3.
-Indexed, stores value of index in rI3."
- 1)
-
-(mixal-add-operation-code
- 'ENT4 'address-transfer "Enter rI4" (+ 48 4) 2
- "Literal value is stored in rI4.
-Indexed, stores value of index in rI4."
- 1)
-
-(mixal-add-operation-code
- 'ENT5 'address-transfer "Enter rI5" (+ 48 5) 2
- "Literal value is stored in rI5.
-Indexed, stores value of index in rI5."
- 1)
-
-(mixal-add-operation-code
- 'ENT6 'address-transfer "Enter rI6" (+ 48 6) 2
- "Literal value is stored in rI6.
-Indexed, stores value of index in rI6."
- 1)
-
-(mixal-add-operation-code
- 'ENNA 'address-transfer "enter negative A" 48 3
- "Literal value is stored in rA with opposite sign.
-Indexed, stores value of index in rA with opposite sign."
- 1)
-
-(mixal-add-operation-code
- 'ENNX 'address-transfer "enter negative X" 55 3
- "Literal value is stored in rX with opposite sign.
-Indexed, stores value of index in rX with opposite sign."
- 1)
-
-(mixal-add-operation-code
- 'ENN1 'address-transfer "Enter negative rI1" (+ 48 1) 3
- "Literal value is stored in rI1 with opposite sign.
-Indexed, stores value of index in rI1 with opposite sign."
- 1)
-
-(mixal-add-operation-code
- 'ENN2 'address-transfer "Enter negative rI2" (+ 48 2) 3
- "Literal value is stored in rI2 with opposite sign.
-Indexed, stores value of index in rI2 with opposite sign."
- 1)
-
-(mixal-add-operation-code
- 'ENN3 'address-transfer "Enter negative rI3" (+ 48 3) 3
- "Literal value is stored in rI3 with opposite sign.
-Indexed, stores value of index in rI3 with opposite sign."
- 1)
-
-(mixal-add-operation-code
- 'ENN4 'address-transfer "Enter negative rI4" (+ 48 4) 3
- "Literal value is stored in rI4 with opposite sign.
-Indexed, stores value of index in rI4 with opposite sign."
- 1)
-
-(mixal-add-operation-code
- 'ENN5 'address-transfer "Enter negative rI5" (+ 48 5) 3
- "Literal value is stored in rI5 with opposite sign.
-Indexed, stores value of index in rI5 with opposite sign."
- 1)
-
-(mixal-add-operation-code
- 'ENN6 'address-transfer "Enter negative rI6" (+ 48 6) 3
- "Literal value is stored in rI6 with opposite sign.
-Indexed, stores value of index in rI6 with opposite sign."
- 1)
-
-(mixal-add-operation-code
- 'INCA 'address-transfer "increase A" 48 0
- "Increase register A with the literal value of M.
-On overflow the overflow toggle is set."
- 1)
-
-(mixal-add-operation-code
- 'INCX 'address-transfer "increase X" 55 0
- "Increase register X with the literal value of M.
-On overflow the overflow toggle is set."
- 1)
-
-(mixal-add-operation-code
- 'INC1 'address-transfer "increase I1" (+ 48 1) 0
- "Increase register I1 with the literal value of M.
-The result is undefined when the result does not fit in
-2 bytes."
- 1)
-
-(mixal-add-operation-code
- 'INC2 'address-transfer "increase I2" (+ 48 2) 0
- "Increase register I2 with the literal value of M.
-The result is undefined when the result does not fit in
-2 bytes."
- 1)
-
-(mixal-add-operation-code
- 'INC3 'address-transfer "increase I3" (+ 48 3) 0
- "Increase register I3 with the literal value of M.
-The result is undefined when the result does not fit in
-2 bytes."
- 1)
-
-(mixal-add-operation-code
- 'INC4 'address-transfer "increase I4" (+ 48 4) 0
- "Increase register I4 with the literal value of M.
-The result is undefined when the result does not fit in
-2 bytes."
- 1)
-
-(mixal-add-operation-code
- 'INC5 'address-transfer "increase I5" (+ 48 5) 0
- "Increase register I5 with the literal value of M.
-The result is undefined when the result does not fit in
-2 bytes."
- 1)
-
-(mixal-add-operation-code
- 'INC6 'address-transfer "increase I6" (+ 48 6) 0
- "Increase register I6 with the literal value of M.
-The result is undefined when the result does not fit in
-2 bytes."
- 1)
-
-(mixal-add-operation-code
- 'DECA 'address-transfer "decrease A" 48 1
- "Decrease register A with the literal value of M.
-On overflow the overflow toggle is set."
- 1)
-
-(mixal-add-operation-code
- 'DECX 'address-transfer "decrease X" 55 1
- "Decrease register X with the literal value of M.
-On overflow the overflow toggle is set."
- 1)
-
-(mixal-add-operation-code
- 'DEC1 'address-transfer "decrease I1" (+ 48 1) 1
- "Decrease register I1 with the literal value of M.
-The result is undefined when the result does not fit in
-2 bytes."
- 1)
-
-(mixal-add-operation-code
- 'DEC2 'address-transfer "decrease I2" (+ 48 2) 1
- "Decrease register I2 with the literal value of M.
-The result is undefined when the result does not fit in
-2 bytes."
- 1)
-
-(mixal-add-operation-code
- 'DEC3 'address-transfer "decrease I3" (+ 48 3) 1
- "Decrease register I3 with the literal value of M.
-The result is undefined when the result does not fit in
-2 bytes."
- 1)
-
-(mixal-add-operation-code
- 'DEC4 'address-transfer "decrease I4" (+ 48 4) 1
- "Decrease register I4 with the literal value of M.
-The result is undefined when the result does not fit in
-2 bytes."
- 1)
-
-(mixal-add-operation-code
- 'DEC5 'address-transfer "decrease I5" (+ 48 5) 1
- "Decrease register I5 with the literal value of M.
-The result is undefined when the result does not fit in
-2 bytes."
- 1)
-
-(mixal-add-operation-code
- 'DEC6 'address-transfer "decrease I6" (+ 48 6) 1
- "Decrease register I6 with the literal value of M.
-The result is undefined when the result does not fit in
-2 bytes."
- 1)
-
-(mixal-add-operation-code
- 'CMPA 'comparison "compare A" 56 'field
- "Compare contents of A with contents of M.
-The field specifier works on both fields. The comparison indicator
-is set to LESS, EQUAL or GREATER depending on the outcome."
- 2)
-
-
-(mixal-add-operation-code
- 'CMPX 'comparison "compare X" 63 'field
- "Compare contents of rX with contents of M.
-The field specifier works on both fields. The comparison indicator
-is set to LESS, EQUAL or GREATER depending on the outcome."
- 2)
-
-
-(mixal-add-operation-code
- 'CMP1 'comparison "compare I1" (+ 56 1) 'field
- "Compare contents of rI1 with contents of M.
-The field specifier works on both fields. The comparison indicator
-is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
-have a value of 0."
- 2)
-
-
-(mixal-add-operation-code
- 'CMP2 'comparison "compare I2" (+ 56 2) 'field
- "Compare contents of rI2 with contents of M.
-The field specifier works on both fields. The comparison indicator
-is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
-have a value of 0."
- 2)
-
-
-(mixal-add-operation-code
- 'CMP3 'comparison "compare I3" (+ 56 3) 'field
- "Compare contents of rI3 with contents of M.
-The field specifier works on both fields. The comparison indicator
-is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
-have a value of 0."
- 2)
-
-
-(mixal-add-operation-code
- 'CMP4 'comparison "compare I4" (+ 56 4) 'field
- "Compare contents of rI4 with contents of M.
-The field specifier works on both fields. The comparison indicator
-is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
-have a value of 0."
- 2)
-
-
-(mixal-add-operation-code
- 'CMP5 'comparison "compare I5" (+ 56 5) 'field
- "Compare contents of rI5 with contents of M.
-The field specifier works on both fields. The comparison indicator
-is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
-have a value of 0."
- 2)
-
-
-(mixal-add-operation-code
- 'CMP6 'comparison "compare I6" (+ 56 6) 'field
- "Compare contents of rI6 with contents of M.
-The field specifier works on both fields. The comparison indicator
-is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3
-have a value of 0."
- 2)
+;;; Font-locking:
+(defvar mixal-font-lock-syntactic-keywords
+  ;; Normal comments start with a * in column 0 and end at end of line.
+  '(("^\\*" (0 '(11)))                  ;(string-to-syntax "<") == '(11)
+    ;; Every line can end with a comment which is placed after the operand.
+    ;; I assume here that mnemonics without operands can not have a comment.
+    ("^[[:alnum:]]*[ \t]+[[:alnum:]]+[ \t]+[^ \n\t]+[ \t]*\\([ \t]\\)[^\n \t]"
+     (1 '(11)))))
 
-(mixal-add-operation-code
- 'JMP 'jump "jump" 39 0
- "Unconditional jump.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-(mixal-add-operation-code
- 'JSJ 'jump "jump, save J" 39 1
- "Unconditional jump, but rJ is not modified."
- 1)
-
-(mixal-add-operation-code
- 'JOV 'jump "jump on overflow" 39 2
- "Jump if OV is set (and turn it off).
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-(mixal-add-operation-code
- 'JNOV 'jump "Jump on no overflow" 39 3
- "Jump if OV is not set (and turn it off).
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-(mixal-add-operation-code
- 'JL 'jump "Jump on less" 39 4
- "Jump if '[CM] = L'.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JE 'jump "Jump on equal" 39 5
- "Jump if '[CM] = E'.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JG 'jump "Jump on greater" 39 6
- "Jump if '[CM] = G'.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JGE 'jump "Jump on not less" 39 7
- "Jump if '[CM]' does not equal 'L'.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JNE 'jump "Jump on not equal" 39 8
- "Jump if '[CM]' does not equal 'E'.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JLE 'jump "Jump on not greater" 39 9
- "Jump if '[CM]' does not equal 'G'.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-(mixal-add-operation-code
- 'JAN 'jump "jump A negative" 40 0
- "Jump if the content of rA is negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JAZ 'jump "jump A zero" 40 1
- "Jump if the content of rA is zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JAP 'jump "jump A positive" 40 2
- "Jump if the content of rA is positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JANN 'jump "jump A non-negative" 40 3
- "Jump if the content of rA is non-negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JANZ 'jump "jump A non-zero" 40 4
- "Jump if the content of rA is non-zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JANP 'jump "jump A non-positive" 40 5
- "Jump if the content of rA is non-positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-(mixal-add-operation-code
- 'JXN 'jump "jump X negative" 47 0
- "Jump if the content of rX is negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JXZ 'jump "jump X zero" 47 1
- "Jump if the content of rX is zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JXP 'jump "jump X positive" 47 2
- "Jump if the content of rX is positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JXNN 'jump "jump X non-negative" 47 3
- "Jump if the content of rX is non-negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JXNZ 'jump "jump X non-zero" 47 4
- "Jump if the content of rX is non-zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'JXNP 'jump "jump X non-positive" 47 5
- "Jump if the content of rX is non-positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-(mixal-add-operation-code
- 'J1N 'jump "jump I1 negative" (+ 40 1) 0
- "Jump if the content of rI1 is negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J1Z 'jump "jump I1 zero" (+ 40 1) 1
- "Jump if the content of rI1 is zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J1P 'jump "jump I1 positive" (+ 40 1) 2
- "Jump if the content of rI1 is positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J1NN 'jump "jump I1 non-negative" (+ 40 1) 3
- "Jump if the content of rI1 is non-negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J1NZ 'jump "jump I1 non-zero" (+ 40 1) 4
- "Jump if the content of rI1 is non-zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J1NP 'jump "jump I1 non-positive" (+ 40 1) 5
- "Jump if the content of rI1 is non-positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-(mixal-add-operation-code
- 'J2N 'jump "jump I2 negative" (+ 40 1) 0
- "Jump if the content of rI2 is negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J2Z 'jump "jump I2 zero" (+ 40 1) 1
- "Jump if the content of rI2 is zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J2P 'jump "jump I2 positive" (+ 40 1) 2
- "Jump if the content of rI2 is positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J2NN 'jump "jump I2 non-negative" (+ 40 1) 3
- "Jump if the content of rI2 is non-negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J2NZ 'jump "jump I2 non-zero" (+ 40 1) 4
- "Jump if the content of rI2 is non-zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J2NP 'jump "jump I2 non-positive" (+ 40 1) 5
- "Jump if the content of rI2 is non-positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J3N 'jump "jump I3 negative" (+ 40 1) 0
- "Jump if the content of rI3 is negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J3Z 'jump "jump I3 zero" (+ 40 1) 1
- "Jump if the content of rI3 is zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J3P 'jump "jump I3 positive" (+ 40 1) 2
- "Jump if the content of rI3 is positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J3NN 'jump "jump I3 non-negative" (+ 40 1) 3
- "Jump if the content of rI3 is non-negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J3NZ 'jump "jump I3 non-zero" (+ 40 1) 4
- "Jump if the content of rI3 is non-zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J3NP 'jump "jump I3 non-positive" (+ 40 1) 5
- "Jump if the content of rI3 is non-positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J4N 'jump "jump I4 negative" (+ 40 1) 0
- "Jump if the content of rI4 is negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J4Z 'jump "jump I4 zero" (+ 40 1) 1
- "Jump if the content of rI4 is zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J4P 'jump "jump I4 positive" (+ 40 1) 2
- "Jump if the content of rI4 is positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J4NN 'jump "jump I4 non-negative" (+ 40 1) 3
- "Jump if the content of rI4 is non-negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J4NZ 'jump "jump I4 non-zero" (+ 40 1) 4
- "Jump if the content of rI4 is non-zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J4NP 'jump "jump I4 non-positive" (+ 40 1) 5
- "Jump if the content of rI4 is non-positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J5N 'jump "jump I5 negative" (+ 40 1) 0
- "Jump if the content of rI5 is negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J5Z 'jump "jump I5 zero" (+ 40 1) 1
- "Jump if the content of rI5 is zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J5P 'jump "jump I5 positive" (+ 40 1) 2
- "Jump if the content of rI5 is positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J5NN 'jump "jump I5 non-negative" (+ 40 1) 3
- "Jump if the content of rI5 is non-negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J5NZ 'jump "jump I5 non-zero" (+ 40 1) 4
- "Jump if the content of rI5 is non-zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J5NP 'jump "jump I5 non-positive" (+ 40 1) 5
- "Jump if the content of rI5 is non-positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J6N 'jump "jump I6 negative" (+ 40 1) 0
- "Jump if the content of rI6 is negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J6Z 'jump "jump I6 zero" (+ 40 1) 1
- "Jump if the content of rI6 is zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J6P 'jump "jump I6 positive" (+ 40 1) 2
- "Jump if the content of rI6 is positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J6NN 'jump "jump I6 non-negative" (+ 40 1) 3
- "Jump if the content of rI6 is non-negative.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J6NZ 'jump "jump I6 non-zero" (+ 40 1) 4
- "Jump if the content of rI6 is non-zero.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-
-(mixal-add-operation-code
- 'J6NP 'jump "jump I6 non-positive" (+ 40 1) 5
- "Jump if the content of rI6 is non-positive.
-Register J is set to the value of the next instruction that would have
-been executed when there was no jump."
- 1)
-
-(mixal-add-operation-code
- 'SLA 'miscellaneous "shift left A" 6 0
- "Shift to A, M bytes left.
-Hero's will be added to the right."
- 2)
-
-
-(mixal-add-operation-code
- 'SRA 'miscellaneous "shift right A" 6 1
- "Shift to A, M bytes right.
-Zeros will be added to the left."
- 2)
-
-
-(mixal-add-operation-code
- 'SLAX 'miscellaneous "shift left AX" 6 2
- "Shift AX, M bytes left.
-Zeros will be added to the right."
- 2)
-
-
-
-(mixal-add-operation-code
- 'SRAX 'miscellaneous "shift right AX" 6 3
- "Shift AX, M bytes right.
-Zeros will be added to the left."
- 2)
-
-
-(mixal-add-operation-code
- 'SLC 'miscellaneous "shift left AX circularly" 6 4
- "Shift AX, M bytes left circularly.
-The bytes that fall off to the left will be added to the right."
- 2)
-
-
-(mixal-add-operation-code
- 'SRC 'miscellaneous "shift right AX circularly" 6 4
- "Shift AX, M bytes right circularly.
-The bytes that fall off to the right will be added to the left."
- 2)
-
-(mixal-add-operation-code
- 'MOVE 'miscellaneous "move" 7 'number
- "Move MOD words from M to the location stored in rI1."
- '(+ 1 (* 2 number)))
-
-(mixal-add-operation-code
- 'NOP 'miscellaneous "no operation" 0 'ignored
- "No operation, M and F are not used by the machine."
- 1)
-
-(mixal-add-operation-code
- 'HLT 'miscellaneous "halt" 5 2
- "Halt.
-Stop instruction fetching."
- 1)
-
-(mixal-add-operation-code
- 'IN 'input-output "input" 36 'unit
- "Transfer a block of words from the specified unit to memory.
-The transfer starts at address M."
- 1)
-
-(mixal-add-operation-code
- 'OUT 'input-output "output" 37 'unit
- "Transfer a block of words from memory.
-The transfer starts at address M to the specified unit."
- 1)
-
-(mixal-add-operation-code
- 'IOC 'input-output "input-output control" 35 'unit
- "Perform a control operation.
-The control operation is given by M on the specified unit."
- 1)
-
-(mixal-add-operation-code
- 'JRED 'input-output "jump ready" 38 'unit
- "Jump to M if the specified unit is ready."
- 1)
-
-
-(mixal-add-operation-code
- 'JBUS 'input-output "jump busy" 34 'unit
- "Jump to M if the specified unit is busy."
- 1)
-
-(mixal-add-operation-code
- 'NUM 'conversion "convert to numeric" 5 0
- "Convert rAX to its numerical value and store it in rA.
-the register rAX is assumed to contain a character representation of
-a number."
- 10)
-
-(mixal-add-operation-code
- 'CHAR 'conversion "convert to characters" 5 1
- "Convert the number stored in rA to a character representation.
-The converted character representation is stored in rAX."
- 10)
+(defvar mixal-font-lock-keywords
+  `(("^\\([A-Z0-9a-z]+\\)"
+     (1 mixal-font-lock-label-face))
+    (,(regexp-opt (mapcar (lambda (x) (symbol-name (car x)))
+                          mixal-operation-codes-alist) 'words)
+     . mixal-font-lock-operation-code-face)
+    (,(regexp-opt mixal-assembly-pseudoinstructions 'words)
+     . mixal-font-lock-assembly-pseudoinstruction-face)
+    ("^[A-Z0-9a-z]*[ \t]+[A-ZO-9a-z]+[ \t]+\\(=.*=\\)"
+     (1 font-lock-constant-face)))
+  "Keyword highlighting specification for `mixal-mode'.")
+;; (makunbound 'mixal-font-lock-keywords)
 
 (defvar mixal-describe-operation-code-history nil
   "History list for describe operation code.")
 
-(defun mixal-describe-operation-code (&optional op-code)
+(defun mixal-describe-operation-code (op-code)
   "Display the full documentation of OP-CODE."
-  (interactive)
-  ;; We like to provide completion and history, so do it ourself
-  ;; (interactive "?bla")?
-  (unless op-code
+  (interactive
+   (list
     (let* ((completion-ignore-case t)
 	   ;; we already have a list, but it is not in the right format
 	   ;; transform it to a valid table so completition can use it
@@ -1277,15 +1062,16 @@
 			     (cons (symbol-name (car elm)) nil))
 			  mixal-operation-codes-alist))
 	   ;; prompt is different depending on we are close to a valid op-code
-	   (have-default (member (current-word) mixal-operation-codes))
+	   (have-default (assq (intern-soft (current-word))
+                               mixal-operation-codes-alist))
 	   (prompt (concat "Describe operation code "
 			   (if have-default
 			       (concat "(default " (current-word) "): ")
 			     ": "))))
-      ;; as the operation code to the user
-      (setq op-code (completing-read prompt table nil t nil
-				     'mixal-describe-operation-code-history
-				     (current-word)))))
+      ;; As the operation code to the user.
+      (completing-read prompt table nil t nil
+                       'mixal-describe-operation-code-history
+                       (current-word)))))
   ;; get the info on the op-code and output it to the help buffer
   (let ((op-code-help (assq (intern-soft op-code) mixal-operation-codes-alist)))
     (when op-code-help
@@ -1317,8 +1103,11 @@
   "Major mode for the mixal asm language.
 \\{mixal-mode-map}"
   (set (make-local-variable 'comment-start) "*")
-  (set (make-local-variable 'comment-start-skip) "*")
-  (set (make-local-variable 'font-lock-defaults) '(mixal-font-lock-keywords))
+  (set (make-local-variable 'comment-start-skip) "^\\*[ \t]*")
+  (set (make-local-variable 'font-lock-defaults)
+       `(mixal-font-lock-keywords nil nil nil nil
+         (font-lock-syntactic-keywords . ,mixal-font-lock-syntactic-keywords)
+         (parse-sexp-lookup-properties . t)))
   ;; might add an indent function in the future
   ;;  (set (make-local-variable 'indent-line-function) 'mixal-indent-line)
   (set (make-local-variable 'compile-command) (concat "mixasm "
--- a/lisp/startup.el	Wed Oct 12 16:14:04 2005 +0000
+++ b/lisp/startup.el	Wed Oct 19 14:03:44 2005 +0000
@@ -128,7 +128,7 @@
     ("-bg" 1 x-handle-switch background-color)
     ("-background" 1 x-handle-switch background-color)
     ("-ms" 1 x-handle-switch mouse-color)
-    ("-nb" 0 x-handle-switch icon-type nil)
+    ("-nbi" 0 x-handle-switch icon-type nil)
     ("-iconic" 0 x-handle-iconic)
     ("-xrm" 1 x-handle-xrm-switch)
     ("-cr" 1 x-handle-switch cursor-color)
@@ -1232,7 +1232,13 @@
 the user caused an input event by hitting a key or clicking with the
 mouse."
   (interactive)
-  (push last-command-event unread-command-events)
+  (if (and (consp last-command-event)
+	   (eq (posn-window (event-start last-command-event))
+	       (selected-window)))
+      ;; This is a mouse-down event in the spash screen window.
+      ;; Ignore it and consume the corresponding mouse-up event.
+      (read-event)
+    (push last-command-event unread-command-events))
   (throw 'exit nil))
 
 
--- a/lisp/toolbar/README	Wed Oct 12 16:14:04 2005 +0000
+++ b/lisp/toolbar/README	Wed Oct 19 14:03:44 2005 +0000
@@ -7,4 +7,6 @@
 
     back_arrow.xpm and fwd_arrow.xpm are slightly modified undo and redo.
 
+    diropen.xpm is file-manager.png from Gnome hicolor theme.
+
 They are not part of Emacs, but distributed and used by Emacs.
Binary file lisp/toolbar/diropen.pbm has changed
--- a/lisp/toolbar/diropen.xpm	Wed Oct 12 16:14:04 2005 +0000
+++ b/lisp/toolbar/diropen.xpm	Wed Oct 19 14:03:44 2005 +0000
@@ -1,215 +1,44 @@
 /* XPM */
 static char * diropen_xpm[] = {
-"24 24 188 2",
-"  	c None",
-". 	c #000000",
-"+ 	c #010100",
-"@ 	c #B5B8A5",
-"# 	c #E4E7D2",
-"$ 	c #878A76",
-"% 	c #33342B",
-"& 	c #0B0B0B",
-"* 	c #E2E5CF",
-"= 	c #CFD4AF",
-"- 	c #CED3AE",
-"; 	c #B2B696",
-"> 	c #2D2D25",
-", 	c #23241D",
-"' 	c #9D9F90",
-") 	c #C6CAA6",
-"! 	c #C4C9A5",
-"~ 	c #C6CBA7",
-"{ 	c #C7CCA8",
-"] 	c #C9CEA9",
-"^ 	c #555847",
-"/ 	c #1A1B15",
-"( 	c #20201A",
-"_ 	c #D4D6C2",
-": 	c #BEC2A0",
-"< 	c #B3B896",
-"[ 	c #B0B595",
-"} 	c #B3B797",
-"| 	c #B6BB99",
-"1 	c #BBC09E",
-"2 	c #BCC19F",
-"3 	c #81856C",
-"4 	c #3E3F32",
-"5 	c #010101",
-"6 	c #DADDC8",
-"7 	c #AFB494",
-"8 	c #AAAF8F",
-"9 	c #A3A789",
-"0 	c #A6AA8B",
-"a 	c #A9AD8E",
-"b 	c #A7AB8D",
-"c 	c #A4A88A",
-"d 	c #A1A588",
-"e 	c #AAAD96",
-"f 	c #B3B5A5",
-"g 	c #B8BBAA",
-"h 	c #BABCAB",
-"i 	c #40413B",
-"j 	c #CACDBB",
-"k 	c #BABDA8",
-"l 	c #0C0C09",
-"m 	c #DDDFCB",
-"n 	c #969B7E",
-"o 	c #9DA286",
-"p 	c #95987C",
-"q 	c #96997E",
-"r 	c #9A9D81",
-"s 	c #999D80",
-"t 	c #9DA184",
-"u 	c #A5AA8B",
-"v 	c #A4A98A",
-"w 	c #A3A889",
-"x 	c #A2A588",
-"y 	c #33352B",
-"z 	c #9B9E83",
-"A 	c #898D74",
-"B 	c #D8DBC9",
-"C 	c #84866E",
-"D 	c #7D8169",
-"E 	c #151612",
-"F 	c #D7DAC9",
-"G 	c #797D67",
-"H 	c #3D3F34",
-"I 	c #E0E0D9",
-"J 	c #EBEDDD",
-"K 	c #E8EBD9",
-"L 	c #D8DBCA",
-"M 	c #1A1A18",
-"N 	c #0A0A09",
-"O 	c #6E7067",
-"P 	c #8D8F84",
-"Q 	c #4A4B45",
-"R 	c #2C2D29",
-"S 	c #4B4C46",
-"T 	c #E7EAD8",
-"U 	c #E3E6D4",
-"V 	c #DEE1D0",
-"W 	c #DADCCC",
-"X 	c #DADCD1",
-"Y 	c #2B2C28",
-"Z 	c #D7DAC6",
-"` 	c #6F735E",
-" .	c #0D0D0D",
-"..	c #F4F4EC",
-"+.	c #606251",
-"@.	c #92957B",
-"#.	c #4A4C3E",
-"$.	c #434438",
-"%.	c #CACFAB",
-"&.	c #C6CBA8",
-"*.	c #C2C6A4",
-"=.	c #ABB091",
-"-.	c #23251E",
-";.	c #494B3D",
-">.	c #DCDCD4",
-",.	c #EAECDD",
-"'.	c #CDD2AD",
-").	c #20201B",
-"!.	c #1C1C17",
-"~.	c #A4A88B",
-"{.	c #414337",
-"].	c #BABF9D",
-"^.	c #B5B999",
-"/.	c #81836C",
-"(.	c #070806",
-"_.	c #D5D8C4",
-":.	c #161616",
-"<.	c #F2F2EA",
-"[.	c #CACFAA",
-"}.	c #050504",
-"|.	c #3C3D32",
-"1.	c #C9CEAA",
-"2.	c #C8CDA9",
-"3.	c #BFC4A2",
-"4.	c #3E4035",
-"5.	c #BCC09F",
-"6.	c #B6BB9A",
-"7.	c #B0B494",
-"8.	c #9DA185",
-"9.	c #535445",
-"0.	c #B6B8A7",
-"a.	c #747470",
-"b.	c #ECECE2",
-"c.	c #C3C8A5",
-"d.	c #C2C7A4",
-"e.	c #393B30",
-"f.	c #BFC4A1",
-"g.	c #BDC2A0",
-"h.	c #C0C5A2",
-"i.	c #3A3B31",
-"j.	c #A9AD8F",
-"k.	c #A3A78A",
-"l.	c #80836D",
-"m.	c #020201",
-"n.	c #A6A998",
-"o.	c #B8BC9B",
-"p.	c #1B1C17",
-"q.	c #181814",
-"r.	c #AFB394",
-"s.	c #ACB091",
-"t.	c #878A72",
-"u.	c #9B9F83",
-"v.	c #9A9D82",
-"w.	c #8A8D75",
-"x.	c #4F5243",
-"y.	c #070705",
-"z.	c #9E9F91",
-"A.	c #E5E6DA",
-"B.	c #ADB192",
-"C.	c #A6AA8C",
-"D.	c #A5A98C",
-"E.	c #4B4D3F",
-"F.	c #70735F",
-"G.	c #9FA286",
-"H.	c #999D81",
-"I.	c #35362D",
-"J.	c #2D2E26",
-"K.	c #8A8D74",
-"L.	c #71735F",
-"M.	c #080908",
-"N.	c #E3E5D9",
-"O.	c #C0C3AF",
-"P.	c #94987C",
-"Q.	c #8F9379",
-"R.	c #8B8F75",
-"S.	c #8A8E74",
-"T.	c #888C73",
-"U.	c #7D816A",
-"V.	c #0E0F0C",
-"W.	c #3E4034",
-"X.	c #4E5042",
-"Y.	c #282922",
-"Z.	c #121310",
-"`.	c #24251F",
-" +	c #71745F",
-".+	c #6A6D59",
-"++	c #434538",
-"@+	c #080907",
-"                                                ",
-"                                                ",
-"                                                ",
-"    . . . . . . .                               ",
-"  + @ # # # # # $ %                             ",
-"  & * = = = - - ; >                             ",
-", ' * ) ! ~ { ] ] ^ /         . .               ",
-"( _ : < [ } | 1 2 3 4 5 . . . . . . .           ",
-", 6 7 8 9 0 8 a b c d e f g h . i j k .         ",
-"l m n o p q r s q t u v w x 9 . y z A .         ",
-". B C D E . . . . . . . . . . . . . . . 5 5     ",
-". F G H I J K K L M N O P Q R . S T U V W X Y   ",
-". Z `  ...= = = +.. @.= = = #.. $.%.&.*.1 =.-.  ",
-". Z ;.>.,.'.- - ).!.'.'.'.'.~.. {.&.*.].^./.(.  ",
-". _.:.<.%.[.%.[.}.|.1.{ 2.2.3.. 4.5.6.7.8.9.l   ",
-". 0.a.b.c.d.d.*.}.e.f.g.h.g.} . i.[ j.k.l.m.    ",
-". n.>.o.o.^.} } p.q.r.r.r.s.t.. % u.v.w.x.y.    ",
-". z.A.B.j.C.D.k.E.. F.G.u.H.I.. J.K.K.L.M.      ",
-". N.O.P.Q.R.S.T.U.V.}.W.X.Y.Z.. `. +.+++@+      ",
-"  . . . . . . . . . . . . . . . . . . }.        ",
-"                                                ",
-"                                                ",
-"                                                ",
-"                                                "};
+"19 24 17 1",
+" 	c None",
+".	c #000100",
+"+	c #C6C9A6",
+"@	c #D0D3AF",
+"#	c #93997C",
+"$	c #E6E7D0",
+"%	c #BEC19E",
+"&	c #B4B895",
+"*	c #A7AA88",
+"=	c #6B6D59",
+"-	c #4A4E40",
+";	c #7C8166",
+">	c #898E72",
+",	c #3C4032",
+"'	c #575845",
+")	c #34332C",
+"!	c #24231D",
+"  ...............  ",
+" .+@@@@@@@@@@@@@#. ",
+".$@@@@@@@@@@@@@@@#.",
+".++++%%%%%%%%%&&&*.",
+".&&&&&&&&&&******#.",
+".*%+++%%%%%%%%%&=#.",
+".*+***********##-#.",
+".*+****;===;####-#.",
+".*+****=*****###-#.",
+".*+****;*****###-#.",
+".*+****########>-#.",
+".*&######>>>>>>>,>.",
+".*#-------------'>)",
+".*&&&&&&&&&&&&&*#>)",
+".*&************#'>)",
+".*&***********##,>)",
+".*&****====;###>,>)",
+".#&****=**#**##>,;)",
+".#&****>****###>,;)",
+".#&****########>,;)",
+".##''''''''''''',;)",
+".#>==============;)",
+".''''''''''''''''-!",
+" ................. "};
--- a/man/ChangeLog	Wed Oct 12 16:14:04 2005 +0000
+++ b/man/ChangeLog	Wed Oct 19 14:03:44 2005 +0000
@@ -1,3 +1,16 @@
+2005-10-13  Kenichi Handa  <handa@m17n.org>
+
+	* basic.texi (Position Info): Fix previous change.
+
+2005-10-12  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
+
+	* cmdargs.texi (Icons X): Fix typo.
+
+2005-10-12  Kenichi Handa  <handa@m17n.org>
+
+	* basic.texi (Position Info): Describe the case that Emacs shows
+	"part of display ...".
+
 2005-10-11  Jay Belanger  <belanger@truman.edu>
 
 	* calc.texi (Integration): Mention using `a i' to compute definite
--- a/man/basic.texi	Wed Oct 12 16:14:04 2005 +0000
+++ b/man/basic.texi	Wed Oct 19 14:03:44 2005 +0000
@@ -636,10 +636,17 @@
   The four values after @samp{Char:} describe the character that follows
 point, first by showing it and then by giving its character code in
 octal, decimal and hex.  For a non-@acronym{ASCII} multibyte character, these are
-followed by @samp{ext} and the character's representation, in hex, in
+followed by @samp{file} and the character's representation, in hex, in
 the buffer's coding system, if that coding system encodes the character
 safely and with a single byte (@pxref{Coding Systems}).  If the
-character's encoding is longer than one byte, Emacs shows @samp{ext ...}.
+character's encoding is longer than one byte, Emacs shows @samp{file ...}.
+
+  However, if the character displayed is in the range 0200 through
+0377 octal, it may actually stand for an invalid UTF-8 byte read from
+a file.  In Emacs, that byte is represented as a sequence of 8-bit
+characters, but all of them together display as the original invalid
+byte, in octal code.  In this case, @kbd{C-x =} shows @samp{part of
+display ...} instead of @samp{file}.
 
   @samp{point=} is followed by the position of point expressed as a character
 count.  The front of the buffer counts as position 1, one character later
--- a/man/cmdargs.texi	Wed Oct 12 16:14:04 2005 +0000
+++ b/man/cmdargs.texi	Wed Oct 19 14:03:44 2005 +0000
@@ -1188,7 +1188,7 @@
 @end table
 
   By default Emacs uses an icon window containing a picture of the GNU gnu.
-The @samp{-np} or @samp{--no-bitmap-icon} option tells Emacs to let the
+The @samp{-nbi} or @samp{--no-bitmap-icon} option tells Emacs to let the
 window manager choose what sort of icon to use---usually just a small
 rectangle containing the frame's title.
 
--- a/src/ChangeLog	Wed Oct 12 16:14:04 2005 +0000
+++ b/src/ChangeLog	Wed Oct 19 14:03:44 2005 +0000
@@ -1,3 +1,41 @@
+2005-10-14  Kim F. Storm  <storm@cua.dk>
+
+	* xterm.c (note_mouse_movement): Return 1 if mouse moved; 0 otherwise.
+	(handle_one_xevent): Only clear help_echo_string; restore it if
+	note_mouse_movement didn't record any mouse movement.
+
+	* xdisp.c (pos_visible_p): Convert w->hscroll to pixels before use.
+	(remember_mouse_glyph): Clear RECT if mouse is over an image glyph.
+
+	* keyboard.c (make_lispy_position): Adjust wx for left margin if ON_TEXT.
+	(Fposn_at_x_y): Fix calculation of x coordinate.
+	(Fposn_at_point): Return nil if point is hscrolled out of view.
+
+2005-10-13  Andreas Schwab  <schwab@suse.de>
+
+	* sysdep.c (request_sigio, unrequest_sigio): Do nothing in
+	non-interactive mode.
+
+2005-10-12  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+	* xterm.c, w32term.c, macterm.c (note_mouse_movement): Undo last change.
+
+2005-10-12  Kim F. Storm  <storm@cua.dk>
+
+	* xterm.c (handle_one_xevent): Clear last_mouse_glyph on mouse up/down.
+
+2005-10-12  Romain Francoise  <romain@orebokech.com>
+
+	* buffer.c (init_buffer): Rename `rc' to `len' for clarity.
+
+2005-10-12  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+	* xdisp.c (remember_mouse_glyph): Use MATRIX_BOTTOM_TEXT_ROW to
+	get end of text rows.  Obtain header-line/mode-line rows directly.
+
+	* xterm.c, w32term.c, macterm.c (note_mouse_movement): Restore
+	help_echo_string if mouse is moved inside last_mouse_glyph.
+
 2005-10-12  Kim F. Storm  <storm@cua.dk>
 
 	* xdisp.c (remember_mouse_glyph): New generic version based on
--- a/src/buffer.c	Wed Oct 12 16:14:04 2005 +0000
+++ b/src/buffer.c	Wed Oct 19 14:03:44 2005 +0000
@@ -5114,7 +5114,7 @@
   char *pwd;
   struct stat dotstat, pwdstat;
   Lisp_Object temp;
-  int rc;
+  int len;
 
 #ifdef USE_MMAP_FOR_BUFFERS
  {
@@ -5141,13 +5141,13 @@
 #ifndef VMS
   /* Maybe this should really use some standard subroutine
      whose definition is filename syntax dependent.  */
-  rc = strlen (pwd);
-  if (!(IS_DIRECTORY_SEP (pwd[rc - 1])))
+  len = strlen (pwd);
+  if (!(IS_DIRECTORY_SEP (pwd[len - 1])))
     {
       /* Grow buffer to add directory separator and '\0'.  */
-      pwd = (char *) xrealloc (pwd, rc + 2);
-      pwd[rc] = DIRECTORY_SEP;
-      pwd[rc + 1] = '\0';
+      pwd = (char *) xrealloc (pwd, len + 2);
+      pwd[len] = DIRECTORY_SEP;
+      pwd[len + 1] = '\0';
     }
 #endif /* not VMS */
 
--- a/src/keyboard.c	Wed Oct 12 16:14:04 2005 +0000
+++ b/src/keyboard.c	Wed Oct 19 14:03:44 2005 +0000
@@ -5108,7 +5108,11 @@
       XSETINT (*x, wx);
       XSETINT (*y, wy);
 
-      if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
+      if (part == ON_TEXT)
+	{
+	  wx += WINDOW_LEFT_MARGIN_WIDTH (w);
+	}
+      else if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
 	{
 	  /* Mode line or header line.  Look for a string under
 	     the mouse that may have a `local-map' property.  */
@@ -10779,11 +10783,11 @@
       CHECK_LIVE_WINDOW (frame_or_window);
 
       w = XWINDOW (frame_or_window);
-      XSETINT (x, (WINDOW_TO_FRAME_PIXEL_X (w, XINT (x))
+      XSETINT (x, (XINT (x)
+		   + WINDOW_LEFT_EDGE_X (w)
 		   + (NILP (whole)
 		      ? window_box_left_offset (w, TEXT_AREA)
-		      : - (WINDOW_LEFT_SCROLL_BAR_COLS (w)
-			   * WINDOW_FRAME_COLUMN_WIDTH (w)))));
+		      : 0)));
       XSETINT (y, WINDOW_TO_FRAME_PIXEL_Y (w, XINT (y)));
       frame_or_window = w->frame;
     }
@@ -10809,9 +10813,21 @@
 {
   Lisp_Object tem;
 
+  if (NILP (window))
+    window = selected_window;
+
   tem = Fpos_visible_in_window_p (pos, window, Qt);
   if (!NILP (tem))
-    tem = Fposn_at_x_y (XCAR (tem), XCAR (XCDR (tem)), window, Qnil);
+    {
+      Lisp_Object x = XCAR (tem);
+      Lisp_Object y = XCAR (XCDR (tem));
+
+      /* Point invisible due to hscrolling?  */
+      if (XINT (x) < 0)
+	return Qnil;
+      tem = Fposn_at_x_y (x, y, window, Qnil);
+    }
+
   return tem;
 }
 
--- a/src/sysdep.c	Wed Oct 12 16:14:04 2005 +0000
+++ b/src/sysdep.c	Wed Oct 19 14:03:44 2005 +0000
@@ -1032,6 +1032,7 @@
 
 #ifdef FASYNC		/* F_SETFL does not imply existence of FASYNC */
 /* XXX Uhm, FASYNC is not used anymore here. */
+/* XXX Yeah, but you need it for SIGIO, don't you? */
 
 void
 request_sigio ()
@@ -1039,7 +1040,7 @@
   /* XXX read_socket_hook is not global anymore.  Is blocking SIGIO
      bad under X? */
 #if 0
-  if (read_socket_hook)
+  if (noninteractive || read_socket_hook)
     return;
 #endif
 
@@ -1057,7 +1058,7 @@
   /* XXX read_socket_hook is not global anymore.  Is blocking SIGIO
      bad under X? */
 #if 0
-  if (read_socket_hook)
+  if (noninteractive || read_socket_hook)
     return;
 #endif
   
@@ -1076,7 +1077,7 @@
 {
   int on = 1;
 
-  if (read_socket_hook)
+  if (noninteractive || read_socket_hook)
     return;
 
   /* XXX CURTTY() is bogus here. */
@@ -1089,7 +1090,7 @@
 {
   int off = 0;
 
-  if (read_socket_hook)
+  if (noninteractive || read_socket_hook)
     return;
 
   /* XXX CURTTY() is bogus here. */
@@ -1109,7 +1110,7 @@
   int on = 1;
   sigset_t st;
 
-  if (read_socket_hook)
+  if (noninteractive || read_socket_hook)
     return;
 
   sigemptyset (&st);
@@ -1124,7 +1125,7 @@
 {
   int off = 0;
 
-  if (read_socket_hook)
+  if (noninteractive || read_socket_hook)
     return;
 
   ioctl (0, FIOASYNC, &off);  /* XXX This fails for multiple ttys. */
@@ -1137,7 +1138,7 @@
 void
 request_sigio ()
 {
-  if (read_socket_hook)
+  if (noninteractive || read_socket_hook)
     return;
 
   croak ("request_sigio");
@@ -1146,7 +1147,7 @@
 void
 unrequest_sigio ()
 {
-  if (read_socket_hook)
+  if (noninteractive || read_socket_hook)
     return;
 
   croak ("unrequest_sigio");
@@ -2335,12 +2336,16 @@
 void
 request_sigio ()
 {
+  if (noninteractive)
+    return;
   croak ("request sigio");
 }
 
 void
 unrequest_sigio ()
 {
+  if (noninteractive)
+    return;
   croak ("unrequest sigio");
 }
 
@@ -2884,6 +2889,8 @@
 void
 request_sigio ()
 {
+  if (noninteractive)
+    return;
   sigrelse (SIGTINT);
 
   interrupts_deferred = 0;
@@ -2892,6 +2899,8 @@
 void
 unrequest_sigio ()
 {
+  if (noninteractive)
+    return;
   sighold (SIGTINT);
 
   interrupts_deferred = 1;
--- a/src/xdisp.c	Wed Oct 12 16:14:04 2005 +0000
+++ b/src/xdisp.c	Wed Oct 19 14:03:44 2005 +0000
@@ -1335,7 +1335,7 @@
   current_header_line_height = current_mode_line_height = -1;
 
   if (visible_p && XFASTINT (w->hscroll) > 0)
-    *x -= XFASTINT (w->hscroll);
+    *x -= XFASTINT (w->hscroll) * WINDOW_FRAME_COLUMN_WIDTH (w);
 
   return visible_p;
 }
@@ -2047,7 +2047,7 @@
   height = WINDOW_FRAME_LINE_HEIGHT (w);
 
   r = MATRIX_FIRST_TEXT_ROW (w->current_matrix);
-  end_row = r + w->current_matrix->nrows - 1;
+  end_row = MATRIX_BOTTOM_TEXT_ROW (w->current_matrix, w);
 
   if (w->pseudo_window_p)
     {
@@ -2066,20 +2066,28 @@
       area = RIGHT_MARGIN_AREA;
       goto text_glyph;
 
-    case ON_TEXT:
+    case ON_HEADER_LINE:
     case ON_MODE_LINE:
-    case ON_HEADER_LINE:
+      gr = (part == ON_HEADER_LINE
+	    ? MATRIX_HEADER_LINE_ROW (w->current_matrix)
+	    : MATRIX_MODE_LINE_ROW (w->current_matrix));
+      gy = gr->y;
+      area = TEXT_AREA;
+      goto text_glyph_row_found;
+
+    case ON_TEXT:
       area = TEXT_AREA;
 
     text_glyph:
       gr = 0; gy = 0;
-      for (; r < end_row && r->enabled_p; ++r)
+      for (; r <= end_row && r->enabled_p; ++r)
 	if (r->y + r->height > y)
 	  {
 	    gr = r; gy = r->y;
 	    break;
 	  }
 
+    text_glyph_row_found:
       if (gr && gy <= y)
 	{
 	  struct glyph *g = gr->glyphs[area];
@@ -2091,7 +2099,16 @@
 	      break;
 
 	  if (g < end)
-	    width = g->pixel_width;
+	    {
+	      if (g->type == IMAGE_GLYPH)
+		{
+		  /* Don't remember when mouse is over image, as
+		     image may have hot-spots.  */
+		  STORE_NATIVE_RECT (*rect, 0, 0, 0, 0);
+		  return;
+		}
+	      width = g->pixel_width;
+	    }
 	  else
 	    {
 	      /* Use nominal char spacing at end of line.  */
@@ -2136,7 +2153,7 @@
 
     row_glyph:
       gr = 0, gy = 0;
-      for (; r < end_row && r->enabled_p; ++r)
+      for (; r <= end_row && r->enabled_p; ++r)
 	if (r->y + r->height > y)
 	  {
 	    gr = r; gy = r->y;
--- a/src/xterm.c	Wed Oct 12 16:14:04 2005 +0000
+++ b/src/xterm.c	Wed Oct 19 14:03:44 2005 +0000
@@ -3588,7 +3588,7 @@
 static XMotionEvent last_mouse_motion_event;
 static Lisp_Object last_mouse_motion_frame;
 
-static void
+static int
 note_mouse_movement (frame, event)
      FRAME_PTR frame;
      XMotionEvent *event;
@@ -3602,10 +3602,11 @@
       frame->mouse_moved = 1;
       last_mouse_scroll_bar = Qnil;
       note_mouse_highlight (frame, -1, -1);
+      return 1;
     }
 
   /* Has the mouse moved off the glyph it was on at the last sighting?  */
-  else if (event->x < last_mouse_glyph.x
+  if (event->x < last_mouse_glyph.x
 	   || event->x >= last_mouse_glyph.x + last_mouse_glyph.width
 	   || event->y < last_mouse_glyph.y
 	   || event->y >= last_mouse_glyph.y + last_mouse_glyph.height)
@@ -3615,7 +3616,10 @@
       note_mouse_highlight (frame, event->x, event->y);
       /* Remember which glyph we're now on.  */
       remember_mouse_glyph (frame, event->x, event->y, &last_mouse_glyph);
-    }
+      return 1;
+    }
+
+  return 0;
 }
 
 
@@ -6496,8 +6500,7 @@
     case MotionNotify:
       {
         previous_help_echo_string = help_echo_string;
-        help_echo_string = help_echo_object = help_echo_window = Qnil;
-        help_echo_pos = -1;
+        help_echo_string = Qnil;
 
         if (dpyinfo->grabbed && last_mouse_frame
             && FRAME_LIVE_P (last_mouse_frame))
@@ -6536,7 +6539,8 @@
 
                 last_window=window;
               }
-            note_mouse_movement (f, &event.xmotion);
+            if (!note_mouse_movement (f, &event.xmotion))
+	      help_echo_string = previous_help_echo_string;
           }
         else
           {
@@ -6645,6 +6649,7 @@
         int tool_bar_p = 0;
 
         bzero (&compose_status, sizeof (compose_status));
+	bzero (&last_mouse_glyph, sizeof (last_mouse_glyph));
 
         if (dpyinfo->grabbed
             && last_mouse_frame