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