bits1413 = (0b11_0000_0000_0000 & opcode) >> 12; // extraemos los dos bits superiores
switch (bits1413) {
case 0b00:
// en este caso, el tercer nibble es la operación, el bit 7 es la suboperación o destino, y el resto, el operando
nibble3 = (0b00_1111_0000_0000 & opcode) >> 8;
bit7 = (0b00_0000_1000_0000 & opcode) >> 7;
operando = (0b00_0000_0111_1111 & opcode);
switch (bit7) {
case 0:
reg = 'W';
break;
case 1;
reg = 'F';
break;
}
switch (nibble3) {
case 0x0:
switch (bit7) {
case 1:
printf("MOVWF %x\n", operando);
break;
case 0;
// aquí pueden ocurrir varios casos, según el primer nibble
nibble1 = (0b00_0000_0000_1111 & opcode);
switch (nibble1) {
case 0x0:
printf("NOP\n");
break;
case 0x4:
printf("CLRWDT\n");
break;
case 0x9:
printf("RETFIE\n");
break;
case 0x8:
printf("RETURN\n");
break;
case 0x3:
printf("SLEEP\n");
break;
}
break;
}
break;
case 0x1:
switch (bit7) {
case 0:
printf("CLRW\n");
break;
case 1;
printf("CLRF %x\n", operando);
break;
}
break;
case 0x2:
printf("SUBWF %x,%c\n", operando, reg);
break;
case 0x3:
printf("DECF %x,%c\n", operando, reg);
break;
case 0x4:
printf("IORWF %x,%c\n", operando, reg);
break;
case 0x5:
printf("ANDWF %x,%c\n", operando, reg);
break;
case 0x6:
printf("XORWF %x,%c\n", operando, reg);
break;
case 0x7:
printf("ADDWF %x,%c\n", operando, reg);
break;
case 0x8:
printf("MOVF %x,%c\n", operando, reg);
break;
case 0x9:
printf("COMF %x,%c\n", operando, reg);
break;
case 0xA:
printf("INCF %x,%c\n", operando, reg);
break;
case 0xB:
printf("DECFSZ %x,%c\n", operando, reg);
break;
case 0xC:
printf("RRF %x,%c\n", operando, reg);
break;
case 0xD:
printf("RLF %x,%c\n", operando, reg);
break;
case 0xE:
printf("SWAPF %x,%c\n", operando, reg);
break;
case 0xF:
printf("INCFSZ %x,%c\n", operando, reg);
break;
}
break;
case 0b01:
// en este caso, los bits 12 y 11 es la suboperación, los bits 8, 9 y 10 es el número de bit, y el resto, el operando
subop = (0b00_1100_0000_0000 & opcode) >> 10;
bit = (0b00_0011_1000_0000 & opcode) >> 7;
operando = (0b00_0000_0111_1111 & opcode);
switch (subop) {
case 0x0;
printf("BCF %x,%d\n", operando, bit);
break;
case 0x1;
printf("BSF %x,%d\n", operando, bit);
break;
case 0x2;
printf("BTFSC %x,%d\n", operando, bit);
break;
case 0x3;
printf("BTFSS %x,%d\n", operando, bit);
break;
}
break;
case 0b10:
// ver el bit 12. El resto es el operando
bit12 = (0b00_1000_0000_0000 & opcode) >> 11;
operando = (0b00_0111_1111_1111 & opcode);
switch (bit12) {
case 0:
printf("CALL %x\n", operando);
break;
case 1:
printf("GOTO %x\n", operando);
break;
}
break;
case 0b11:
// el tercer nibble es la suboperación, y el resto, el operando
nibble3 = (0b00_1111_0000_0000 & opcode) >> 8;
operando = (0b00_0000_1111_1111 & opcode);
switch (nibble3) {
case 0b0000:
case 0b0001:
case 0b0010:
case 0b0011:
printf("MOVLW %x\n", operando);
break;
case 0b0100:
case 0b0101:
case 0b0110:
case 0b0111:
printf("RETLW %x\n", operando);
break;
case 0b1000:
printf("IORLW %x\n", operando);
break;
case 0b1001:
printf("ANDLW %x\n", operando);
break;
case 0b1010:
printf("XORLW %x\n", operando);
break;
case 0b1100:
case 0b1101:
printf("SUBLW %x\n", operando);
break;
case 0b1110:
case 0b1111:
printf("ADDLW %x\n", operando);
break;
}
break;
}