// 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 static const UINT8 *rombase; static const UINT8 *rambase; static offs_t pcbase; #define READOP16(A) (rombase[(A) - pcbase] | (rombase[(A) + 1 - pcbase] << 8)) #define READARG16(A) (rambase[(A) - pcbase] | (rambase[(A) + 1 - pcbase] << 8)) typedef unsigned char byte; typedef unsigned short int word; #define FMT(a,b) a, b #define PTRS_PER_FORMAT 2 static const char *const 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" }; static const char *const dest[2] = { "W", "Reg" }; static const char *const PIC16C5xFormats[] = { FMT("000000000000", "nop"), FMT("000000000010", "option"), FMT("000000000011", "sleep"), FMT("000000000100", "clrwdt"), FMT("000000000101", "tris Port A"), FMT("000000000110", "tris Port B"), FMT("000000000111", "tris Port C"), FMT("0000001fffff", "movwf %F"), FMT("000001000000", "clrw"), FMT("0000011fffff", "clrf %F"), FMT("000010dfffff", "subwf %F,%D"), FMT("000011dfffff", "decf %F,%D"), FMT("000100dfffff", "iorwf %F,%D"), FMT("000101dfffff", "andwf %F,%D"), FMT("000110dfffff", "xorwf %F,%D"), FMT("000111dfffff", "addwf %F,%D"), FMT("001000dfffff", "movf %F,%D"), FMT("001001dfffff", "comf %F,%D"), FMT("001010dfffff", "incf %F,%D"), FMT("001011dfffff", "decfsz %F,%D"), FMT("001100dfffff", "rrf %F,%D"), FMT("001101dfffff", "rlf %F,%D"), FMT("001110dfffff", "swapf %F,%D"), FMT("001111dfffff", "incfsz %F,%D"), FMT("0100bbbfffff", "bcf %F,%B"), FMT("0101bbbfffff", "bsf %F,%B"), FMT("0110bbbfffff", "btfsc %F,%B"), FMT("0111bbbfffff", "btfss %F,%B"), FMT("1000kkkkkkkk", "retlw %K"), FMT("1001aaaaaaaa", "call %A"), FMT("101aaaaaaaaa", "goto %A"), FMT("1100kkkkkkkk", "movlw %K"), FMT("1101kkkkkkkk", "iorlw %K"), FMT("1110kkkkkkkk", "andlw %K"), FMT("1111kkkkkkkk", "xorlw %K"), NULL }; #define MAX_OPS ((ARRAY_LENGTH(PIC16C5xFormats) - 1) / PTRS_PER_FORMAT) struct PIC16C5xOpcode { word mask; /* instruction mask */ word bits; /* constant bits */ word extcode; /* value that gets extension code */ const char *parse; /* how to parse bits */ const char *fmt; /* instruction format */ }; static PIC16C5xOpcode Op[MAX_OPS+1]; static int OpInizialized = 0; static void InitDasm16C5x(void) { const char *p; const char *const *ops; word mask, bits; int bit; int i; ops = PIC16C5xFormats; i = 0; 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<