// license:BSD-3-Clause // copyright-holders:Tony La Porta, Grull Osgo /************************************************************************ Microchip PIC16X8x Emulator Based on MAME's PIC16C5x cpu_device dissasm developed by Tony La Porta. A Address to jump to. B Bit address within an 8-bit file register. D Destination select (0 = store result in W (accumulator)) (1 = store result in file register) F Register file address. K Literal field, constant data. Includes Flags ID's on SFR registers where possible. ************************************************************************/ #include "emu.h" #include "16x8xdsm.h" #include #include const u8 pic16x8x_disassembler::sfr_bank0[16] = { 0, 0, 0, 1, 0, 2, 3, 0, 0, 0, 0, 4, 0, 0, 0, 0}; const char *const pic16x8x_disassembler::sfregs[12] = { "INDF", "TMR0", "PCL", "STATUS", "FSR", "PORTA", "PORTB", "Reg$07", "EEDATA", "EEADDR", "PCLATH", "INTCON" }; const char *const pic16x8x_disassembler::dest[2] = { "W", "Reg" }; const char *const pic16x8x_disassembler::reg_flags[9][8] = { {"0", "1", "2", "3", "4", "5", "6", "7"}, // no flags {"C", "DC", "Z", "PD", "TO", "RP0", "RP1", "IRP"}, // status {"RA0", "RA1", "RA2", "RA3", "RA4/T0CKI", "5", "6", "7"}, // portA {"RB0/INT", "RB1", "RB2", "RB3", "RB4", "RB5", "RB6", "RB7"}, // portB {"RBIF", "INTF", "T0IF", "RBIE", "INTE", "T0IE", "EEIE", "GIE"}, // intcon {"PS0", "PS1", "PS2", "PSA", "T0SE", "T0CS", "INTEDG", "RBPU"}, // option {"RA0", "RA1", "RA2", "RA3", "RA4", "5", "6", "7"}, // trisa {"RB0", "RB1", "RB2", "RB3", "RB4", "RB5", "RB6", "RB7"}, // trisb {"RD", "WR", "WREN", "WRERR", "EEIF", "5", "6", "7"} // eecon }; const char *const pic16x8x_disassembler::PIC16X8xFormats[] = { "00000000000000", "nop", "00000000001000", "return", "00000000001001", "retfie", "00000000100000", "nop", "00000001000000", "nop", "00000001100000", "nop", "00000001100011", "sleep", "00000001100100", "clrwdt", "0000001fffffff", "movwf %F", "00000100000000", "clrw", "0000011fffffff", "clrf %F", "000010dfffffff", "subwf %F,%D", "000011dfffffff", "decf %F,%D", "000100dfffffff", "iorwf %F,%D", "000101dfffffff", "andwf %F,%D", "000110dfffffff", "xorwf %F,%D", "000111dfffffff", "addwf %F,%D", "001000dfffffff", "movf %F,%D", "001001dfffffff", "comf %F,%D", "001010dfffffff", "incf %F,%D", "001011dfffffff", "decfsz %F,%D", "001100dfffffff", "rrf %F,%D", "001101dfffffff", "rlf %F,%D", "001110dfffffff", "swapf %F,%D", "001111dfffffff", "incfsz %F,%D", "0100bbbfffffff", "bcf %F,%B", "0101bbbfffffff", "bsf %F,%B", "0110bbbfffffff", "btfsc %F,%B", "0111bbbfffffff", "btfss %F,%B", "110100kkkkkkkk", "retlw %K", "110101kkkkkkkk", "retlw %K", "110110kkkkkkkk", "retlw %K", "110111kkkkkkkk", "retlw %K", "100aaaaaaaaaaa", "call %A", "101aaaaaaaaaaa", "goto %A", "110000kkkkkkkk", "movlw %K", "110001kkkkkkkk", "movlw %K", "110010kkkkkkkk", "movlw %K", "110011kkkkkkkk", "movlw %K", "111000kkkkkkkk", "iorlw %K", "111001kkkkkkkk", "andlw %K", "111010kkkkkkkk", "xorlw %K", "111100kkkkkkkk", "sublw %K", "111101kkkkkkkk", "sublw %K", "111110kkkkkkkk", "addlw %K", "111111kkkkkkkk", "addlw %K", nullptr }; pic16x8x_disassembler::pic16x8x_disassembler() { const char *p; const char *const *ops; u16 mask, bits; int bit; ops = PIC16X8xFormats; while (*ops) { p = *ops; mask = 0; bits = 0; bit = 13; while (*p && bit >= 0) { switch (*p++) { case '1': mask |= 1<= 0) { osd_printf_debug("{%c/%d}",*cp,bit); switch (*cp) { case 'a': a <<=1; a |= ((code & (1<