// license:BSD-3-Clause // copyright-holders:Tony La Porta /**************************************************************************\ * Microchip PIC16C5x Emulator * * * * Copyright Tony La Porta * * Originally written for the MAME project. * * * * * * Addressing architecture is based on the Harvard addressing scheme. * * * * Many thanks to those involved in the i8039 Disassembler * * as this was based on it. * * * * * * * * 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 (00-1F). * * K Literal field, constant data. * * * \**************************************************************************/ #include "emu.h" #include "16c5xdsm.h" #include #include const char *const pic16c5x_disassembler::regfile[32] = { "Reg$00 (IND)", "Reg$01 (TMR)", "Reg$02 (PCL)", "Reg$03 (ST)", "Reg$04 (FSR)", "Reg$05 (PTA)", "Reg$06 (PTB)", "Reg$07 (PTC)", "Reg$08", "Reg$09", "Reg$0A", "Reg$0B", "Reg$0C", "Reg$0D", "Reg$0E", "Reg$0F", "Reg$10", "Reg$11", "Reg$12", "Reg$13", "Reg$14", "Reg$15", "Reg$16", "Reg$17", "Reg$18", "Reg$19", "Reg$1A", "Reg$1B", "Reg$1C", "Reg$1D", "Reg$1E", "Reg$1F" }; const char *const pic16c5x_disassembler::dest[2] = { "W", "Reg" }; const char *const pic16c5x_disassembler::PIC16C5xFormats[] = { "000000000000", "nop", "000000000010", "option", "000000000011", "sleep", "000000000100", "clrwdt", "000000000101", "tris Port A", "000000000110", "tris Port B", "000000000111", "tris Port C", "0000001fffff", "movwf %F", "000001000000", "clrw", "0000011fffff", "clrf %F", "000010dfffff", "subwf %F,%D", "000011dfffff", "decf %F,%D", "000100dfffff", "iorwf %F,%D", "000101dfffff", "andwf %F,%D", "000110dfffff", "xorwf %F,%D", "000111dfffff", "addwf %F,%D", "001000dfffff", "movf %F,%D", "001001dfffff", "comf %F,%D", "001010dfffff", "incf %F,%D", "001011dfffff", "decfsz %F,%D", "001100dfffff", "rrf %F,%D", "001101dfffff", "rlf %F,%D", "001110dfffff", "swapf %F,%D", "001111dfffff", "incfsz %F,%D", "0100bbbfffff", "bcf %F,%B", "0101bbbfffff", "bsf %F,%B", "0110bbbfffff", "btfsc %F,%B", "0111bbbfffff", "btfss %F,%B", "1000kkkkkkkk", "retlw %K", "1001aaaaaaaa", "call %A", "101aaaaaaaaa", "goto %A", "1100kkkkkkkk", "movlw %K", "1101kkkkkkkk", "iorlw %K", "1110kkkkkkkk", "andlw %K", "1111kkkkkkkk", "xorlw %K", nullptr }; pic16c5x_disassembler::pic16c5x_disassembler() { const char *p; const char *const *ops; u16 mask, bits; int bit; ops = PIC16C5xFormats; while (*ops) { p = *ops; mask = 0; bits = 0; bit = 11; 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<