| 1 | 2 | dgisselq | ////////////////////////////////////////////////////////////////////////////////
 | 
      
         | 2 |  |  | //
 | 
      
         | 3 |  |  | // Filename:    zopcodes.cpp
 | 
      
         | 4 |  |  | //
 | 
      
         | 5 |  |  | // Project:     Zip CPU -- a small, lightweight, RISC CPU core
 | 
      
         | 6 |  |  | //
 | 
      
         | 7 | 13 | dgisselq | // Purpose:     A simple program to handle the disassembly and definition
 | 
      
         | 8 |  |  | //              of the various Zip Assembly opcodes.  The primary function
 | 
      
         | 9 | 202 | dgisselq | //      of this file is the zipi_to_double_string, or Zip Instruction to a
 | 
      
         | 10 |  |  | //      pair of strings (disassemble) conversion.  The pair of strings is
 | 
      
         | 11 |  |  | //      necessary since Zip instruction words may contain two separate
 | 
      
         | 12 |  |  | //      instructions.
 | 
      
         | 13 | 2 | dgisselq | //
 | 
      
         | 14 |  |  | // Creator:     Dan Gisselquist, Ph.D.
 | 
      
         | 15 | 69 | dgisselq | //              Gisselquist Technology, LLC
 | 
      
         | 16 | 2 | dgisselq | //
 | 
      
         | 17 |  |  | ////////////////////////////////////////////////////////////////////////////////
 | 
      
         | 18 |  |  | //
 | 
      
         | 19 | 202 | dgisselq | // Copyright (C) 2015-2017, Gisselquist Technology, LLC
 | 
      
         | 20 | 2 | dgisselq | //
 | 
      
         | 21 |  |  | // This program is free software (firmware): you can redistribute it and/or
 | 
      
         | 22 |  |  | // modify it under the terms of  the GNU General Public License as published
 | 
      
         | 23 |  |  | // by the Free Software Foundation, either version 3 of the License, or (at
 | 
      
         | 24 |  |  | // your option) any later version.
 | 
      
         | 25 |  |  | //
 | 
      
         | 26 |  |  | // This program is distributed in the hope that it will be useful, but WITHOUT
 | 
      
         | 27 |  |  | // ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
 | 
      
         | 28 |  |  | // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 | 
      
         | 29 |  |  | // for more details.
 | 
      
         | 30 |  |  | //
 | 
      
         | 31 |  |  | // You should have received a copy of the GNU General Public License along
 | 
      
         | 32 | 202 | dgisselq | // with this program.  (It's in the $(ROOT)/doc directory.  Run make with no
 | 
      
         | 33 | 2 | dgisselq | // target there if the PDF file isn't present.)  If not, see
 | 
      
         | 34 |  |  | // <http://www.gnu.org/licenses/> for a copy.
 | 
      
         | 35 |  |  | //
 | 
      
         | 36 |  |  | // License:     GPL, v3, as defined and found on www.gnu.org,
 | 
      
         | 37 |  |  | //              http://www.gnu.org/licenses/gpl.html
 | 
      
         | 38 |  |  | //
 | 
      
         | 39 |  |  | //
 | 
      
         | 40 |  |  | ////////////////////////////////////////////////////////////////////////////////
 | 
      
         | 41 | 202 | dgisselq | //
 | 
      
         | 42 |  |  | //
 | 
      
         | 43 | 2 | dgisselq | #include <stdio.h>
 | 
      
         | 44 |  |  | #include <strings.h>
 | 
      
         | 45 |  |  | #include <string.h>
 | 
      
         | 46 |  |  | #include <assert.h>
 | 
      
         | 47 | 202 | dgisselq | #include <ctype.h>
 | 
      
         | 48 | 2 | dgisselq |  
 | 
      
         | 49 |  |  | #include "twoc.h"
 | 
      
         | 50 |  |  | #include "zopcodes.h"
 | 
      
         | 51 |  |  |  
 | 
      
         | 52 | 202 | dgisselq | const   char    *zip_regstr[] = {
 | 
      
         | 53 | 2 | dgisselq |         "R0", "R1", "R2", "R3",
 | 
      
         | 54 |  |  |         "R4", "R5", "R6", "R7",
 | 
      
         | 55 |  |  |         "R8", "R9", "R10","R11",
 | 
      
         | 56 |  |  |         "R12","SP", "CC", "PC",
 | 
      
         | 57 |  |  |         "uR0", "uR1", "uR2", "uR3",
 | 
      
         | 58 |  |  |         "uR4", "uR5", "uR6", "uR7",
 | 
      
         | 59 |  |  |         "uR8", "uR9", "uR10", "uR11",
 | 
      
         | 60 |  |  |         "uR12", "uSP", "uCC", "uPC",
 | 
      
         | 61 |  |  |         "sR0", "sR1", "sR2", "sR3",
 | 
      
         | 62 |  |  |         "sR4", "sR5", "sR6", "sR7",
 | 
      
         | 63 |  |  |         "sR8", "sR9", "sR10","sR11",
 | 
      
         | 64 | 202 | dgisselq |         "sR12","sSP", "sCC", "sPC", "rILL"
 | 
      
         | 65 | 2 | dgisselq | };
 | 
      
         | 66 |  |  |  
 | 
      
         | 67 | 202 | dgisselq | const   char    *zip_ccstr[8] = {
 | 
      
         | 68 |  |  |         "",  ".Z",  ".LT", ".C",
 | 
      
         | 69 |  |  |         ".V",".NZ", ".GE", ".NC"
 | 
      
         | 70 | 2 | dgisselq | };
 | 
      
         | 71 |  |  |  
 | 
      
         | 72 | 202 | dgisselq | static const ZOPCODE    zip_oplist_raw[] = {
 | 
      
         | 73 | 2 | dgisselq |         // Special case instructions.  These are general instructions, but with
 | 
      
         | 74 |  |  |         // special opcodes
 | 
      
         | 75 |  |  |         // Conditional branches
 | 
      
         | 76 | 69 | dgisselq |         //      0.1111.0111.ccc.0.111.10iiiii--
 | 
      
         | 77 |  |  |         //      0111 1011 11cc c011 110i iiii iiii iiii
 | 
      
         | 78 | 202 | dgisselq |         { "BUSY", 0xffc7ffff, 0x7883ffff, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_BITFIELD(3,19) },
 | 
      
         | 79 |  |  |         { "BZ",  0xfffc0000, 0x78880000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_OPUNUSED },
 | 
      
         | 80 |  |  |         { "BLT", 0xfffc0000, 0x78900000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_OPUNUSED },
 | 
      
         | 81 |  |  |         { "BC",  0xfffc0000, 0x78980000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_OPUNUSED },
 | 
      
         | 82 |  |  |         { "BV",  0xfffc0000, 0x78a00000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_OPUNUSED },
 | 
      
         | 83 |  |  |         { "BNZ",  0xfffc0000, 0x78a80000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_OPUNUSED },
 | 
      
         | 84 |  |  |         { "BGE",  0xfffc0000, 0x78b00000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_OPUNUSED },
 | 
      
         | 85 |  |  |         { "BNC",  0xfffc0000, 0x78b80000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_OPUNUSED },
 | 
      
         | 86 |  |  |         { "BRA",  0xffc40000, 0x78800000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 87 |  |  |         // Changes/updates to CC, based upon LDI
 | 
      
         | 88 |  |  |         { "TRAP", 0xfffffff0, 0x76000000, ZIP_OPUNUSED,ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED },
 | 
      
         | 89 |  |  |         { "TRAP", 0xff800000, 0x76000000, ZIP_OPUNUSED,ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED },
 | 
      
         | 90 |  |  |         // BREV based traps
 | 
      
         | 91 |  |  |         { "TRAP", 0xffc7ffff, 0x72000000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 92 |  |  |         // LDILO based traps
 | 
      
         | 93 |  |  |         { "TRAP",0xffc4ffff, 0x72400000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_BITFIELD(3,19) },
 | 
      
         | 94 |  |  |         { "TRAP",0xffc40000, 0x72400000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 95 | 69 | dgisselq |         // CLR -- a LDI of zero
 | 
      
         | 96 | 202 | dgisselq |         //      0.rrrr.1100.iiiiiii--
 | 
      
         | 97 |  |  |         //      0rrr r110 0...
 | 
      
         | 98 |  |  |         { "CLR",  0x87ffffff, 0x06000000, ZIP_REGFIELD(27),ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED },
 | 
      
         | 99 |  |  |         // BREV based clears
 | 
      
         | 100 |  |  |         { "CLR", 0x87c7ffff, 0x02000000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 101 | 69 | dgisselq |         // HALT
 | 
      
         | 102 |  |  |         //      0.1110.00011.ccc.0.0000000000010
 | 
      
         | 103 |  |  |         //      0111.0000.11cc.c000.0000.0000.0000.0010
 | 
      
         | 104 | 202 | dgisselq |         { "HALT", 0xffc7ffff, 0x70c00010, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_BITFIELD(3,19) },
 | 
      
         | 105 | 2 | dgisselq |         // The "wait" instruction is identical, with the only difference being
 | 
      
         | 106 | 69 | dgisselq |         // the interrrupt context of the processor.  Well, almost.  To
 | 
      
         | 107 |  |  |         // facilitate waits from supervisor mode, the wait instruction
 | 
      
         | 108 |  |  |         // explicitly forces the CPU into user mode.
 | 
      
         | 109 | 202 | dgisselq |         { "WAIT", 0xffc7ffff, 0x70c00030, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_BITFIELD(3,19) },
 | 
      
         | 110 |  |  |         // 1.0011.11000.000.0000...... 5f ? A carefully chosen illegal insn ??
 | 
      
         | 111 |  |  |         // "INT", 0xff10007f, 0x9e00005f, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_BITFIELD(3,19),
 | 
      
         | 112 | 2 | dgisselq |         // Return to user space
 | 
      
         | 113 | 202 | dgisselq |         { "RTU", 0xffc7ffff, 0x70c00020, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_BITFIELD(3,19) },
 | 
      
         | 114 |  |  |         // The return instruction: JMP R0 (possibly conditional) = MOV R0,PC
 | 
      
         | 115 |  |  |         { "RTN", 0xffc7ffff, 0x7b400000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_BITFIELD(3,19) },
 | 
      
         | 116 | 2 | dgisselq |         // JMP (possibly a conditional jump, if not covered by branches above)
 | 
      
         | 117 | 202 | dgisselq |         // 0.1111.01101.ccc.a.rrrr.biiiiiiiiiiiiiiii
 | 
      
         | 118 |  |  |         // 0111.1011.01cc.c0rr.rrbi.iiii.iiii.iiii              MOV x,PC
 | 
      
         | 119 |  |  |         { "JMP",  0xffc40000, 0x7b400000, ZIP_OPUNUSED,ZIP_OPUNUSED, ZIP_REGFIELD(14), ZIP_IMMFIELD(13,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 120 |  |  |         // 0.1111.1100.ii.iiii.iiii.iiii.iiii.iiii.iiii
 | 
      
         | 121 |  |  |         // 0111.1110.0iii.iiii.iiii.iiii.iiii.iiii              LDI x,PC
 | 
      
         | 122 |  |  |         { "JMPI", 0xff800000, 0x7e000000, ZIP_REGFIELD(27),ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(23,0), ZIP_OPUNUSED },
 | 
      
         | 123 | 188 | dgisselq |         // 0.1111.10010.000.1.1111.000000000000000
 | 
      
         | 124 | 202 | dgisselq |         // 0111.1100.1000.0111.11ii.iiii.iiii.iiii              LOD (PC),PC
 | 
      
         | 125 |  |  |         { "LJMP", 0xffffffff, 0x7c87c000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED },
 | 
      
         | 126 | 69 | dgisselq |         // NOT : XOR w/ -1
 | 
      
         | 127 |  |  |         //      0.rrrr.00100.ccc.0111.11111111111
 | 
      
         | 128 |  |  |         //      0rrr.r001.00cc.c011.f.f.f.f
 | 
      
         | 129 | 202 | dgisselq |         // { "NOT", 0x87c7ffff, 0x0103ffff, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_BITFIELD(3,19) },
 | 
      
         | 130 | 2 | dgisselq |         // General instructions
 | 
      
         | 131 | 69 | dgisselq |         // 0rrr.rooo.oocc.cxrr.rrii.iiii.iiii.iiii
 | 
      
         | 132 | 202 | dgisselq |         { "SUB", 0x87c40000, 0x00000000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 133 |  |  |         { "SUB", 0x87c40000, 0x00040000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 134 | 69 | dgisselq |         //
 | 
      
         | 135 | 202 | dgisselq |         { "AND", 0x87c40000, 0x00400000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 136 |  |  |         { "AND", 0x87c40000, 0x00440000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 137 | 69 | dgisselq |         //
 | 
      
         | 138 | 202 | dgisselq |         { "ADD", 0x87c40000, 0x00800000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 139 |  |  |         { "ADD", 0x87c40000, 0x00840000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 140 | 69 | dgisselq |         //
 | 
      
         | 141 | 202 | dgisselq |         { "OR", 0x87c40000, 0x00c00000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 142 |  |  |         { "OR", 0x87c40000, 0x00c40000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 143 | 69 | dgisselq |         //
 | 
      
         | 144 | 202 | dgisselq |         { "XOR", 0x87c40000, 0x01000000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 145 |  |  |         { "XOR", 0x87c40000, 0x01040000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 146 | 69 | dgisselq |         //
 | 
      
         | 147 | 202 | dgisselq |         { "LSR", 0x87c40000, 0x01400000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 148 |  |  |         { "LSR", 0x87c40000, 0x01440000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 149 | 69 | dgisselq |         //
 | 
      
         | 150 | 202 | dgisselq |         { "LSL", 0x87c40000, 0x01800000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 151 |  |  |         { "LSL", 0x87c40000, 0x01840000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 152 | 69 | dgisselq |         //
 | 
      
         | 153 | 202 | dgisselq |         { "ASR", 0x87c40000, 0x01c00000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 154 |  |  |         { "ASR", 0x87c40000, 0x01c40000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 155 | 69 | dgisselq |         //
 | 
      
         | 156 | 202 | dgisselq |         { "BREV",0x87c40000, 0x02000000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 157 |  |  |         { "BREV",0x87c40000, 0x02040000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 158 | 69 | dgisselq |         //
 | 
      
         | 159 | 202 | dgisselq |         { "LDILO",0x87c40000, 0x02400000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 160 |  |  |         { "LDILO",0x87c40000, 0x02440000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 161 | 69 | dgisselq |         //
 | 
      
         | 162 | 188 | dgisselq |         //
 | 
      
         | 163 | 202 | dgisselq |         { "MPYUHI", 0x87c40000, 0x02800000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 164 |  |  |         { "MPYUHI", 0x87c40000, 0x02840000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 165 | 188 | dgisselq |         //
 | 
      
         | 166 | 202 | dgisselq |         { "MPYSHI", 0x87c40000, 0x02c00000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 167 |  |  |         { "MPYSHI", 0x87c40000, 0x02c40000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 168 | 69 | dgisselq |         //
 | 
      
         | 169 | 202 | dgisselq |         { "MPY", 0x87c40000, 0x03000000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 170 |  |  |         { "MPY", 0x87c40000, 0x03040000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 171 | 69 | dgisselq |         //
 | 
      
         | 172 | 202 | dgisselq |         { "MOV", 0x87c42000, 0x03400000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_REGFIELD(14), ZIP_IMMFIELD(13,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 173 |  |  |         { "MOV", 0x87c42000, 0x03440000, ZIP_URGFIELD(27), ZIP_OPUNUSED, ZIP_REGFIELD(14), ZIP_IMMFIELD(13,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 174 |  |  |         { "MOV", 0x87c42000, 0x03402000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_URGFIELD(14), ZIP_IMMFIELD(13,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 175 |  |  |         { "MOV", 0x87c42000, 0x03442000, ZIP_URGFIELD(27), ZIP_OPUNUSED, ZIP_URGFIELD(14), ZIP_IMMFIELD(13,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 176 | 69 | dgisselq |         //
 | 
      
         | 177 | 202 | dgisselq |         { "DIVU", 0x87c40000, 0x03800000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 178 |  |  |         { "DIVU", 0x87c40000, 0x03840000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 179 | 69 | dgisselq |         //
 | 
      
         | 180 | 202 | dgisselq |         { "DIVS", 0x87c40000, 0x03c00000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 181 |  |  |         { "DIVS", 0x87c40000, 0x03c40000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 182 | 69 | dgisselq |         //
 | 
      
         | 183 | 202 | dgisselq |         { "CMP", 0x87c40000, 0x04000000, ZIP_OPUNUSED, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 184 |  |  |         { "CMP", 0x87c40000, 0x04040000, ZIP_OPUNUSED, ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 185 |  |  |         { "TST", 0x87c40000, 0x04400000, ZIP_OPUNUSED, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 186 |  |  |         { "TST", 0x87c40000, 0x04440000, ZIP_OPUNUSED, ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 187 | 2 | dgisselq |         //
 | 
      
         | 188 | 202 | dgisselq |         { "LW", 0x87c40000, 0x04800000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 189 |  |  |         { "LW", 0x87c40000, 0x04840000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 190 | 2 | dgisselq |         //
 | 
      
         | 191 | 202 | dgisselq |         { "SW", 0x87c40000, 0x04c00000, ZIP_OPUNUSED, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 192 |  |  |         { "SW", 0x87c40000, 0x04c40000, ZIP_OPUNUSED, ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 193 | 2 | dgisselq |         //
 | 
      
         | 194 | 202 | dgisselq |         { "LH", 0x87c40000, 0x05000000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 195 |  |  |         { "LH", 0x87c40000, 0x05040000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 196 | 2 | dgisselq |         //
 | 
      
         | 197 | 202 | dgisselq |         { "SH", 0x87c40000, 0x05400000, ZIP_OPUNUSED, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 198 |  |  |         { "SH", 0x87c40000, 0x05440000, ZIP_OPUNUSED, ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 199 | 8 | dgisselq |         //
 | 
      
         | 200 | 202 | dgisselq |         { "LB", 0x87c40000, 0x05800000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 201 |  |  |         { "LB", 0x87c40000, 0x05840000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 202 | 8 | dgisselq |         //
 | 
      
         | 203 | 202 | dgisselq |         { "SB", 0x87c40000, 0x05c00000, ZIP_OPUNUSED, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 204 |  |  |         { "SB", 0x87c40000, 0x05c40000, ZIP_OPUNUSED, ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 205 | 2 | dgisselq |         //
 | 
      
         | 206 | 202 | dgisselq |         // 0rrr.r101.1
 | 
      
         | 207 |  |  |         { "LDI",  0x87800000, 0x06000000, ZIP_REGFIELD(27),ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(23,0), ZIP_OPUNUSED },
 | 
      
         | 208 |  |  |         // 0111.x111.00.xxxxxxxx
 | 
      
         | 209 |  |  |         { "BRK",   0xf7ffffff, 0x77000000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED },
 | 
      
         | 210 |  |  |         { "BRK",   0xf7c00000, 0x77000000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(22,0), ZIP_OPUNUSED },
 | 
      
         | 211 |  |  |         { "LOCK",  0xf7ffffff, 0x77400000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED },
 | 
      
         | 212 |  |  |         { "LOCK",  0xf7c00000, 0x77400000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(22,0), ZIP_OPUNUSED },
 | 
      
         | 213 |  |  |         // 0.111x.00000.xxx.xxx.xxxx.xxxx.xxxx.xxxx
 | 
      
         | 214 |  |  |         // 0111.x111.11.xxx.xxx.xxxx.xxxx.xxxx.xxxx
 | 
      
         | 215 |  |  |         // SNOOP = SIM w/ no argument(s)
 | 
      
         | 216 |  |  |         { "SIM",  0xf7ffffff, 0x77800000, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 217 |  |  |         { "SEXIT",0xf7ffffff, 0x77800100, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 218 |  |  |         { "SEXIT",0xf7fffff0, 0x77800310, ZIP_OPUNUSED, ZIP_URGFIELD(0), ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 219 |  |  |         { "SEXIT",0xf7ffffe0, 0x77800300, ZIP_OPUNUSED, ZIP_REGFIELD(0), ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 220 |  |  |         { "SEXIT",0xf7ffff00, 0x77800100, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_IMMFIELD( 8,0), ZIP_OPUNUSED },
 | 
      
         | 221 |  |  |         { "SDUMP",0xf7ffffff, 0x778002ff, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 222 |  |  |         { "SDUMP",0xf7fffff0, 0x77800200, ZIP_OPUNUSED, ZIP_REGFIELD(0), ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 223 |  |  |         { "SDUMP",0xf7fffff0, 0x77800210, ZIP_OPUNUSED, ZIP_URGFIELD(0), ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 224 |  |  |         { "SOUT", 0xf7fffff0, 0x77800230, ZIP_OPUNUSED, ZIP_URGFIELD(0), ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 225 |  |  |         { "SOUT", 0xf7ffffe0, 0x77800220, ZIP_OPUNUSED, ZIP_REGFIELD(0), ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 226 |  |  |         { "SOUT", 0xf7ffff00, 0x77800400, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_IMMFIELD( 8,0), ZIP_OPUNUSED },
 | 
      
         | 227 |  |  |         { "SDUMP",0xf7ffff00, 0x77800200, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_IMMFIELD( 8,0), ZIP_OPUNUSED },
 | 
      
         | 228 |  |  |         { "SIM",  0xf7c00000, 0x77800000, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_IMMFIELD(22,0), ZIP_OPUNUSED },
 | 
      
         | 229 |  |  |         { "NOOP", 0xf7ffffff, 0x77c00000, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 230 |  |  |         { "NEXIT",0xf7ffffff, 0x77c00100, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 231 |  |  |         { "NEXIT",0xf7ffff00, 0x77c00100, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_IMMFIELD( 8,0), ZIP_OPUNUSED },
 | 
      
         | 232 |  |  |         { "NEXIT",0xf7fffff0, 0x77c00310, ZIP_OPUNUSED, ZIP_URGFIELD(0), ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 233 |  |  |         { "NEXIT",0xf7ffffe0, 0x77c00300, ZIP_OPUNUSED, ZIP_REGFIELD(0), ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 234 |  |  |         { "NDUMP",0xf7ffffff, 0x77c002ff, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 235 |  |  |         { "NDUMP",0xf7fffff0, 0x77c00200, ZIP_OPUNUSED, ZIP_REGFIELD(0), ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 236 |  |  |         { "NDUMP",0xf7fffff0, 0x77c00210, ZIP_OPUNUSED, ZIP_URGFIELD(0), ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 237 |  |  |  
 | 
      
         | 238 |  |  |         { "NOUT", 0xf7fffff0, 0x77c00230, ZIP_OPUNUSED, ZIP_URGFIELD(0), ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 239 |  |  |         { "NOUT", 0xf7ffffe0, 0x77c00220, ZIP_OPUNUSED, ZIP_REGFIELD(0), ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 240 |  |  |         { "NOUT", 0xf7ffff00, 0x77c00400, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_IMMFIELD( 8,0), ZIP_OPUNUSED },
 | 
      
         | 241 |  |  |         { "NDUMP",0xf7ffff00, 0x77c00200, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_OPUNUSED,       ZIP_OPUNUSED },
 | 
      
         | 242 |  |  |         { "NSIM", 0xf7c00000, 0x77c00000, ZIP_OPUNUSED, ZIP_OPUNUSED,    ZIP_OPUNUSED, ZIP_IMMFIELD(22,0), ZIP_OPUNUSED },
 | 
      
         | 243 |  |  |         //
 | 
      
         | 244 |  |  |         //
 | 
      
         | 245 | 69 | dgisselq |         // 0rrr.r11f.ffcc.cxrr.rrii.iiii.iiii.iiii
 | 
      
         | 246 | 202 | dgisselq |         { "FPADD",0x87c43fff, 0x06840000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_OPUNUSED, ZIP_BITFIELD(3,19) },
 | 
      
         | 247 |  |  |         { "FPSUB",0x87c43fff, 0x06c40000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_OPUNUSED, ZIP_BITFIELD(3,19) },
 | 
      
         | 248 |  |  |         { "FPMPY",0x87c43fff, 0x07040000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_OPUNUSED, ZIP_BITFIELD(3,19) },
 | 
      
         | 249 |  |  |         { "FPDIV",0x87c43fff, 0x07440000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(14), ZIP_OPUNUSED, ZIP_BITFIELD(3,19) },
 | 
      
         | 250 |  |  |         { "FPI2F",0x87c40000, 0x07800000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(18,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 251 |  |  |         { "FPI2F",0x87c40000, 0x07840000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 252 |  |  |         { "FPF2I",0x87c40000, 0x07c40000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_REGFIELD(14), ZIP_IMMFIELD(14,0), ZIP_BITFIELD(3,19) },
 | 
      
         | 253 | 2 | dgisselq |         //
 | 
      
         | 254 |  |  |         //
 | 
      
         | 255 |  |  |         //
 | 
      
         | 256 |  |  |         //
 | 
      
         | 257 |  |  |         //
 | 
      
         | 258 | 69 | dgisselq |         //      16-bit instructions, high side
 | 
      
         | 259 | 2 | dgisselq |         //
 | 
      
         | 260 | 95 | dgisselq |         // 
 | 
      
         | 261 | 89 | dgisselq |         //      1.1111.00010.xcc.0iiii.xxxx.xxxxx.xxxxx
 | 
      
         | 262 |  |  |         //      1111.1000.10xc.c0ii.iixx.xxxx.xxxx.xxxx
 | 
      
         | 263 | 202 | dgisselq |         // Mask, val, result, Ra, Rb, I, condition (no conditions for OP_UNDER_TEST)
 | 
      
         | 264 |  |  |         // BRA: 1.1111.011.0.sssssss
 | 
      
         | 265 |  |  |         { "BRA", 0xff800000, 0xf9000000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(7,16), ZIP_OPUNUSED },
 | 
      
         | 266 |  |  |         // CLR: 1.rrrr.110.00000000
 | 
      
         | 267 |  |  |         { "CLR", 0x87ff0000, 0x86000000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED },
 | 
      
         | 268 |  |  |         // RTN: 1.1111.111.0.0000.000, MOV R0,Pc
 | 
      
         | 269 |  |  |         { "RTN", 0xffff0000, 0xff800000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED },
 | 
      
         | 270 |  |  |         // JMP: 1.1111.111.0.rrrrsss
 | 
      
         | 271 |  |  |         { "JMP", 0xff800000, 0xff000000, ZIP_REGFIELD(27),ZIP_OPUNUSED, ZIP_REGFIELD(19), ZIP_IMMFIELD(3,16), ZIP_OPUNUSED },
 | 
      
         | 272 |  |  |         // LJSR: 1.000_0.011_.0.111_1.001 ?.1111.110.1.1111.000
 | 
      
         | 273 |  |  |         // { "LJSR",0xffffffff, 0x83797ef8, ZIP_REGFIELD(27),ZIP_OPUNUSED, ZIP_REGFIELD(19), ZIP_IMMFIELD(3,16), ZIP_OPUNUSED },
 | 
      
         | 274 | 2 | dgisselq |         //
 | 
      
         | 275 | 202 | dgisselq |         // 1.rrrr.000.0.sssssss
 | 
      
         | 276 |  |  |         // 1rrr.r000.0sss.ssss
 | 
      
         | 277 |  |  |         { "SUB", 0x87800000, 0x80000000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(7,16), ZIP_OPUNUSED },
 | 
      
         | 278 |  |  |         // 1.rrrr.000.1.rrrrsss
 | 
      
         | 279 |  |  |         { "SUB", 0x87800000, 0x80800000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(19), ZIP_IMMFIELD(3,16), ZIP_OPUNUSED },
 | 
      
         | 280 | 2 | dgisselq |         //
 | 
      
         | 281 | 202 | dgisselq |         // 1.rrrr.001.0.sssssss
 | 
      
         | 282 |  |  |         // 1.rrrr.001.1.rrrrsss
 | 
      
         | 283 |  |  |         { "AND", 0x87800000, 0x81000000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(7,16), ZIP_OPUNUSED },
 | 
      
         | 284 |  |  |         { "AND", 0x87800000, 0x81800000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(19), ZIP_IMMFIELD(3,16), ZIP_OPUNUSED },
 | 
      
         | 285 | 69 | dgisselq |         //
 | 
      
         | 286 | 202 | dgisselq |         // 1.rrrr.010.0.sssssss
 | 
      
         | 287 |  |  |         // 1.rrrr.010.1.rrrrsss
 | 
      
         | 288 |  |  |         { "ADD", 0x87800000, 0x82000000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_IMMFIELD(7,16), ZIP_OPUNUSED },
 | 
      
         | 289 |  |  |         { "ADD", 0x87800000, 0x82800000, ZIP_REGFIELD(27), ZIP_REGFIELD(27), ZIP_REGFIELD(19), ZIP_IMMFIELD(3,16), ZIP_OPUNUSED },
 | 
      
         | 290 | 69 | dgisselq |         //
 | 
      
         | 291 | 202 | dgisselq |         // 1.rrrr.011.a.rrrrsss
 | 
      
         | 292 |  |  |         { "CMP", 0x87800000, 0x83000000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_REGFIELD(19), ZIP_IMMFIELD(7,16), ZIP_OPUNUSED },
 | 
      
         | 293 |  |  |         { "CMP", 0x87800000, 0x83800000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_REGFIELD(19), ZIP_IMMFIELD(3,16), ZIP_OPUNUSED },
 | 
      
         | 294 | 69 | dgisselq |         //
 | 
      
         | 295 | 202 | dgisselq |         // 1.rrrr.100.0.sssssss
 | 
      
         | 296 |  |  |         // 1.rrrr.100.1.rrrrsss
 | 
      
         | 297 |  |  |         { "LW", 0x87800000, 0x84000000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_SP, ZIP_IMMFIELD(7,16), ZIP_OPUNUSED },
 | 
      
         | 298 |  |  |         { "LW", 0x87800000, 0x84800000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_REGFIELD(19), ZIP_IMMFIELD(3,16), ZIP_OPUNUSED },
 | 
      
         | 299 |  |  |         // 1.rrrr.101.ssssssss
 | 
      
         | 300 |  |  |         { "SW", 0x87800000, 0x85000000, ZIP_OPUNUSED, ZIP_REGFIELD(27), ZIP_SP, ZIP_IMMFIELD(7,16), ZIP_OPUNUSED },
 | 
      
         | 301 |  |  |         // 1.rrrr.110.0.sssssss
 | 
      
         | 302 |  |  |         { "SW", 0x87800000, 0x85800000, ZIP_OPUNUSED, ZIP_REGFIELD(27), ZIP_REGFIELD(19), ZIP_IMMFIELD(3,16), ZIP_OPUNUSED },
 | 
      
         | 303 |  |  |         // 1.rrrr.110.iiiiiiii
 | 
      
         | 304 |  |  |         { "LDI", 0x87000000, 0x86000000, ZIP_REGFIELD(27), ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(8,16), ZIP_OPUNUSED },
 | 
      
         | 305 |  |  |         // 1.rrrr.111.1.sssssss
 | 
      
         | 306 |  |  |         { "MOV", 0x87800000, 0x87800000, ZIP_OPUNUSED, ZIP_REGFIELD(27), ZIP_REGFIELD(19), ZIP_IMMFIELD(3,16), ZIP_OPUNUSED },
 | 
      
         | 307 | 69 | dgisselq |         //
 | 
      
         | 308 | 202 | dgisselq |         // 1.rrrr.111.1.rrrrsss
 | 
      
         | 309 | 2 | dgisselq |         // Illegal instruction !!
 | 
      
         | 310 | 202 | dgisselq |         { "ILLV", 0x80000000, 0x80000000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(32,16), ZIP_OPUNUSED },
 | 
      
         | 311 |  |  |         // Global illegal instruction
 | 
      
         | 312 |  |  |         { "ILL", 0x00000000, 0x00000000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(32,0), ZIP_OPUNUSED }
 | 
      
         | 313 | 2 | dgisselq | };
 | 
      
         | 314 |  |  |  
 | 
      
         | 315 | 202 | dgisselq | static const ZOPCODE    zip_opbottomlist_raw[] = {
 | 
      
         | 316 | 69 | dgisselq |         //
 | 
      
         | 317 |  |  |         //
 | 
      
         | 318 |  |  |         //
 | 
      
         | 319 |  |  |         //      16-bit instructions, low side ... treat these as special
 | 
      
         | 320 |  |  |         //
 | 
      
         | 321 |  |  |         //
 | 
      
         | 322 | 202 | dgisselq |         // Mask, val, result, Ra, Rb, I, condition (no conditions for OP_UNDER_TEST)
 | 
      
         | 323 |  |  |         // BRA: 1.xxx_xxxx_xxxx_xxxx_?.111_1.011.0.sssssss
 | 
      
         | 324 |  |  |         { "BRA", 0x80007f80, 0x80007900, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(7,0), ZIP_OPUNUSED },
 | 
      
         | 325 |  |  |         // CLR: 1.xxx_xxxx_xxxx_xxxx_?.rrr_r.101.0000_0000
 | 
      
         | 326 |  |  |         { "CLR", 0x800007ff, 0x80000600, ZIP_REGFIELD(11), ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED },
 | 
      
         | 327 |  |  |         // RTN: 1.1111.111.0.0000.000, MOV R0,Pc
 | 
      
         | 328 |  |  |         { "RTN", 0x80007fff, 0x80007f80, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED },
 | 
      
         | 329 |  |  |         // JMP: 1.1111.111.0.rrrrsss
 | 
      
         | 330 |  |  |         { "JMP", 0x80007f80, 0x80007f00, ZIP_REGFIELD(11),ZIP_OPUNUSED, ZIP_REGFIELD(3), ZIP_IMMFIELD(3,0), ZIP_OPUNUSED },
 | 
      
         | 331 |  |  |         // LJMP: 1.xxx_xxxx_xxxx_xxxx_?.111_1.100._1.111_1.000
 | 
      
         | 332 |  |  |         { "LJMP", 0x80007fff, 0x80007cf8, ZIP_REGFIELD(11), ZIP_OPUNUSED, ZIP_REGFIELD(3), ZIP_IMMFIELD(3,0), ZIP_OPUNUSED },
 | 
      
         | 333 | 69 | dgisselq |         //
 | 
      
         | 334 | 202 | dgisselq |         // 1.rrrr.000.0.sssssss
 | 
      
         | 335 |  |  |         { "SUB", 0x80000780, 0x80000000, ZIP_REGFIELD(11), ZIP_REGFIELD(11), ZIP_OPUNUSED, ZIP_IMMFIELD(7,0), ZIP_OPUNUSED },
 | 
      
         | 336 |  |  |         // 1.rrrr.000.1.rrrrsss
 | 
      
         | 337 |  |  |         { "SUB", 0x80000780, 0x80000080, ZIP_REGFIELD(11), ZIP_REGFIELD(11), ZIP_REGFIELD(3), ZIP_IMMFIELD(3,0), ZIP_OPUNUSED },
 | 
      
         | 338 | 69 | dgisselq |         //
 | 
      
         | 339 | 202 | dgisselq |         // 1.rrrr.001.0.sssssss
 | 
      
         | 340 |  |  |         // 1.rrrr.001.1.rrrrsss
 | 
      
         | 341 |  |  |         { "AND", 0x80000780, 0x80000100, ZIP_REGFIELD(11), ZIP_REGFIELD(11), ZIP_OPUNUSED, ZIP_IMMFIELD(7,0), ZIP_OPUNUSED },
 | 
      
         | 342 |  |  |         { "AND", 0x80000780, 0x80000180, ZIP_REGFIELD(11), ZIP_REGFIELD(11), ZIP_REGFIELD(3), ZIP_IMMFIELD(3,0), ZIP_OPUNUSED },
 | 
      
         | 343 | 95 | dgisselq |         //
 | 
      
         | 344 | 202 | dgisselq |         // 1.rrrr.010.0.sssssss
 | 
      
         | 345 |  |  |         // 1.rrrr.010.1.rrrrsss
 | 
      
         | 346 |  |  |         { "ADD", 0x80000780, 0x80000200, ZIP_REGFIELD(11), ZIP_REGFIELD(11), ZIP_OPUNUSED, ZIP_IMMFIELD(7,0), ZIP_OPUNUSED },
 | 
      
         | 347 |  |  |         { "ADD", 0x80000780, 0x80000280, ZIP_REGFIELD(11), ZIP_REGFIELD(11), ZIP_REGFIELD(3), ZIP_IMMFIELD(3,0), ZIP_OPUNUSED },
 | 
      
         | 348 | 69 | dgisselq |         //
 | 
      
         | 349 | 202 | dgisselq |         // 1.rrrr.011.a.rrrrsss
 | 
      
         | 350 |  |  |         { "CMP", 0x80000780, 0x80000300, ZIP_REGFIELD(11), ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(7,0), ZIP_OPUNUSED },
 | 
      
         | 351 |  |  |         { "CMP", 0x80000780, 0x80000380, ZIP_REGFIELD(11), ZIP_OPUNUSED, ZIP_REGFIELD(3), ZIP_IMMFIELD(3,0), ZIP_OPUNUSED },
 | 
      
         | 352 | 69 | dgisselq |         //
 | 
      
         | 353 | 202 | dgisselq |         // 1.rrrr.100.0.sssssss
 | 
      
         | 354 |  |  |         // 1.rrrr.100.1.rrrrsss
 | 
      
         | 355 |  |  |         { "LW", 0x80000780, 0x80000400, ZIP_REGFIELD(11), ZIP_OPUNUSED, ZIP_SP, ZIP_IMMFIELD(7,0), ZIP_OPUNUSED },
 | 
      
         | 356 |  |  |         { "LW", 0x80000780, 0x80000480, ZIP_REGFIELD(11), ZIP_OPUNUSED, ZIP_REGFIELD(3), ZIP_IMMFIELD(3,0), ZIP_OPUNUSED },
 | 
      
         | 357 |  |  |         // 1.rrrr.101.ssssssss
 | 
      
         | 358 |  |  |         { "SW", 0x80000780, 0x80000500, ZIP_OPUNUSED, ZIP_REGFIELD(11), ZIP_SP, ZIP_IMMFIELD(7,0), ZIP_OPUNUSED },
 | 
      
         | 359 |  |  |         { "SW", 0x80000780, 0x80000580, ZIP_OPUNUSED, ZIP_REGFIELD(11), ZIP_REGFIELD(3), ZIP_IMMFIELD(3,0), ZIP_OPUNUSED },
 | 
      
         | 360 |  |  |         // 1.rrr_r.110.ssssssss
 | 
      
         | 361 |  |  |         { "LDI", 0x80000700, 0x80000600, ZIP_REGFIELD(11), ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(8,0), ZIP_OPUNUSED },
 | 
      
         | 362 |  |  |         // 1.rrr_r.111_.x.rrr_rsss
 | 
      
         | 363 |  |  |         { "MOV", 0x80000780, 0x80000780, ZIP_REGFIELD(11), ZIP_OPUNUSED, ZIP_REGFIELD(3), ZIP_IMMFIELD(3,0), ZIP_OPUNUSED },
 | 
      
         | 364 | 69 | dgisselq |         //
 | 
      
         | 365 |  |  |         //
 | 
      
         | 366 | 202 | dgisselq |         // Illegal instruction !!
 | 
      
         | 367 |  |  |         { "ILLV",       0x80000000, 0x80000000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(15,0), ZIP_OPUNUSED },
 | 
      
         | 368 |  |  |         { "ILL",        0x00000000, 0x00000000, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_OPUNUSED, ZIP_IMMFIELD(15,0), ZIP_OPUNUSED }
 | 
      
         | 369 |  |  | };
 | 
      
         | 370 |  |  |  
 | 
      
         | 371 |  |  | const ZOPCODE   *zip_oplist = zip_oplist_raw,
 | 
      
         | 372 |  |  |                 *zip_opbottomlist = zip_opbottomlist_raw;
 | 
      
         | 373 |  |  |  
 | 
      
         | 374 |  |  | const int       nzip_oplist = (sizeof(zip_oplist_raw)/sizeof(ZOPCODE));
 | 
      
         | 375 |  |  | const int       nzip_opbottom = (sizeof(zip_opbottomlist_raw)/sizeof(ZOPCODE));
 | 
      
         | 376 |  |  |  
 | 
      
         | 377 |  |  |  
 | 
      
         | 378 |  |  | static inline   int
 | 
      
         | 379 |  |  | TWOWORD_LOAD(uint32_t one, uint32_t two) {
 | 
      
         | 380 |  |  |         // BREV followed by LODILO
 | 
      
         | 381 |  |  |         if (((one&0x87c40000)==0x02000000)&&((two&0x87c40000)==0x02400000)
 | 
      
         | 382 |  |  |                 // Must be to the same register too, and on the same condition
 | 
      
         | 383 |  |  |                 &&(((one^two)&0xf8380000)==0))
 | 
      
         | 384 |  |  |                 return 1;
 | 
      
         | 385 |  |  |         return 0;
 | 
      
         | 386 |  |  | }
 | 
      
         | 387 |  |  |  
 | 
      
         | 388 |  |  | static  inline  int
 | 
      
         | 389 |  |  | OFFSET_PC_MOV(uint32_t ins) {
 | 
      
         | 390 |  |  |         // 0.xxxx.01101.ccc.0.1111.0.iiiiiiiiiiiii
 | 
      
         | 391 |  |  |         // 0xxx.x011.01cc.c011.110i.iiii.iiii.iiii
 | 
      
         | 392 | 69 | dgisselq |         //
 | 
      
         | 393 | 202 | dgisselq |         return ((ins & 0x87c7e000)==0x0343c000);
 | 
      
         | 394 |  |  | }
 | 
      
         | 395 |  |  |  
 | 
      
         | 396 |  |  | static  inline  int
 | 
      
         | 397 |  |  | TWOWORD_LJMP(uint32_t iword) {
 | 
      
         | 398 |  |  |         // LJMP a long jump instruction, for which the address of the target
 | 
      
         | 399 |  |  |         // is found in the next word
 | 
      
         | 400 |  |  |         if (iword==0x7c87c000)
 | 
      
         | 401 |  |  |                 return 1;
 | 
      
         | 402 |  |  |         // Now, the CIS form ... an
 | 
      
         | 403 |  |  |         // Unconditional LJMP in the second half word
 | 
      
         | 404 |  |  |         if ((iword&0x80007fff)==0x80007cf8)
 | 
      
         | 405 |  |  |                 return 1;
 | 
      
         | 406 |  |  |         return 0;
 | 
      
         | 407 |  |  | }
 | 
      
         | 408 |  |  |  
 | 
      
         | 409 |  |  |  
 | 
      
         | 410 |  |  | static  inline  int
 | 
      
         | 411 |  |  | TWOWORD_JSR(uint32_t iword, uint32_t nxtword) {
 | 
      
         | 412 |  |  |         // First word moves the return address to R0
 | 
      
         | 413 |  |  |         if (iword != 0x0343c001)
 | 
      
         | 414 |  |  |                 return 0;
 | 
      
         | 415 |  |  |         // Second word is a BRA statement to ... anywhere
 | 
      
         | 416 |  |  |         // 0.1111.00010.ccc.0.iiiiiiiiiiiiiiiiii
 | 
      
         | 417 |  |  |         // 0111.1000.10cc.c0ii.iiii.iiii.iiii.iiii
 | 
      
         | 418 |  |  |         if ((nxtword&0xffc40000) == 0x78800000)
 | 
      
         | 419 |  |  |                 return 1;
 | 
      
         | 420 |  |  |         return 0;
 | 
      
         | 421 |  |  | }
 | 
      
         | 422 |  |  |  
 | 
      
         | 423 |  |  | static  inline  int
 | 
      
         | 424 |  |  | THREEWORD_LJSR(uint32_t iword, uint32_t nxtword) {
 | 
      
         | 425 |  |  |         // First word moves the return address to R0
 | 
      
         | 426 |  |  |         if (iword!=0x0343c002)
 | 
      
         | 427 |  |  |                 return 0;
 | 
      
         | 428 |  |  |         // Second word is an LJMP statement
 | 
      
         | 429 |  |  |         if (nxtword==0x7c87c000)
 | 
      
         | 430 |  |  |                 return 1;
 | 
      
         | 431 |  |  |         return 0;
 | 
      
         | 432 |  |  | }
 | 
      
         | 433 |  |  |  
 | 
      
         | 434 |  |  | static  inline  int
 | 
      
         | 435 |  |  | TWOWORD_CIS_JSR(uint32_t iword) {
 | 
      
         | 436 |  |  |         // MOV 2(PC) | LOD (PC),PC
 | 
      
         | 437 | 69 | dgisselq |         //
 | 
      
         | 438 | 202 | dgisselq |         // 1.0000.111.1.1111.010
 | 
      
         | 439 |  |  |         //                      1.1111.100.1.1111.000
 | 
      
         | 440 |  |  |         if (iword == 0x87fafcf8)
 | 
      
         | 441 |  |  |                 return 1;
 | 
      
         | 442 |  |  |         return 0;
 | 
      
         | 443 |  |  | }
 | 
      
         | 444 |  |  |  
 | 
      
         | 445 |  |  | static  inline  int
 | 
      
         | 446 |  |  | CIS_JSR(uint32_t iword __attribute__((unused)) ) {
 | 
      
         | 447 |  |  |         if (TWOWORD_CIS_JSR(iword))
 | 
      
         | 448 |  |  |                 return 1;
 | 
      
         | 449 |  |  |         // MOV 1(PC) | MOV Rx,PC
 | 
      
         | 450 | 69 | dgisselq |         //
 | 
      
         | 451 | 202 | dgisselq |         // 1.0000.111.1.1111.001
 | 
      
         | 452 |  |  |         //                      1.1111.111.1.xxxx.000
 | 
      
         | 453 |  |  |         if ((iword&0xffffff87) == 0x87f9ff80)
 | 
      
         | 454 |  |  |                 return 1;
 | 
      
         | 455 |  |  |         return 0;
 | 
      
         | 456 |  |  | }
 | 
      
         | 457 |  |  |  
 | 
      
         | 458 |  |  | static inline   int
 | 
      
         | 459 |  |  | POSSIBLE_TWOWORD_BEGINNING(uint32_t iword) {
 | 
      
         | 460 |  |  |         // Unconditional LJMP
 | 
      
         | 461 |  |  |         if (TWOWORD_LJMP(iword))
 | 
      
         | 462 |  |  |                 return 1;
 | 
      
         | 463 |  |  |         // MOV 1(PC),PC
 | 
      
         | 464 |  |  |         if (iword == 0x0343c001)
 | 
      
         | 465 |  |  |                 return 1;
 | 
      
         | 466 |  |  |         // MOV 2(PC),PC
 | 
      
         | 467 |  |  |         if (iword == 0x0343c002)
 | 
      
         | 468 |  |  |                 return 1;
 | 
      
         | 469 |  |  |         if (CIS_JSR(iword))
 | 
      
         | 470 |  |  |                 return 1;
 | 
      
         | 471 |  |  |         // The conditional LJMP is three words, which we don't handle ...
 | 
      
         | 472 |  |  |         // Any BREV command could be the beginning of a twoword instruction
 | 
      
         | 473 | 69 | dgisselq |         //
 | 
      
         | 474 | 202 | dgisselq |         // Of course, the point here is to determine whether we should (or need
 | 
      
         | 475 |  |  |         // to) read a second word from our read-memory function.  Reading a 
 | 
      
         | 476 |  |  |         // second word, given that the first is a BREV, isn't a problem since a
 | 
      
         | 477 |  |  |         // program can't end on/with a BREV instruction.
 | 
      
         | 478 | 69 | dgisselq |         //
 | 
      
         | 479 | 202 | dgisselq |         // BREV #,Rx
 | 
      
         | 480 |  |  |         if ((iword&0x87c40000)==0x02000000)
 | 
      
         | 481 |  |  |                 return 1;
 | 
      
         | 482 |  |  |         return 0;
 | 
      
         | 483 |  |  | }
 | 
      
         | 484 | 69 | dgisselq |  
 | 
      
         | 485 |  |  |  
 | 
      
         | 486 | 202 | dgisselq | static uint32_t
 | 
      
         | 487 |  |  | zip_bitreverse(uint32_t v) {
 | 
      
         | 488 |  |  |         uint32_t r=0, b;
 | 
      
         | 489 |  |  |         for(b=0; b<32; b++, v>>=1)
 | 
      
         | 490 |  |  |                 r = (r<<1)|(v&1);
 | 
      
         | 491 |  |  |         return r;
 | 
      
         | 492 |  |  | }
 | 
      
         | 493 | 2 | dgisselq |  
 | 
      
         | 494 | 202 | dgisselq | static inline   uint32_t
 | 
      
         | 495 |  |  | TWOWORD_VALUE(uint32_t one, uint32_t two) {
 | 
      
         | 496 |  |  |         return ((two&0x0ffff)|(zip_bitreverse(one&0x0ffff)));
 | 
      
         | 497 |  |  | }
 | 
      
         | 498 |  |  |  
 | 
      
         | 499 |  |  | static long
 | 
      
         | 500 |  |  | zip_sbits(const long val, const int bits) {
 | 
      
         | 501 |  |  |         long    r;
 | 
      
         | 502 |  |  |  
 | 
      
         | 503 |  |  |         r = val & ((1l<<bits)-1);
 | 
      
         | 504 |  |  |         if (r & (1l << (bits-1)))
 | 
      
         | 505 |  |  |                 r |= (-1l << bits);
 | 
      
         | 506 |  |  |         return r;
 | 
      
         | 507 |  |  | }
 | 
      
         | 508 |  |  |  
 | 
      
         | 509 |  |  | static unsigned long
 | 
      
         | 510 |  |  | zip_ubits(const long val, const int bits) {
 | 
      
         | 511 |  |  |         unsigned long r = val & ((1l<<bits)-1);
 | 
      
         | 512 |  |  |         return r;
 | 
      
         | 513 |  |  | }
 | 
      
         | 514 |  |  |  
 | 
      
         | 515 |  |  | static  int
 | 
      
         | 516 |  |  | zip_getbits(const ZIPI ins, const int which)
 | 
      
         | 517 |  |  | {
 | 
      
         | 518 | 2 | dgisselq |         if (which & 0x40000000) {
 | 
      
         | 519 | 202 | dgisselq |                 return zip_sbits(ins>>(which & 0x03f), (which>>8)&0x03f);
 | 
      
         | 520 | 70 | dgisselq |         } else { // if (which &0x03f)
 | 
      
         | 521 | 202 | dgisselq |                 return zip_ubits(ins>>(which & 0x03f), (which>>8)&0x03f)
 | 
      
         | 522 | 2 | dgisselq |                         + ((which>>16)&0x0ff);
 | 
      
         | 523 | 70 | dgisselq |         }
 | 
      
         | 524 | 2 | dgisselq | }
 | 
      
         | 525 |  |  |  
 | 
      
         | 526 | 202 | dgisselq | static  void
 | 
      
         | 527 |  |  | zipi_to_halfstring(const uint32_t addr, const ZIPI ins, char *line, const ZOPCODE *listp) {
 | 
      
         | 528 |  |  |  
 | 
      
         | 529 |  |  |         if (OFFSET_PC_MOV(ins)) {
 | 
      
         | 530 |  |  |                 int     cv = zip_getbits(ins, ZIP_BITFIELD(3,19));
 | 
      
         | 531 |  |  |                 int     dv = zip_getbits(ins, ZIP_REGFIELD(27));
 | 
      
         | 532 |  |  |                 int     iv = zip_sbits(ins, 13);
 | 
      
         | 533 |  |  |                 uint32_t        ref;
 | 
      
         | 534 |  |  |  
 | 
      
         | 535 |  |  |                 ref = (iv<<2) + addr + 4;
 | 
      
         | 536 |  |  |  
 | 
      
         | 537 |  |  |                 sprintf(line, "%s%s", "MOV", zip_ccstr[cv]);
 | 
      
         | 538 |  |  |                 sprintf(line, "%-11s", line);
 | 
      
         | 539 |  |  |                 sprintf(line, "%s0x%08x", line, ref);
 | 
      
         | 540 |  |  |                 sprintf(line, "%s,%s", line, zip_regstr[dv]);
 | 
      
         | 541 |  |  |  
 | 
      
         | 542 |  |  |                 return;
 | 
      
         | 543 |  |  |         } else if (TWOWORD_CIS_JSR(ins)) {
 | 
      
         | 544 |  |  |                 sprintf(line, "%-11s", "LJSR");
 | 
      
         | 545 |  |  |                 return;
 | 
      
         | 546 |  |  |         } else if (CIS_JSR(ins)) {
 | 
      
         | 547 |  |  |                 int ra = zip_getbits(ins, ZIP_REGFIELD(3));
 | 
      
         | 548 |  |  |                 sprintf(line, "%-11s%s", "JSR", zip_regstr[ra]);
 | 
      
         | 549 |  |  |                 return;
 | 
      
         | 550 |  |  |         }
 | 
      
         | 551 |  |  |  
 | 
      
         | 552 |  |  |         int     i;
 | 
      
         | 553 |  |  |         for(i=0; i<nzip_oplist; i++) {
 | 
      
         | 554 |  |  |                 if (((~zip_oplist[i].s_mask)&zip_oplist[i].s_val)!=0) {
 | 
      
         | 555 | 69 | dgisselq |                         printf("Instruction %d, %s, fails consistency check\n",
 | 
      
         | 556 | 202 | dgisselq |                                 i, zip_oplist[i].s_opstr);
 | 
      
         | 557 |  |  |                         printf("%08x & %08x = %08x != %08x\n",
 | 
      
         | 558 |  |  |                                 zip_oplist[i].s_mask,
 | 
      
         | 559 |  |  |                                 zip_oplist[i].s_val,
 | 
      
         | 560 |  |  |                                 (~zip_oplist[i].s_mask)&zip_oplist[i].s_val,
 | 
      
         | 561 |  |  |                                 0);
 | 
      
         | 562 |  |  |                         assert(((~zip_oplist[i].s_mask)&zip_oplist[i].s_val)==0);
 | 
      
         | 563 | 69 | dgisselq |                 }
 | 
      
         | 564 | 70 | dgisselq |         } line[0] = '\0';
 | 
      
         | 565 | 202 | dgisselq |         for(i=0; (listp[i].s_mask != 0); i++) {
 | 
      
         | 566 | 2 | dgisselq |                 // printf("%2d: %6s %08x & %08x == %08x\n",
 | 
      
         | 567 | 202 | dgisselq |                         // i, zip_oplist[i].s_opstr, ins,
 | 
      
         | 568 |  |  |                         // zip_oplist[i].s_mask, zip_oplist[i].s_val);
 | 
      
         | 569 | 70 | dgisselq |                 if ((ins & listp[i].s_mask) == listp[i].s_val) {
 | 
      
         | 570 | 202 | dgisselq |                         // Write the opcode onto our line
 | 
      
         | 571 | 70 | dgisselq |                         sprintf(line, "%s", listp[i].s_opstr);
 | 
      
         | 572 | 89 | dgisselq |                         if (listp[i].s_cf != ZIP_OPUNUSED) {
 | 
      
         | 573 | 202 | dgisselq |                                 int bv = zip_getbits(ins, listp[i].s_cf);
 | 
      
         | 574 |  |  |                                 strcat(line, zip_ccstr[bv]);
 | 
      
         | 575 |  |  |                         } sprintf(line, "%-11s", line); // Pad it to 11 chars
 | 
      
         | 576 | 2 | dgisselq |  
 | 
      
         | 577 | 202 | dgisselq |                         int     ra = -1, rb = -1, rr = -1, imv = 0;
 | 
      
         | 578 |  |  |  
 | 
      
         | 579 |  |  |                         if (listp[i].s_result != ZIP_OPUNUSED)
 | 
      
         | 580 |  |  |                                 rr = zip_getbits(ins, listp[i].s_result);
 | 
      
         | 581 |  |  |                         if (listp[i].s_ra != ZIP_OPUNUSED)
 | 
      
         | 582 |  |  |                                 ra = zip_getbits(ins, listp[i].s_ra);
 | 
      
         | 583 |  |  |                         if (listp[i].s_rb != ZIP_OPUNUSED)
 | 
      
         | 584 |  |  |                                 rb = zip_getbits(ins, listp[i].s_rb);
 | 
      
         | 585 |  |  |                         if (listp[i].s_i != ZIP_OPUNUSED)
 | 
      
         | 586 |  |  |                                 imv = zip_getbits(ins, listp[i].s_i);
 | 
      
         | 587 |  |  |  
 | 
      
         | 588 |  |  |                         if ((listp[i].s_rb != ZIP_OPUNUSED)&&(rb == 15))
 | 
      
         | 589 |  |  |                                 imv <<= 2;
 | 
      
         | 590 |  |  |  
 | 
      
         | 591 | 2 | dgisselq |                         // Treat stores special
 | 
      
         | 592 | 202 | dgisselq |                         if ((strncasecmp("SW",listp[i].s_opstr, 2)==0)
 | 
      
         | 593 |  |  |                                 ||(strncasecmp("SH",listp[i].s_opstr, 2)==0)
 | 
      
         | 594 |  |  |                                 ||(strncasecmp("SB",listp[i].s_opstr, 2)==0)) {
 | 
      
         | 595 |  |  |                                 strcat(line, zip_regstr[ra]);
 | 
      
         | 596 | 2 | dgisselq |                                 strcat(line, ",");
 | 
      
         | 597 |  |  |  
 | 
      
         | 598 | 89 | dgisselq |                                 if (listp[i].s_i != ZIP_OPUNUSED) {
 | 
      
         | 599 | 202 | dgisselq |                                         if (listp[i].s_rb == ZIP_OPUNUSED)
 | 
      
         | 600 | 2 | dgisselq |                                                 sprintf(&line[strlen(line)],
 | 
      
         | 601 | 202 | dgisselq |                                                         "($%d)", imv);
 | 
      
         | 602 | 2 | dgisselq |                                         else if (imv != 0)
 | 
      
         | 603 |  |  |                                                 sprintf(&line[strlen(line)],
 | 
      
         | 604 | 202 | dgisselq |                                                         "$%d", imv);
 | 
      
         | 605 | 89 | dgisselq |                                 } if (listp[i].s_rb != ZIP_OPUNUSED) {
 | 
      
         | 606 | 2 | dgisselq |                                         sprintf(&line[strlen(line)],
 | 
      
         | 607 | 202 | dgisselq |                                                 "(%s)", zip_regstr[rb]);
 | 
      
         | 608 | 2 | dgisselq |                                 }
 | 
      
         | 609 | 202 | dgisselq |                         // Treat long jumps special
 | 
      
         | 610 |  |  |                         } else if (strncasecmp("LJMP",listp[i].s_opstr, 3)==0) {
 | 
      
         | 611 |  |  |                         // Treat relative jumps (branches) specially as well
 | 
      
         | 612 |  |  |                         } else if ((toupper(listp[i].s_opstr[0]=='B'))
 | 
      
         | 613 |  |  |                                 &&(strcasecmp(listp[i].s_opstr,"BUSY")!=0)
 | 
      
         | 614 |  |  |                                 &&(strcasecmp(listp[i].s_opstr,"BREV")!=0)
 | 
      
         | 615 |  |  |                                 &&(strcasecmp(listp[i].s_opstr,"BRK")!=0)
 | 
      
         | 616 |  |  |                                 &&(addr != 0)) {
 | 
      
         | 617 |  |  |                                 // Branch instruction: starts with B and isn't
 | 
      
         | 618 |  |  |                                 // BREV (bit reverse), BRK (break), or 
 | 
      
         | 619 |  |  |                                 // BUSY
 | 
      
         | 620 |  |  |                                 uint32_t target = addr;
 | 
      
         | 621 | 2 | dgisselq |  
 | 
      
         | 622 | 202 | dgisselq |                                 target += zip_getbits(ins, listp[i].s_i)+4;
 | 
      
         | 623 |  |  |                                 sprintf(&line[strlen(line)], "@0x%08x", target);
 | 
      
         | 624 | 2 | dgisselq |                         } else {
 | 
      
         | 625 | 202 | dgisselq |                                 int memop = 0;
 | 
      
         | 626 |  |  |                                 if (('L'==toupper(listp[i].s_opstr[0]))
 | 
      
         | 627 |  |  |                                         &&(('W'==toupper(listp[i].s_opstr[1]))
 | 
      
         | 628 |  |  |                                          ||('H'==toupper(listp[i].s_opstr[1]))
 | 
      
         | 629 |  |  |                                          ||('B'==toupper(listp[i].s_opstr[1])))
 | 
      
         | 630 |  |  |                                         &&(!listp[i].s_opstr[2]))
 | 
      
         | 631 |  |  |                                         memop = 1;
 | 
      
         | 632 |  |  |  
 | 
      
         | 633 | 89 | dgisselq |                                 if (listp[i].s_i != ZIP_OPUNUSED) {
 | 
      
         | 634 | 202 | dgisselq |                                         if((memop)&&(listp[i].s_rb == ZIP_OPUNUSED))
 | 
      
         | 635 | 2 | dgisselq |                                                 sprintf(&line[strlen(line)],
 | 
      
         | 636 | 202 | dgisselq |                                                         "($%d)", imv);
 | 
      
         | 637 |  |  |                                         else if((memop)&&(imv != 0))
 | 
      
         | 638 |  |  |                                                 sprintf(&line[strlen(line)],
 | 
      
         | 639 |  |  |                                                         "%d", imv);
 | 
      
         | 640 |  |  |                                         else if((!memop)&&((imv != 0)||(listp[i].s_rb == ZIP_OPUNUSED)))
 | 
      
         | 641 |  |  |                                                 sprintf(&line[strlen(line)],
 | 
      
         | 642 | 2 | dgisselq |                                                         "$%d%s", imv,
 | 
      
         | 643 | 202 | dgisselq |                                                         (listp[i].s_rb!=ZIP_OPUNUSED)?"+":"");
 | 
      
         | 644 | 89 | dgisselq |                                 } if (listp[i].s_rb != ZIP_OPUNUSED) {
 | 
      
         | 645 | 2 | dgisselq |                                         if (memop)
 | 
      
         | 646 |  |  |                                                 sprintf(&line[strlen(line)],
 | 
      
         | 647 | 202 | dgisselq |                                                         "(%s)", zip_regstr[rb]);
 | 
      
         | 648 | 2 | dgisselq |                                         else
 | 
      
         | 649 | 202 | dgisselq |                                                 strcat(line, zip_regstr[rb]);
 | 
      
         | 650 | 89 | dgisselq |                                 } if(((listp[i].s_i != ZIP_OPUNUSED)||(listp[i].s_rb != ZIP_OPUNUSED))
 | 
      
         | 651 |  |  |                                         &&((listp[i].s_ra != ZIP_OPUNUSED)||(listp[i].s_result != ZIP_OPUNUSED)))
 | 
      
         | 652 | 2 | dgisselq |                                         strcat(line, ",");
 | 
      
         | 653 |  |  |  
 | 
      
         | 654 | 89 | dgisselq |                                 if (listp[i].s_ra != ZIP_OPUNUSED) {
 | 
      
         | 655 | 202 | dgisselq |                                         strcat(line, zip_regstr[ra]);
 | 
      
         | 656 | 89 | dgisselq |                                 } else if (listp[i].s_result != ZIP_OPUNUSED) {
 | 
      
         | 657 | 202 | dgisselq |                                         strcat(line, zip_regstr[rr]);
 | 
      
         | 658 | 2 | dgisselq |                                 }
 | 
      
         | 659 |  |  |                         }
 | 
      
         | 660 |  |  |                         break;
 | 
      
         | 661 |  |  |                 }
 | 
      
         | 662 | 70 | dgisselq |         } if (line[0] == '\0') {
 | 
      
         | 663 |  |  |                 sprintf(line, "ILL %08x", ins);
 | 
      
         | 664 | 2 | dgisselq |         }
 | 
      
         | 665 |  |  | }
 | 
      
         | 666 |  |  |  
 | 
      
         | 667 | 202 | dgisselq | void
 | 
      
         | 668 |  |  | zipi_to_double_string(const uint32_t addr, const ZIPI ins, char *la, char *lb) {
 | 
      
         | 669 |  |  |         zipi_to_halfstring(addr, ins, la, zip_oplist);
 | 
      
         | 670 | 70 | dgisselq |         if (lb) {
 | 
      
         | 671 | 202 | dgisselq |                 if ((ins & 0x80000000)&&(!CIS_JSR(ins))) {
 | 
      
         | 672 |  |  |                         zipi_to_halfstring(addr, ins, lb, zip_opbottomlist);
 | 
      
         | 673 | 70 | dgisselq |                 } else lb[0] = '\0';
 | 
      
         | 674 |  |  |         }
 | 
      
         | 675 |  |  | }
 | 
      
         | 676 |  |  |  
 | 
      
         | 677 | 202 | dgisselq | unsigned int    zop_early_branch(const unsigned int pc, const ZIPI insn) {
 | 
      
         | 678 |  |  |         if ((insn & 0xf8000000) != 0x78000000)
 | 
      
         | 679 |  |  |                 return pc+4;
 | 
      
         | 680 |  |  |         if ((insn & 0xffc60000) == 0x78800000)  // BRA high bit clear
 | 
      
         | 681 |  |  |                 return (pc + 4 + ((insn & 0x3ffff)<<2));
 | 
      
         | 682 |  |  |         if ((insn & 0xffc60000) == 0x78820000)  // BRA high bit set (negative)
 | 
      
         | 683 |  |  |                 return (pc + 4 + ((0x40000 - (insn & 0x3ffff))<<2));
 | 
      
         | 684 |  |  |         return pc+4;
 | 
      
         | 685 | 70 | dgisselq | }
 | 
      
         | 686 |  |  |  
 | 
      
         | 687 |  |  |  
 |