Newsgroup: it.hobby.elettronica.digitale
Titolo: reverse engineering microchip

mi sono messo in capoccia di fare il reverse engineering di un 16f87x, 
al che mi trovo bloccato sulla decodifica delle istruzioni.
Avevo pensato di usare un decoder a 5 o a 6 bit per riconoscere 
l'istruzione ed attivare l'apposito circuito che la esegue.
Il set istruzioni è di 35 istruzioni e questo richiederebbe 6 bit di 
opcode, perché con 5 al massimo se ne identificano 32.
Andando però a vedere gli opcode del PIC non riesco a identificare una 
struttura di tipo gerarchico.
Queste sono ad esempio alcune istruzioni con il loro opcode di 14 bit.
 
00 0000 1fff ffff MOVWF
00 0000 0xx0 0000 NOP
00 0000 0110 0100 CLRWDT
00 0000 0000 1001 RETFIE
00 0000 0000 1000 RETURN
00 0000 0110 0011 SLEEP
 
Cioè, dovrei usare un decoder a 14 bit per riconoscere l'istruzione.
Mi sembra un immenso spreco, non avrebbe avuto più senso ridurre il set 
di  istruzioni a 32 e usare i primi 5 bit per decodificare l'istruzione?
Oppure usarne 6 ed estendere il set di istruzioni.
Insomma... perché questa scelta progettuale da parte della microchip?
Oppure usano un sistema di decodifica che mi sfugge?
 
..

 Oppure usano un sistema di decodifica che mi sfugge?
 
Nei 14 bit (instruction word) non c'e` solo l'opcode ma anche 
l'eventuale operando (indirizzo di memoria, valore immediato ecc).
 
Usando 14 bit viene letto tutto in un colpo solo.
 

 Oppure usano un sistema di decodifica che mi sfugge?
 
L'architettura dei PIC è di tipo Harvard e negli OpCode sono contenuti all'occorrenza anche i dati immediati.
Le "dissimetrie" nelle posizioni dei codici/dati immediati possono essere dettate dalla comodità progettuale.
Ad esempio, nel caso di un dato immediato da caricare in un registro bastano 8 bit ma per un salto relativo tale dato corrisponde ad un offset di lunghezza anche maggiore, magari 12 bit in complemento a due.
Ne consegue che rimarrebbero solo 2 bit per il codice di istruzione, cosa che non può essere realistica.
Si può supporre, in un ipotetico processore:
 
bit(13,12)=00 -> bit(11..4)=dato immediato
bit(13,12)=01 -> bit(11..0)=offset indirizzo
bit(13,12)=10 -> bit(11..0)=indirizzo assoluto
bit(13,12)=11 -> bit(11..7)=OpCode, bit(6,5) pre/post incremento
 
ecc.
 
In pratica trovi delle sovrapposizioni di funzione a seconda di pochi bit.
Comunque complimentoni, deve esserci un virus in giro perché anch'io mi sto muovendo i primi passi in VHDL.
 
Piccio.
 
 
 
 
 

 bit(13,12)=11 -> bit(11..7)=OpCode, bit(6,5) pre/post incremento
 
magari seguisse questa logica, metterei una cascata di decoder e sarei a 
posto
 
00 0000 1fff ffff MOVWF
00 0000 0xx0 0000 NOP
00 0000 0110 0100 CLRWDT
00 0000 0000 1001 RETFIE
00 0000 0000 1000 RETURN
00 0000 0110 0011 SLEEP
 
E invece per distinguere il REFIE dal RETURN devo leggere tutti e 14 bit.
L'unico che mi consente di fermarmi al sesto bit è MOWF.
Temo che dovrò inventarmi una qualche specie di decodifica ad albero, un 
albero molto sbilanciato.
 
..
 

 albero molto sbilanciato.
 
Puoi anche usare una EPROM (o FLASH o altro supporto di memoria random) per mappare la decodifica.
Puoi usare gli address come input per il codice di istruzione e se te ne rimane qualcuno libero puoi anche sequenziare certi cicli.
Con una classica 64k (27512 o altro più recente, magari FLASH per fare prove in tempo reale) utilizzerei gli address 0..13 per l'OpCode e i restanti 2 bit (A15, A14) collegati ad un contatore in modo da ottenere per ogni codice quattro successivi cicli.
Sul bus dati avrai 8 bit in grado di pilotare decodifiche per i registri, ALU ecc in una sequenza di 4 successioni.
Se 8 bit non bastano, puoi utilizzare 2 EPROM con gli address in parallelo.
Inutile notare che il tempo di accesso delle EPROM rende il circuito relativamente lento ma una volta constatato il buon funzionamento puoi passare ad un'implementazione combinatoria.
 
Piccio.

 Puoi anche usare una EPROM (o FLASH o altro supporto di memoria random) per mappare la decodifica.
 
No, troppo faticoso riempire una tabella con migliaia di dati.
Preferisco un circuito combinatorio, ho già scremato la tabella e mi 
basta un circuito con 9 ingressi e 35 uscite.
Adesso minimizzo la funzione logica, anche a discapito dell'alea, tanto 
la velocità non mi serve, e con qualche decina di porte faccio la 
decodifica.
 
..
 

 decodifica.
 
Fai tutto in CMOS standard?
Esistono delle ALU interessanti già pronte.
 
Piccio.


mi interessa realizzare solo il modello per ora.
 
..

I primi passi
 
Ci sta il program counter, la ram di programma, il decodificatore delle 
istruzioni e i registri per le costanti, gli indirizzi e i bit.
E per il fetch ci siamo... ora occorre implementare l'execute.
 
Uno dei due link dovrebbe funzionare.
 
http://oi66.tinypic.com/rjqluv.jpg
 
http://it.tinypic.com/view.php?pic=rjqluv&s=9#.VrzEIPLhB0Q
 
 
..