Crea sito

EMOS Project, first look

Emulated MOS processor 6502, questo è il nome di questo sub-progetto.

Emos è una costola freeware del progetto Aleph (che rimane sotto la massima copertura almeno per ora che scrivo). – Lo scopo è quello di realizzare una CPU MOS 6502 emulata. — Le elevate prestazioni e/o la competitività non sono qualità necessarie al momento, quello che conta sono le “PROVE SPERIMENTALI” eseguite sul campo.

Si è scelto nella prima fase come CORE emulatore, il microcontrollore PIC 16F84A, così come configurato nel circuito pubblicato nell’articolo:

Costruisci oggi stesso il tuo clone del MOS 6502 con un PIC 16f84A di Microchip (Italiano)

Build your own MOS 6502 clone today with a PIC 16f84A from Microchip(English)

Questo primo approccio verificherà in maniera sperimentale, i limiti del modello, appena questi saranno chiariti in maniera esplicita, e qualora si rivelassero incompatibili per la prosecuzione del progetto, in tal caso si potrà optare per un dispositivo a prestazioni più elevate, in modo tale da trovare “il minimo comune multiplo” ovvero quel dispositivo minimo, tale che abbia la capacità di emulare la CPU 6502, con il minimo spreco di risorse hardware (ovvero di giunzioni PN).

Chi può partecipare

Ogni soggetto dotato di buona volontà e qualche conoscenza di programmazione può partecipare.

Primi test su bread-board e misure all’oscilloscopio

Bread-board con PIC 16F84A clock da [18Mhz e 8696Khz] con selettore per s0,s1 [74HC139]

Si è provato il circuito su basetta bread-board, per verificare prima della realizzazione del PCB, le condizioni minime di trasferimento dei segnali elettrici fondamentali.

I segnali di riferimento sono:
PIC 16F84A S0; S1.
74HC139 Y2:_MEMWR

STRUMENTI:
Oscilloscopio RIGOL da 70Mhz
Alimentatore da 5Vcc

Segnali misurati: s0,s1,_memwr (data-bus)

Firmware Software usato per il test

; MAIN-LOOP ABSTRACT

org 0x00 goto 0x80 org 0x80
;--------------------------------------------------------------------------
; init()
;--------------------------------------------------------------------------
INIT: ; |
movlw B'00000000' ; |
TRIS PORT_A ; SET AS OUTPUT 5 BIT * 1TK
TRIS PORT_B ; SET AS OUTPUT 8 BIT * 1TK
; |
clrf DATO_VAR ; DATA-BUS = 0 * 1TK
clrf ADDR_VARLOW ; ADDR-BUSLO = 0 * 1TK
clrf ADDR_VARHI ; ADDR-BUSHI = 0 * 1TK
; |
clrf PORT_A ; CLEAR S0,S1 OF (port_A) * 1TK
clrf PORT_B ; CLEAR ALL BITs (port_B) * 1TK
; |
call ADDR_WRHIGH ; OUT 0 ON ADDRESS HIGH-PART *
call ADDR_WROUT ; OUT 0 ON ADDRESS LOW-PART *
call DATA_WROUT ; OUT 0 ON DATA-BUS *
; |
;--------------------------------------------------------------------------
MAINLOOP: ; |
call INCADDRESS ; *
call DATA_WROUT ; OUT 0 ON DATA-BUS *
incf DATO_VAR ; INC VAR.ADDR_VARHI * 1TK
goto MAINLOOP ; *
; |
;--------------------------------------------------------------------------
; INCADDRESS()
;--------------------------------------------------------------------------
INCADDRESS: ; |
incfsz ADDR_VARLOW ; INC VAR.ADDR_VARLOW |
goto LOW_ONLY ; IF VAR.ADDR_VARLOW = 0 LOW_ONLY |
goto ALLADDR_INC ; IF VAR.ADDR_VARLOW <> 0 LOW_ONLY |
; |
CONT_LAB01: ; |
retlw 0 ; return REG.W = 0 * 1TK |
; |
;--------------------------------------------------------------------------
; LOW_ONLY LABEL
;--------------------------------------------------------------------------
LOW_ONLY: ; |
call ADDR_WROUT ; *
goto CONT_LAB01 ; *
; |
;--------------------------------------------------------------------------
; ALLADDR_INC LABEL
;--------------------------------------------------------------------------
ALLADDR_INC: ; |
incf ADDR_VARHI ; INC VAR.ADDR_VARHI *
call ADDR_WRHIGH ; *
clrf ADDR_VARLOW ; ADDR-BUSLO = 0 * 1TK
call ADDR_WROUT ; *
goto CONT_LAB01 ; *
; |

SCARICA il FIRMWARE
TEST-FIRMWARE