########################################################################## # # Processor specific code # CPU = "Z80" # Description = "Zilog 8-bit microprocessor." # DataWidth = 8 # 8-bit data # AddressWidth = 16 # 16-bit addresses # Maximum length of an instruction (for formatting purposes) maxLength = 4 # Leadin bytes for multibyte instructions leadInBytes = [0xcb, 0xdd, 0xed, 0xfd] # Addressing mode table # List of addressing modes and corresponding format strings for operands. addressModeTable = { "implied" : "", "0" : "0", "0,a" : "0,a", "0,b" : "0,b", "0,c" : "0,c", "0,d" : "0,d", "0,e" : "0,e", "0,h" : "0,h", "0,indhl" : "0,(hl)", "0,l" : "0,l", "00" : "$00", "08" : "$08", "1" : "1", "1,a" : "1,a", "1,b" : "1,b", "1,c" : "1,c", "1,d" : "1,d", "1,e" : "1,e", "1,h" : "1,h", "1,indhl" : "1,(hl)", "1,l" : "1,l", "10" : "$10", "18" : "$18", "2" : "2", "2,a" : "2,a", "2,b" : "2,b", "2,c" : "2,c", "2,d" : "2,d", "2,e" : "2,e", "2,h" : "2,h", "2,indhl" : "2,(hl)", "2,l" : "2,l", "20" : "$20", "28" : "$28", "3,a" : "3,a", "3,b" : "3,b", "3,c" : "3,c", "3,d" : "3,d", "3,e" : "3,e", "3,h" : "3,h", "3,indhl" : "3,(hl)", "3,l" : "3,l", "30" : "$30", "38" : "$38", "4,a" : "4,a", "4,b" : "4,b", "4,c" : "4,c", "4,d" : "4,d", "4,e" : "4,e", "4,h" : "4,h", "4,indhl" : "4,(hl)", "4,l" : "4,l", "5,a" : "5,a", "5,b" : "5,b", "5,c" : "5,c", "5,d" : "5,d", "5,e" : "5,e", "5,h" : "5,h", "5,indhl" : "5,(hl)", "5,l" : "5,l", "6,a" : "6,a", "6,b" : "6,b", "6,c" : "6,c", "6,d" : "6,d", "6,e" : "6,e", "6,h" : "6,h", "6,indhl" : "6,(hl)", "6,l" : "6,l", "7,a" : "7,a", "7,b" : "7,b", "7,c" : "7,c", "7,d" : "7,d", "7,e" : "7,e", "7,h" : "7,h", "7,indhl" : "7,(hl)", "7,l" : "7,l", "a" : "a", "a,a" : "a,a", "a,b" : "a,b", "a,c" : "a,c", "a,d" : "a,d", "a,e" : "a,e", "a,h" : "a,h", "a,i" : "a,i", "a,indbc" : "a,(bc)", "a,indc" : "a,(c)", "a,indde" : "a,(de)", "a,indhl" : "a,(hl)", "a,indix+d" : "a,(ix+${0:02X})", "a,indiy+d" : "a,(iy+${0:02X})", "a,indn" : "a,(${0:02X})", "a,indnn" : "a,(${1:02X}{0:02X})", "a,l" : "a,l", "a,n" : "a,${0:02X}", "a,r" : "a,r", "af" : "af", "af,af'" : "af,af'", "b" : "b", "b,a" : "b,a", "b,b" : "b,b", "b,c" : "b,c", "b,d" : "b,d", "b,e" : "b,e", "b,h" : "b,h", "b,indc" : "b,(c)", "b,indhl" : "b,(hl)", "b,indix+d" : "b,(ix+${0:02X})", "b,indiy+d" : "b,(iy+${0:02X})", "b,l" : "b,l", "b,n" : "b,${0:02X}", "bc" : "bc", "bc,indaa" : "bc,(${1:02X}{0:02X})", "bc,nn" : "bc,${1:02X}{0:02X}", "c" : "c", "c,a" : "c,a", "c,b" : "c,b", "c,c" : "c,c", "c,d" : "c,d", "c,e" : "c,e", "c,h" : "c,h", "c,indc" : "c,(c)", "c,indhl" : "c,(hl)", "c,indix+d" : "c,(ix+${0:02X})", "c,indiy+d" : "c,(iy+${0:02X})", "c,l" : "c,l", "c,n" : "c,${0:02X}", "c,pcr" : "c,${0:04X}", "c,nn" : "c,${1:02X}{0:02X}", "d" : "d", "d,a" : "d,a", "d,b" : "d,b", "d,c" : "d,c", "d,d" : "d,d", "d,e" : "d,e", "d,h" : "d,h", "d,indc" : "d,(c)", "d,indhl" : "d,(hl)", "d,indix+d" : "d,(ix+${0:02X})", "d,indiy+d" : "d,(iy+${0:02X})", "d,l" : "d,l", "d,n" : "d,${0:02X}", "de" : "de", "de,hl" : "de,hl", "de,indaa" : "de,(${1:02X}{0:02X})", "de,nn" : "de,${1:02X}{0:02X}", "e" : "e", "e,a" : "e,a", "e,b" : "e,b", "e,c" : "e,c", "e,d" : "e,d", "e,e" : "e,e", "e,h" : "e,h", "e,indc" : "e,(c)", "e,indhl" : "e,(hl)", "e,indix+d" : "e,(ix+${0:02X})", "e,indiy+d" : "e,(iy+${0:02X})", "e,l" : "e,l", "e,n" : "e,${0:02X}", "h" : "h", "h,a" : "h,a", "h,b" : "h,b", "h,c" : "h,c", "h,d" : "h,d", "h,e" : "h,e", "h,h" : "h,h", "h,indc" : "h,(c)", "h,indhl" : "h,(hl)", "h,indix+d" : "h,(ix+${0:02X})", "h,indiy+d" : "h,(iy+${0:02X})", "h,l" : "h,l", "h,n" : "h,${0:02X}", "hl" : "hl", "hl,bc" : "hl,bc", "hl,de" : "hl,de", "hl,hl" : "hl,hl", "hl,indnn" : "hl,(${1:02X}{0:02X})", "hl,nn" : "hl,${1:02X}{0:02X}", "hl,sp" : "hl,sp", "i,a" : "i,a", "indaa,bc" : "(${1:02X}{0:02X}),bc", "indaa,de" : "(${1:02X}{0:02X}),de", "indaa,ix" : "(${1:02X}{0:02X}),ix", "indaa,iy" : "(${1:02X}{0:02X}),iy", "indaa,sp" : "(${1:02X}{0:02X}),sp", "indbc,a" : "(bc),a", "indc,a" : "(c),a", "indc,b" : "(c),b", "indc,c" : "(c),c", "indc,d" : "(c),d", "indc,e" : "(c),e", "indc,h" : "(c),h", "indc,l" : "(c),l", "indde,a" : "(de),a", "indhl" : "(hl)", "indhl,a" : "(hl),a", "indhl,b" : "(hl),b", "indhl,c" : "(hl),c", "indhl,d" : "(hl),d", "indhl,e" : "(hl),e", "indhl,h" : "(hl),h", "indhl,l" : "(hl),l", "indhl,n" : "(hl),${0:02X}", "indix+d" : "(ix+${0:02X})", "indix+d,a" : "(ix+${0:02X}),a", "indiy+d,a" : "(iy+${0:02X}),a", "indix+d,b" : "(ix+${0:02X}),b", "indix+d,c" : "(ix+${0:02X}),c", "indix+d,d" : "(ix+${0:02X}),d", "indix+d,e" : "(ix+${0:02X}),e", "indix+d,h" : "(ix+${0:02X}),h", "indix+d,l" : "(ix+${0:02X}),l", "indix+d,n" : "(ix+${0:02X}),${1:02X}", "indiy+d" : "(iy+${0:02X})", "indiy+d,b" : "(iy+${0:02X}),b", "indiy+d,c" : "(iy+${0:02X}),c", "indiy+d,d" : "(iy+${0:02X}),d", "indiy+d,e" : "(iy+${0:02X}),e", "indiy+d,h" : "(iy+${0:02X}),h", "indiy+d,l" : "(iy+${0:02X}),l", "indiy+d,n" : "(iy+${0:02X}),${1:02X}", "indn,a" : "(${0:02X}),a", "indnn,a" : "(${1:02X}{0:02X}),a", "indnn,hl" : "(${1:02X}{0:02X}),hl", "indsp,hl" : "(sp),hl", "ix" : "ix", "ix,aa" : "ix,${1:02X}{0:02X}", "ix,bc" : "ix,bc", "ix,de" : "ix,de", "ix,indaa" : "ix,(${1:02X}{0:02X})", "ix,ix" : "ix,ix", "ix,sp" : "ix,sp", "iy" : "iy", "iy,aa" : "iy,${1:02X}{0:02X}", "iy,bc" : "iy,bc", "iy,bc" : "iy,bc", "iy,de" : "iy,de", "iy,indaa" : "iy,(${1:02X}{0:02X})", "iy,indaa" : "iy,(${1:02X}{0:02X})", "iy,iy" : "iy,iy", "iy,sp" : "iy,sp", "l" : "l", "l,a" : "l,a", "l,b" : "l,b", "l,c" : "l,c", "l,d" : "l,d", "l,e" : "l,e", "l,h" : "l,h", "l,indc" : "l,(c)", "l,indhl" : "l,(hl)", "l,indix+d" : "l,(ix+${0:02X})", "l,indiy+d" : "l,(iy+${0:02X})", "l,l" : "l,l", "l,n" : "l,${0:02X}", "m" : "m", "m,nn" : "m,${1:02X}{0:02X}", "n" : "${0:02X}", "n,pcr" : "${0:04X}", "n,indix+d" : "n,(ix+${0:02X})", "n,indiy+d" : "n,(iy+${0:02X})", "nc" : "nc", "nc,pcr" : "nc,${0:04X}", "nc,nn" : "nc,${1:02X}{0:02X}", "nn" : "${1:02X}{0:02X}", "nz" : "nz", "nz,pcr" : "nz,${0:04X}", "nz,nn" : "nz,${1:02X}{0:02X}", "p" : "p", "p,nn" : "p,${1:02X}{0:02X}", "pcr" : "${0:04X}", "pe" : "pe", "pe,nn" : "pe,${1:02X}{0:02X}", "po" : "po", "po,nn" : "po,${1:02X}{0:02X}", "r,a" : "r,a", "sp" : "sp", "sp,hl" : "sp,hl", "sp,indaa" : "sp,(${1:02X}{0:02X})", "sp,nn" : "sp,${1:02X}{0:02X}", "z" : "z", "z,pcr" : "z,${0:04X}", "z,nn" : "z,${1:02X}{0:02X}", } # Op Code Table # Key is numeric opcode (possibly multiple bytes) # Value is a list: # # bytes # mnemonic # addressing mode # flags (e.g. pcr) opcodeTable = { 0x00 : [ 1, "nop", "implied" ], 0x01 : [ 3, "ld", "bc,nn" ], 0x02 : [ 1, "ld", "indbc,a" ], 0x03 : [ 1, "inc", "bc" ], 0x04 : [ 1, "inc", "b" ], 0x05 : [ 1, "dec", "b" ], 0x06 : [ 2, "ld", "b,n" ], 0x07 : [ 1, "rlca", "implied" ], 0x08 : [ 1, "ex", "af,af'" ], 0x09 : [ 1, "add", "hl,bc" ], 0x0a : [ 1, "ld", "a,indbc" ], 0x0b : [ 1, "dec", "bc" ], 0x0c : [ 1, "inc", "c" ], 0x0d : [ 1, "dec", "c" ], 0x0e : [ 2, "ld", "c,n" ], 0x0f : [ 1, "rrca", "implied" ], 0x10 : [ 2, "djnz", "pcr", pcr ], 0x11 : [ 3, "ld", "de,nn" ], 0x12 : [ 1, "ld", "indde,a" ], 0x13 : [ 1, "inc", "de" ], 0x14 : [ 1, "inc", "d" ], 0x15 : [ 1, "dec", "d" ], 0x16 : [ 2, "ld", "d,n" ], 0x17 : [ 1, "rla", "implied" ], 0x18 : [ 2, "jr", "pcr", pcr ], 0x19 : [ 1, "add", "hl,de" ], 0x1a : [ 1, "ld", "a,indde" ], 0x1b : [ 1, "dec", "de" ], 0x1c : [ 1, "inc", "e" ], 0x1d : [ 1, "dec", "e" ], 0x1e : [ 2, "ld", "e,n" ], 0x1f : [ 1, "rra", "implied" ], 0x20 : [ 2, "jr", "nz,pcr", pcr ], 0x21 : [ 3, "ld", "hl,nn" ], 0x22 : [ 3, "ld", "indnn,hl" ], 0x23 : [ 1, "inc", "hl" ], 0x24 : [ 1, "inc", "h" ], 0x25 : [ 1, "dec", "h" ], 0x26 : [ 2, "ld", "h,n" ], 0x27 : [ 1, "daa", "implied" ], 0x28 : [ 2, "jr", "z,pcr", pcr ], 0x29 : [ 1, "add", "hl,hl" ], 0x2a : [ 3, "ld", "hl,indnn" ], 0x2b : [ 1, "dec", "hl" ], 0x2c : [ 1, "inc", "l" ], 0x2d : [ 1, "dec", "l" ], 0x2e : [ 2, "ld", "l,n" ], 0x2f : [ 1, "cpl", "implied" ], 0x30 : [ 2, "jr", "nc,pcr", pcr ], 0x31 : [ 3, "ld", "sp,nn" ], 0x32 : [ 3, "ld", "indnn,a" ], 0x33 : [ 1, "inc", "sp" ], 0x34 : [ 1, "inc", "indhl" ], 0x35 : [ 1, "dec", "indhl" ], 0x36 : [ 2, "ld", "indhl,n" ], 0x37 : [ 1, "scf", "implied" ], 0x38 : [ 2, "jr", "c,pcr", pcr ], 0x39 : [ 1, "add", "hl,sp" ], 0x3a : [ 3, "ld", "a,indnn" ], 0x3b : [ 1, "dec", "sp" ], 0x3c : [ 1, "inc", "a" ], 0x3d : [ 1, "dec", "a" ], 0x3e : [ 2, "ld", "a,n" ], 0x3f : [ 1, "ccf", "implied" ], 0x40 : [ 1, "ld", "b,b" ], 0x41 : [ 1, "ld", "b,c" ], 0x42 : [ 1, "ld", "b,d" ], 0x43 : [ 1, "ld", "b,e" ], 0x44 : [ 1, "ld", "b,h" ], 0x45 : [ 1, "ld", "b,l" ], 0x46 : [ 1, "ld", "b,indhl" ], 0x47 : [ 1, "ld", "b,a" ], 0x48 : [ 1, "ld", "c,b" ], 0x49 : [ 1, "ld", "c,c" ], 0x4a : [ 1, "ld", "c,d" ], 0x4b : [ 1, "ld", "c,e" ], 0x4c : [ 1, "ld", "c,h" ], 0x4d : [ 1, "ld", "c,l" ], 0x4e : [ 1, "ld", "c,indhl" ], 0x4f : [ 1, "ld", "c,a" ], 0x50 : [ 1, "ld", "d,b" ], 0x51 : [ 1, "ld", "d,c" ], 0x52 : [ 1, "ld", "d,d" ], 0x53 : [ 1, "ld", "d,e" ], 0x54 : [ 1, "ld", "d,h" ], 0x55 : [ 1, "ld", "d,l" ], 0x56 : [ 1, "ld", "d,indhl" ], 0x57 : [ 1, "ld", "d,a" ], 0x58 : [ 1, "ld", "e,b" ], 0x59 : [ 1, "ld", "e,c" ], 0x5a : [ 1, "ld", "e,d" ], 0x5b : [ 1, "ld", "e,e" ], 0x5c : [ 1, "ld", "e,h" ], 0x5d : [ 1, "ld", "e,l" ], 0x5e : [ 1, "ld", "e,indhl" ], 0x5f : [ 1, "ld", "e,a" ], 0x60 : [ 1, "ld", "h,b" ], 0x61 : [ 1, "ld", "h,c" ], 0x62 : [ 1, "ld", "h,d" ], 0x63 : [ 1, "ld", "h,e" ], 0x64 : [ 1, "ld", "h,h" ], 0x65 : [ 1, "ld", "h,l" ], 0x66 : [ 1, "ld", "h,indhl" ], 0x67 : [ 1, "ld", "h,a" ], 0x68 : [ 1, "ld", "l,b" ], 0x69 : [ 1, "ld", "l,c" ], 0x6a : [ 1, "ld", "l,d" ], 0x6b : [ 1, "ld", "l,e" ], 0x6c : [ 1, "ld", "l,h" ], 0x6d : [ 1, "ld", "l,l" ], 0x6e : [ 1, "ld", "l,indhl" ], 0x6f : [ 1, "ld", "l,a" ], 0x70 : [ 1, "ld", "indhl,b" ], 0x71 : [ 1, "ld", "indhl,c" ], 0x72 : [ 1, "ld", "indhl,d" ], 0x73 : [ 1, "ld", "indhl,e" ], 0x74 : [ 1, "ld", "indhl,h" ], 0x75 : [ 1, "ld", "indhl,l" ], 0x76 : [ 1, "halt", "implied" ], 0x77 : [ 1, "ld", "indhl,a" ], 0x78 : [ 1, "ld", "a,b" ], 0x79 : [ 1, "ld", "a,c" ], 0x7a : [ 1, "ld", "a,d" ], 0x7b : [ 1, "ld", "a,e" ], 0x7c : [ 1, "ld", "a,h" ], 0x7d : [ 1, "ld", "a,l" ], 0x7e : [ 1, "ld", "a,indhl" ], 0x7f : [ 1, "ld", "a,a" ], 0x80 : [ 1, "add", "a,b" ], 0x81 : [ 1, "add", "a,c" ], 0x82 : [ 1, "add", "a,d" ], 0x83 : [ 1, "add", "a,e" ], 0x84 : [ 1, "add", "a,h" ], 0x85 : [ 1, "add", "a,l" ], 0x86 : [ 1, "add", "a,indhl" ], 0x87 : [ 1, "add", "a,a" ], 0x88 : [ 1, "adc", "a,b" ], 0x89 : [ 1, "adc", "a,c" ], 0x8a : [ 1, "adc", "a,d" ], 0x8b : [ 1, "adc", "a,e" ], 0x8c : [ 1, "adc", "a,h" ], 0x8d : [ 1, "adc", "a,l" ], 0x8e : [ 1, "adc", "a,indhl" ], 0x8f : [ 1, "adc", "a,a" ], 0x90 : [ 1, "sub", "b" ], 0x91 : [ 1, "sub", "c" ], 0x92 : [ 1, "sub", "d" ], 0x93 : [ 1, "sub", "e" ], 0x94 : [ 1, "sub", "h" ], 0x95 : [ 1, "sub", "l" ], 0x96 : [ 1, "sub", "indhl" ], 0x97 : [ 1, "sub", "a" ], 0x98 : [ 1, "sbc", "a,b" ], 0x99 : [ 1, "sbc", "a,c" ], 0x9a : [ 1, "sbc", "a,d" ], 0x9b : [ 1, "sbc", "a,e" ], 0x9c : [ 1, "sbc", "a,h" ], 0x9d : [ 1, "sbc", "a,l" ], 0x9e : [ 1, "sbc", "a,indhl" ], 0x9f : [ 1, "sbc", "a,a" ], 0xa0 : [ 1, "and", "b" ], 0xa1 : [ 1, "and", "c" ], 0xa2 : [ 1, "and", "d" ], 0xa3 : [ 1, "and", "e" ], 0xa4 : [ 1, "and", "h" ], 0xa5 : [ 1, "and", "l" ], 0xa6 : [ 1, "and", "indhl" ], 0xa7 : [ 1, "and", "a" ], 0xa8 : [ 1, "xor", "b" ], 0xa9 : [ 1, "xor", "c" ], 0xaa : [ 1, "xor", "d" ], 0xab : [ 1, "xor", "e" ], 0xac : [ 1, "xor", "h" ], 0xad : [ 1, "xor", "l" ], 0xae : [ 1, "xor", "indhl" ], 0xaf : [ 1, "xor", "a" ], 0xb0 : [ 1, "or", "b" ], 0xb1 : [ 1, "or", "c" ], 0xb2 : [ 1, "or", "d" ], 0xb3 : [ 1, "or", "e" ], 0xb4 : [ 1, "or", "h" ], 0xb5 : [ 1, "or", "l" ], 0xb6 : [ 1, "or", "indhl" ], 0xb7 : [ 1, "or", "a" ], 0xb8 : [ 1, "cp", "b" ], 0xb9 : [ 1, "cp", "c" ], 0xba : [ 1, "cp", "d" ], 0xbb : [ 1, "cp", "e" ], 0xbc : [ 1, "cp", "h" ], 0xbd : [ 1, "cp", "l" ], 0xbe : [ 1, "cp", "indhl" ], 0xbf : [ 1, "cp", "a" ], 0xc0 : [ 1, "ret", "nz" ], 0xc1 : [ 1, "pop", "bc" ], 0xc2 : [ 3, "jp", "nz,nn" ], 0xc3 : [ 3, "jp", "nn" ], 0xc4 : [ 3, "call","nz,nn" ], 0xc5 : [ 1, "push","bc" ], 0xc6 : [ 2, "add", "a,n" ], 0xc7 : [ 1, "rst", "00" ], 0xc8 : [ 1, "ret", "z" ], 0xc9 : [ 1, "ret", "implied" ], 0xca : [ 3, "jp", "z,nn" ], 0xcc : [ 3, "call","z,nn" ], 0xcd : [ 3, "call", "nn" ], 0xce : [ 2, "adc", "a,n" ], 0xcf : [ 1, "rst", "08" ], 0xd0 : [ 1, "ret", "nc" ], 0xd1 : [ 1, "pop", "de" ], 0xd2 : [ 3, "jp", "nc,nn" ], 0xd3 : [ 2, "out", "indn,a" ], 0xd4 : [ 3, "call", "nc,nn" ], 0xd5 : [ 1, "push", "de" ], 0xd6 : [ 2, "sub", "n" ], 0xd7 : [ 1, "rst", "10" ], 0xd8 : [ 1, "ret", "c" ], 0xd9 : [ 1, "exx", "implied" ], 0xda : [ 3, "jp", "c,nn" ], 0xdb : [ 2, "in", "a,indn" ], 0xdc : [ 3, "call", "c,nn" ], 0xde : [ 2, "sbc", "a,n" ], 0xdf : [ 1, "rst", "18" ], 0xe0 : [ 1, "ret", "po" ], 0xe1 : [ 1, "pop", "hl" ], 0xe2 : [ 3, "jp", "po,nn" ], 0xe3 : [ 1, "ex", "indsp,hl" ], 0xe4 : [ 3, "call", "po,nn" ], 0xe5 : [ 1, "push", "hl" ], 0xe6 : [ 2, "and", "n" ], 0xe7 : [ 1, "rst", "20" ], 0xe8 : [ 1, "ret", "pe" ], 0xe9 : [ 1, "jp", "indhl" ], 0xea : [ 3, "jp", "pe,nn" ], 0xeb : [ 1, "ex", "de,hl" ], 0xec : [ 3, "call", "pe,nn" ], 0xee : [ 2, "xor", "n" ], 0xef : [ 1, "rst", "28" ], 0xf0 : [ 1, "ret", "p" ], 0xf1 : [ 1, "pop", "af" ], 0xf2 : [ 3, "jp", "p,nn" ], 0xf3 : [ 1, "di", "implied" ], 0xf4 : [ 3, "call", "p,nn" ], 0xf5 : [ 1, "push", "af" ], 0xf6 : [ 2, "or", "n" ], 0xf7 : [ 1, "rst", "30" ], 0xf8 : [ 1, "ret", "m" ], 0xf9 : [ 1, "ld", "sp,hl" ], 0xfa : [ 3, "jp", "m,nn" ], 0xfb : [ 1, "ei", "implied" ], 0xfc : [ 3, "call", "m,nn" ], 0xfe : [ 2, "cp", "n" ], 0xff : [ 1, "rst", "38" ], # Multibyte instructions 0xcb00 : [ 2, "rlc", "b" ], 0xcb01 : [ 2, "rlc", "c" ], 0xcb02 : [ 2, "rlc", "d" ], 0xcb03 : [ 2, "rlc", "e" ], 0xcb04 : [ 2, "rlc", "h" ], 0xcb05 : [ 2, "rlc", "l" ], 0xcb06 : [ 2, "rlc", "indhl" ], 0xcb07 : [ 2, "rlc", "a" ], 0xcb08 : [ 2, "rrc", "b" ], 0xcb09 : [ 2, "rrc", "c" ], 0xcb0a : [ 2, "rrc", "d" ], 0xcb0b : [ 2, "rrc", "e" ], 0xcb0c : [ 2, "rrc", "h" ], 0xcb0d : [ 2, "rrc", "l" ], 0xcb0e : [ 2, "rrc", "indhl" ], 0xcb0f : [ 2, "rrc", "a" ], 0xcb10 : [ 2, "rl", "b" ], 0xcb11 : [ 2, "rl", "c" ], 0xcb12 : [ 2, "rl", "d" ], 0xcb13 : [ 2, "rl", "e" ], 0xcb14 : [ 2, "rl", "h" ], 0xcb15 : [ 2, "rl", "l" ], 0xcb16 : [ 2, "rl", "indhl" ], 0xcb17 : [ 2, "rl", "a" ], 0xcb18 : [ 2, "rr", "b" ], 0xcb19 : [ 2, "rr", "c" ], 0xcb1a : [ 2, "rr", "d" ], 0xcb1b : [ 2, "rr", "e" ], 0xcb1c : [ 2, "rr", "h" ], 0xcb1d : [ 2, "rr", "l" ], 0xcb1e : [ 2, "rr", "indhl" ], 0xcb1f : [ 2, "rr", "a" ], 0xcb20 : [ 2, "sla", "b" ], 0xcb21 : [ 2, "sla", "c" ], 0xcb22 : [ 2, "sla", "d" ], 0xcb23 : [ 2, "sla", "e" ], 0xcb24 : [ 2, "sla", "h" ], 0xcb25 : [ 2, "sla", "l" ], 0xcb26 : [ 2, "sla", "indhl" ], 0xcb27 : [ 2, "sla", "a" ], 0xcb28 : [ 2, "sra", "b" ], 0xcb29 : [ 2, "sra", "c" ], 0xcb2a : [ 2, "sra", "d" ], 0xcb2b : [ 2, "sra", "e" ], 0xcb2c : [ 2, "sra", "h" ], 0xcb2d : [ 2, "sra", "l" ], 0xcb2e : [ 2, "sra", "indhl" ], 0xcb2f : [ 2, "sra", "a" ], 0xcb38 : [ 2, "srl", "b" ], 0xcb39 : [ 2, "srl", "c" ], 0xcb3a : [ 2, "srl", "d" ], 0xcb3b : [ 2, "srl", "e" ], 0xcb3c : [ 2, "srl", "h" ], 0xcb3d : [ 2, "srl", "l" ], 0xcb3e : [ 2, "srl", "indhl" ], 0xcb3f : [ 2, "srl", "a" ], 0xcb40 : [ 2, "bit", "0,b" ], 0xcb41 : [ 2, "bit", "0,c" ], 0xcb42 : [ 2, "bit", "0,d" ], 0xcb43 : [ 2, "bit", "0,e" ], 0xcb44 : [ 2, "bit", "0,h" ], 0xcb45 : [ 2, "bit", "0,l" ], 0xcb46 : [ 2, "bit", "0,indhl" ], 0xcb47 : [ 2, "bit", "0,a" ], 0xcb48 : [ 2, "bit", "1,b" ], 0xcb49 : [ 2, "bit", "1,c" ], 0xcb4a : [ 2, "bit", "1,d" ], 0xcb4b : [ 2, "bit", "1,e" ], 0xcb4c : [ 2, "bit", "1,h" ], 0xcb4d : [ 2, "bit", "1,l" ], 0xcb4e : [ 2, "bit", "1,indhl" ], 0xcb4f : [ 2, "bit", "1,a" ], 0xcb50 : [ 2, "bit", "2,b" ], 0xcb51 : [ 2, "bit", "2,c" ], 0xcb52 : [ 2, "bit", "2,d" ], 0xcb53 : [ 2, "bit", "2,e" ], 0xcb54 : [ 2, "bit", "2,h" ], 0xcb55 : [ 2, "bit", "2,l" ], 0xcb56 : [ 2, "bit", "2,indhl" ], 0xcb57 : [ 2, "bit", "2,a" ], 0xcb58 : [ 2, "bit", "3,b" ], 0xcb59 : [ 2, "bit", "3,c" ], 0xcb5a : [ 2, "bit", "3,d" ], 0xcb5b : [ 2, "bit", "3,e" ], 0xcb5c : [ 2, "bit", "3,h" ], 0xcb5d : [ 2, "bit", "3,l" ], 0xcb5e : [ 2, "bit", "3,indhl" ], 0xcb5f : [ 2, "bit", "3,a" ], 0xcb60 : [ 2, "bit", "4,b" ], 0xcb61 : [ 2, "bit", "4,c" ], 0xcb62 : [ 2, "bit", "4,d" ], 0xcb63 : [ 2, "bit", "4,e" ], 0xcb64 : [ 2, "bit", "4,h" ], 0xcb65 : [ 2, "bit", "4,l" ], 0xcb66 : [ 2, "bit", "4,indhl" ], 0xcb67 : [ 2, "bit", "4,a" ], 0xcb68 : [ 2, "bit", "5,b" ], 0xcb69 : [ 2, "bit", "5,c" ], 0xcb6a : [ 2, "bit", "5,d" ], 0xcb6b : [ 2, "bit", "5,e" ], 0xcb6c : [ 2, "bit", "5,h" ], 0xcb6d : [ 2, "bit", "5,l" ], 0xcb6e : [ 2, "bit", "5,indhl" ], 0xcb6f : [ 2, "bit", "5,a" ], 0xcb70 : [ 2, "bit", "6,b" ], 0xcb71 : [ 2, "bit", "6,c" ], 0xcb72 : [ 2, "bit", "6,d" ], 0xcb73 : [ 2, "bit", "6,e" ], 0xcb74 : [ 2, "bit", "6,h" ], 0xcb75 : [ 2, "bit", "6,l" ], 0xcb76 : [ 2, "bit", "6,indhl" ], 0xcb77 : [ 2, "bit", "6,a" ], 0xcb78 : [ 2, "bit", "7,b" ], 0xcb79 : [ 2, "bit", "7,c" ], 0xcb7a : [ 2, "bit", "7,d" ], 0xcb7b : [ 2, "bit", "7,e" ], 0xcb7c : [ 2, "bit", "7,h" ], 0xcb7d : [ 2, "bit", "7,l" ], 0xcb7e : [ 2, "bit", "7,indhl" ], 0xcb7f : [ 2, "bit", "7,a" ], 0xcb80 : [ 2, "res", "0,b" ], 0xcb81 : [ 2, "res", "0,c" ], 0xcb82 : [ 2, "res", "0,d" ], 0xcb83 : [ 2, "res", "0,e" ], 0xcb84 : [ 2, "res", "0,h" ], 0xcb85 : [ 2, "res", "0,l" ], 0xcb86 : [ 2, "res", "0,indhl" ], 0xcb87 : [ 2, "res", "0,a" ], 0xcb88 : [ 2, "res", "1,b" ], 0xcb89 : [ 2, "res", "1,c" ], 0xcb8a : [ 2, "res", "1,d" ], 0xcb8b : [ 2, "res", "1,e" ], 0xcb8c : [ 2, "res", "1,h" ], 0xcb8d : [ 2, "res", "1,l" ], 0xcb8e : [ 2, "res", "1,indhl" ], 0xcb8f : [ 2, "res", "1,a" ], 0xcb90 : [ 2, "res", "2,b" ], 0xcb91 : [ 2, "res", "2,c" ], 0xcb92 : [ 2, "res", "2,d" ], 0xcb93 : [ 2, "res", "2,e" ], 0xcb94 : [ 2, "res", "2,h" ], 0xcb95 : [ 2, "res", "2,l" ], 0xcb96 : [ 2, "res", "2,indhl" ], 0xcb97 : [ 2, "res", "2,a" ], 0xcb98 : [ 2, "res", "3,b" ], 0xcb99 : [ 2, "res", "3,c" ], 0xcb9a : [ 2, "res", "3,d" ], 0xcb9b : [ 2, "res", "3,e" ], 0xcb9c : [ 2, "res", "3,h" ], 0xcb9d : [ 2, "res", "3,l" ], 0xcb9e : [ 2, "res", "3,indhl" ], 0xcb9f : [ 2, "res", "3,a" ], 0xcba0 : [ 2, "res", "4,b" ], 0xcba1 : [ 2, "res", "4,c" ], 0xcba2 : [ 2, "res", "4,d" ], 0xcba3 : [ 2, "res", "4,e" ], 0xcba4 : [ 2, "res", "4,h" ], 0xcba5 : [ 2, "res", "4,l" ], 0xcba6 : [ 2, "res", "4,indhl" ], 0xcba7 : [ 2, "res", "4,a" ], 0xcba8 : [ 2, "res", "5,b" ], 0xcba9 : [ 2, "res", "5,c" ], 0xcbaa : [ 2, "res", "5,d" ], 0xcbab : [ 2, "res", "5,e" ], 0xcbac : [ 2, "res", "5,h" ], 0xcbad : [ 2, "res", "5,l" ], 0xcbae : [ 2, "res", "5,indhl" ], 0xcbaf : [ 2, "res", "5,a" ], 0xcbb0 : [ 2, "res", "6,b" ], 0xcbb1 : [ 2, "res", "6,c" ], 0xcbb2 : [ 2, "res", "6,d" ], 0xcbb3 : [ 2, "res", "6,e" ], 0xcbb4 : [ 2, "res", "6,h" ], 0xcbb5 : [ 2, "res", "6,l" ], 0xcbb6 : [ 2, "res", "6,indhl" ], 0xcbb7 : [ 2, "res", "6,a" ], 0xcbb8 : [ 2, "res", "7,b" ], 0xcbb9 : [ 2, "res", "7,c" ], 0xcbba : [ 2, "res", "7,d" ], 0xcbbb : [ 2, "res", "7,e" ], 0xcbbc : [ 2, "res", "7,h" ], 0xcbbd : [ 2, "res", "7,l" ], 0xcbbe : [ 2, "res", "7,indhl" ], 0xcbbf : [ 2, "res", "7,a" ], 0xcbc0 : [ 2, "set", "0,b" ], 0xcbc1 : [ 2, "set", "0,c" ], 0xcbc2 : [ 2, "set", "0,d" ], 0xcbc3 : [ 2, "set", "0,e" ], 0xcbc4 : [ 2, "set", "0,h" ], 0xcbc5 : [ 2, "set", "0,l" ], 0xcbc6 : [ 2, "set", "0,indhl" ], 0xcbc7 : [ 2, "set", "0,a" ], 0xcbc8 : [ 2, "set", "1,b" ], 0xcbc9 : [ 2, "set", "1,c" ], 0xcbca : [ 2, "set", "1,d" ], 0xcbcb : [ 2, "set", "1,e" ], 0xcbcc : [ 2, "set", "1,h" ], 0xcbcd : [ 2, "set", "1,l" ], 0xcbce : [ 2, "set", "1,indhl" ], 0xcbcf : [ 2, "set", "1,a" ], 0xcbd0 : [ 2, "set", "2,b" ], 0xcbd1 : [ 2, "set", "2,c" ], 0xcbd2 : [ 2, "set", "2,d" ], 0xcbd3 : [ 2, "set", "2,e" ], 0xcbd4 : [ 2, "set", "2,h" ], 0xcbd5 : [ 2, "set", "2,l" ], 0xcbd6 : [ 2, "set", "2,indhl" ], 0xcbd7 : [ 2, "set", "2,a" ], 0xcbd8 : [ 2, "set", "3,b" ], 0xcbd9 : [ 2, "set", "3,c" ], 0xcbda : [ 2, "set", "3,d" ], 0xcbdb : [ 2, "set", "3,e" ], 0xcbdc : [ 2, "set", "3,h" ], 0xcbdd : [ 2, "set", "3,l" ], 0xcbde : [ 2, "set", "3,indhl" ], 0xcbdf : [ 2, "set", "3,a" ], 0xcbe0 : [ 2, "set", "4,b" ], 0xcbe1 : [ 2, "set", "4,c" ], 0xcbe2 : [ 2, "set", "4,d" ], 0xcbe3 : [ 2, "set", "4,e" ], 0xcbe4 : [ 2, "set", "4,h" ], 0xcbe5 : [ 2, "set", "4,l" ], 0xcbe6 : [ 2, "set", "4,indhl" ], 0xcbe7 : [ 2, "set", "4,a" ], 0xcbe8 : [ 2, "set", "5,b" ], 0xcbe9 : [ 2, "set", "5,c" ], 0xcbea : [ 2, "set", "5,d" ], 0xcbeb : [ 2, "set", "5,e" ], 0xcbec : [ 2, "set", "5,h" ], 0xcbed : [ 2, "set", "5,l" ], 0xcbee : [ 2, "set", "5,indhl" ], 0xcbef : [ 2, "set", "5,a" ], 0xcbf0 : [ 2, "set", "6,b" ], 0xcbf1 : [ 2, "set", "6,c" ], 0xcbf2 : [ 2, "set", "6,d" ], 0xcbf3 : [ 2, "set", "6,e" ], 0xcbf4 : [ 2, "set", "6,h" ], 0xcbf5 : [ 2, "set", "6,l" ], 0xcbf6 : [ 2, "set", "6,indhl" ], 0xcbf7 : [ 2, "set", "6,a" ], 0xcbf8 : [ 2, "set", "7,b" ], 0xcbf9 : [ 2, "set", "7,c" ], 0xcbfa : [ 2, "set", "7,d" ], 0xcbfb : [ 2, "set", "7,e" ], 0xcbfc : [ 2, "set", "7,h" ], 0xcbfd : [ 2, "set", "7,l" ], 0xcbfe : [ 2, "set", "7,indhl" ], 0xcbff : [ 2, "set", "7,a" ], 0xdd09 : [ 2, "add", "ix,bc" ], 0xdd19 : [ 2, "add", "ix,de" ], 0xdd21 : [ 4, "ld", "ix,aa" ], 0xdd22 : [ 4, "ld", "indaa,ix" ], 0xdd23 : [ 2, "inc", "ix" ], 0xdd29 : [ 2, "add", "ix,ix" ], 0xdd2a : [ 4, "ld", "ix,indaa" ], 0xdd2b : [ 2, "dec", "ix" ], 0xdd34 : [ 3, "inc", "indix+d" ], 0xdd35 : [ 3, "dec", "indix+d" ], 0xdd36 : [ 4, "ld", "indix+d,n" ], 0xdd39 : [ 2, "add", "ix,sp" ], 0xdd46 : [ 3, "ld", "b,indix+d" ], 0xdd4e : [ 3, "ld", "c,indix+d" ], 0xdd56 : [ 3, "ld", "d,indix+d" ], 0xdd5e : [ 3, "ld", "e,indix+d" ], 0xdd66 : [ 3, "ld", "h,indix+d" ], 0xdd6e : [ 3, "ld", "l,indix+d" ], 0xdd70 : [ 3, "ld", "indix+d,b" ], 0xdd71 : [ 3, "ld", "indix+d,c" ], 0xdd72 : [ 3, "ld", "indix+d,d" ], 0xdd73 : [ 3, "ld", "indix+d,e" ], 0xdd74 : [ 3, "ld", "indix+d,h" ], 0xdd75 : [ 3, "ld", "indix+d,l" ], 0xdd77 : [ 3, "ld", "indix+d,a" ], 0xdd7e : [ 3, "ld", "a,indix+d" ], 0xdd86 : [ 3, "add", "a,indix+d" ], 0xdd8e : [ 3, "adc", "a,indix+d" ], 0xdd96 : [ 3, "sub", "indix+d" ], 0xdd9e : [ 3, "sbc", "a,indix+d" ], 0xdda6 : [ 3, "and", "indix+d" ], 0xddae : [ 3, "xor", "indix+d" ], 0xddb6 : [ 3, "or", "indix+d" ], 0xddbe : [ 3, "cp", "indix+d" ], 0xed40 : [ 2, "in", "b,indc" ], 0xed41 : [ 2, "out", "indc,b" ], 0xed42 : [ 2, "sbc", "hl,bc" ], 0xed43 : [ 4, "ld", "indaa,bc" ], 0xed44 : [ 2, "neg", "implied" ], 0xed45 : [ 2, "retn", "implied" ], 0xed46 : [ 2, "im", "0" ], 0xed47 : [ 2, "ld", "i,a" ], 0xed48 : [ 2, "in", "c,indc" ], 0xed49 : [ 2, "out", "indc,c" ], 0xed4a : [ 2, "adc", "hl,bc" ], 0xed4b : [ 4, "ld", "bc,indaa" ], 0xed4d : [ 2, "reti", "implied" ], 0xed4f : [ 2, "ld", "r,a" ], 0xed50 : [ 2, "in", "d,indc" ], 0xed51 : [ 2, "out", "indc,d" ], 0xed52 : [ 2, "sbc", "hl,de" ], 0xed53 : [ 4, "ld", "indaa,de" ], 0xed56 : [ 2, "im", "1" ], 0xed57 : [ 2, "ld", "a,i" ], 0xed58 : [ 2, "in", "e,indc" ], 0xed59 : [ 2, "out", "indc,e" ], 0xed5a : [ 2, "adc", "hl,de" ], 0xed5b : [ 4, "ld", "de,indaa" ], 0xed5e : [ 2, "im", "2" ], 0xed5f : [ 2, "ld", "a,r" ], 0xed60 : [ 2, "in", "h,indc" ], 0xed61 : [ 2, "out", "indc,h" ], 0xed62 : [ 2, "sbc", "hl,hl" ], 0xed67 : [ 2, "rrd", "implied" ], 0xed68 : [ 2, "in", "l,indc" ], 0xed69 : [ 2, "out", "indc,l" ], 0xed6a : [ 2, "adc", "hl,hl" ], 0xed6f : [ 2, "rld", "implied" ], 0xed72 : [ 2, "sbc", "hl,sp" ], 0xed73 : [ 4, "ld", "indaa,sp" ], 0xed76 : [ 2, "in", "a,indc" ], 0xed79 : [ 2, "out", "indc,a" ], 0xed7a : [ 2, "adc", "hl,sp" ], 0xed7b : [ 4, "ld", "sp,indaa" ], 0xeda0 : [ 2, "ldi", "implied" ], 0xeda1 : [ 2, "cpi", "implied" ], 0xeda2 : [ 2, "ini", "implied" ], 0xeda3 : [ 2, "outi", "implied" ], 0xeda8 : [ 2, "ldd", "implied" ], 0xeda9 : [ 2, "cpd", "implied" ], 0xedaa : [ 2, "ind", "implied" ], 0xedab : [ 2, "outd", "implied" ], 0xedb0 : [ 2, "ldir", "implied" ], 0xedb1 : [ 2, "cpir", "implied" ], 0xedb2 : [ 2, "inir", "implied" ], 0xedb3 : [ 2, "otir", "implied" ], 0xedb8 : [ 2, "lddr", "implied" ], 0xedb9 : [ 2, "cpdr", "implied" ], 0xedba : [ 2, "indr", "implied" ], 0xedbb : [ 2, "otdr", "implied" ], 0xfd09 : [ 2, "add", "iy,bc" ], 0xfd19 : [ 2, "add", "iy,de" ], 0xfd21 : [ 4, "ld", "iy,aa" ], 0xfd22 : [ 4, "ld", "indaa,iy" ], 0xfd23 : [ 2, "inc", "iy" ], 0xfd29 : [ 2, "add", "iy,iy" ], 0xfd2a : [ 4, "ld", "iy,indaa" ], 0xfd2b : [ 2, "dec", "iy" ], 0xfd34 : [ 3, "inc", "indiy+d" ], 0xfd35 : [ 3, "dec", "indiy+d" ], 0xfd36 : [ 4, "ld", "indiy+d,n" ], 0xfd39 : [ 2, "add", "iy,sp" ], 0xfd46 : [ 3, "ld", "b,indiy+d" ], 0xfd4e : [ 3, "ld", "c,indiy+d" ], 0xfd56 : [ 3, "ld", "d,indiy+d" ], 0xfd5e : [ 3, "ld", "e,indiy+d" ], 0xfd66 : [ 3, "ld", "h,indiy+d" ], 0xfd6e : [ 3, "ld", "l,indiy+d" ], 0xfd70 : [ 3, "ld", "indiy+d,b" ], 0xfd71 : [ 3, "ld", "indiy+d,c" ], 0xfd72 : [ 3, "ld", "indiy+d,d" ], 0xfd73 : [ 3, "ld", "indiy+d,e" ], 0xfd74 : [ 3, "ld", "indiy+d,h" ], 0xfd75 : [ 3, "ld", "indiy+d,l" ], 0xfd77 : [ 3, "ld", "indiy+d,a" ], 0xfd7e : [ 3, "ld", "a,indiy+d" ], 0xfd86 : [ 3, "add", "a,indiy+d" ], 0xfd8e : [ 3, "adc", "a,indiy+d" ], 0xfd96 : [ 3, "sub", "indiy+d" ], 0xfd9e : [ 3, "sbc", "a,indiy+d" ], 0xfda6 : [ 3, "and", "indiy+d" ], 0xfdae : [ 3, "xor", "indiy+d" ], 0xfdb6 : [ 3, "or", "indiy+d" ], 0xfdbe : [ 3, "cp", "indiy+d" ], # Placeholder 2-byte leadins for the 4-byte ix/iy bit instructions fully # defined below. The z80bit flag triggers a special case in the disassembler # to look up the 4 byte instruction. 0xddcb : [ 4, "ixbit", "implied", z80bit ], 0xfdcb : [ 4, "iybit", "implied", z80bit ], } def extra_opcodes(addr_table, op_table): # Create all the 0xddcb and 0xfdcb addressing modes. The modes look like [0-7],(i[xy]+*)[,[abcdehl]]? for index in ['x', 'y']: for bit in range(8): k = "%d,indi%s+d" % (bit, index) v = "%d,(i%s+${0:02X})" % (bit, index) addr_table[k] = v for reg in ['a', 'b', 'c', 'd', 'e', 'h', 'l']: k = "%d,indi%s+d,%s" % (bit, index, reg) v = "%d,(i%s+${0:02X}),%s" % (bit, index, reg) addr_table[k] = v # Create all the 0xddcb and 0xfdcb opcodes. These are all 4 byte opcodes # where the 3rd byte is a -128 - +127 offset. For the purposes of using # this table, the 3rd byte will be marked as zero and the disassembler will # have to insert the real 3rd byte the check of the z80bit special case for first_byte, x_or_y in [(0xdd, 'x'), (0xfd, 'y')]: # groups of 8, expand to full 256 mnemonics_8 = ['rlc', 'rrc', 'rl', 'rr', 'sla', 'sra', 'sll', 'sr1'] + ['bit'] * 8 + ['res'] * 8 + ['set'] * 8 mnemonics = [m for mnemonic in mnemonics_8 for m in [mnemonic]*8] # create all 256 addressing modes, in groups of 64 addrmodes = ['indi%s+d' + a for a in [',b', ',c', ',d', ',e', ',h', ',l', '', ',a']] * 8 + [f % d for d in range(8) for f in ['%d,indi%%s+d'] * 8] + [f % d for d in range(8) for f in ['%d,indi%%s+d' + a for a in [',b', ',c', ',d', ',e', ',h', ',l', '', ',a']]] * 2 for fourth_byte, (instruction, addrmode) in enumerate(zip(mnemonics, addrmodes)): opcode = (first_byte << 24) + (0xcb << 16) + fourth_byte op_table[opcode] = [ 4, instruction, addrmode % x_or_y, z80bit ] extra_opcodes(addressModeTable, opcodeTable) del extra_opcodes # End of processor specific code ##########################################################################