Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.
Topics - Z80Fan
31
« il: 28 Giugno 2011, 00:05:23 »
http://http://www.kolibrios.org/KolibriOS è un sistema operativo scritto completamente in assembly x86, derivato da un fork di ManuetOS. Uno degli scopi è quello di fornire un'ambiente di programmazione amichevole verso lo sviluppatore, che si ritrova API veramente semplici da usare in assembly e che spaziano in vari ambiti, ad esempio quello della GUI. Essendo scritto completamente in assembly, è molto leggero e incredibilmente veloce, sopratutto l'interfaccia grafica e i demo 3D che (a causa di mancanza di driver), sono calcolati dalla CPU stessa. Fateci un giro e scoprirete cos'è un sistema veloce!
32
« il: 24 Giugno 2011, 17:18:40 »
Spesso (anzi, praticamente sempre) mi ritrovo con Firefox aperto su decine di schede contemporaneamente. In questa situazione, lo spazio per il titolo su ogni scheda è molto limitato, e le schede di NonSoloAmiga si riducono a un "NSA - N...", costringendomi ad aprirle in sequenza per trovare la pagina che voglio, o ad usare la lista delle schede.
Chiedo: è possibile invertire l'ordine del titolo, passando da: NSA - NonSoloAmiga - • Leggi argomento - <argomento> a: <argomento> - NSA - NonSoloAmiga[/code] ?
33
« il: 14 Giugno 2011, 17:46:25 »
Per il mio computer Z80 stavo cominciando a scrivere un interprete BASIC; sono sulla buona strada, ma ho capito che non potevo andare molto avanti senza avere un valutatore di espressioni, mi spiego meglio: io gli do 2+2 e lui mi ritorna 4 Son venuto fuori con questo algoritmo, che fa uso di due stack (uno per i valori e uno per gli operatori), e ho pure una versione funzionante in C++: 1 pusha 0 in stackNum 10 legge numero n 11 se non è stato letto un numero ma un operatore (incluse le parentesi), assegna x=n e vai a 40 15 push n su stack num 20 legge operatore x (se è finita la stringa, goto 60) 30 se la precedenza di x è minore o uguale a quella dell'operatore precedente (top dello stack) (nessun operatore precedente = precedenza minima) allora esegui operazioni precedenti finchè la priorità dell'operatore sullo stack è maggiore di x o finchè non si incontra una parentesi aperta, in tal caso la si toglie 40 push x su stack op (tranne nel caso in cui fosse stata una parentesi chiusa) 50 se non è finita la stringa, goto 10 60 esegui le operazioni mancanti nello stack op 70 il top dello stack num è il risultato
parentesi = precedenza minima (NOTA: il codice C++ lo ho scritto con l'idea di doverlo tradurre in Assembly successivamente) #include <iostream> #include <cstring> #include <cstdlib> using namespace std;
#define PushNum(x) stackNum[++spNum]=(x) #define PopNum (stackNum[spNum--]) #define PushOp(x) stackOp[++spOp]=(x) #define PopOp (stackOp[spOp--]) #define TopOp (stackOp[spOp]) #define PrintStack(stack, sp) cout << #stack << ": "; for(int c=1; c<=sp; c++) cout << stack[c] << " "; cout << endl
// 2 + 3*5 - 1*4 +5 -7. = 11
int stackNum[100] = {0}, spNum = 0, spOp = 0; char stackOp[100] = {0};
char input[50]; int ptrIn=0; // puntatore input
int getOpPriority(char op) { switch(op) { case '(': case ')': return 10; case '+': case '-': return 20; case '*': case '/': return 30; default: return 0; } }
// esegue l'operazione più in alto nello stack op con i 2 numeri più in alto nello stack Op void doOp() { cout << " - doOp" << endl; int a, b, r; char o = PopOp; a = PopNum; b = PopNum; switch(o) { case '+': r = b+a; break; case '-': r = b-a; break; case '*': r = b*a; break; case '/': if(a==0) { cout << "Divisione per zero" << endl; exit(0); } r = b/a; break; case '.': cout << "tentata elaborazione di "."" << endl; exit(0); break; } cout << " a=" << a << ", b=" << b << ", r=" << r << ", op=" << o << endl; PushNum(r); }
// true se op è un operatore valido bool isOp(char op) { switch(op) { case '(': case ')': case '+': case '-': case '*': case '/': case '.': // operatore fittizio con priorità minima return true; default: return false; } }
// true se x è una cifra numerica bool isNum(char x) { if(x>='0' && x<='9') return true; else return false; }
void skipSpaces() { while(ptrIn<50 && input[ptrIn] == ' ') ++ptrIn; }
int main() { int n; char x = 0, opPrec; // opPrec = operatore precedente int numPar=0; // numero parentesi (incrementato quando aperta, decrementato quando chiusa)
cout << "Inserisci espressione:" << endl;
cin.getline(input, 50);
PushOp('.'); //PushNum(0);
do { cout << "nCiclo" << endl;
skipSpaces();
opPrec = x;
//x = cin.peek(); x = input[ptrIn];
if(ptrIn>=50 || x==' ') // fine stringa goto fuori;
if( isNum(x) ) { //cin >> n; char *invPtr; n = strtol(&input[ptrIn], &invPtr, 10); ptrIn = invPtr-input; PushNum(n); cout << "Letto Num: " << n << endl; } else { ++ptrIn; if(x=='+' || x=='-') // se al posto di un numero ci sono + o - { cout << "Letto Op "" << x << "" invece di num" << endl; // se dopo non c'è un numero o una parentesi aperta, allora sono simboli errati
skipSpaces(); char y = input[ptrIn]; cout << " y = ""<<y<<""" << endl;
if( !isNum(y) && (y!='(') ) { cout << " ma dopo non c'è un numero o una parentesi aperta! Errore!" << endl; cout << "nErrore: trovato simbolo quando ci si aspettava numero" << endl; goto uscitaErrore; } // se dopo c'è un numero o una parentesi aperta, allora sono simboli di segno. PushNum(0); // inserisco uno 0 così l'operatore ha un secondo numero su cui lavorare // ( 0-x = -x; 0+x = +x; ) input[--ptrIn] = x; // ritorno a mettere x al suo posto (circa) } else if( x == ')' ) { // se trovo una parentesi chiusa, la tolgo dallo stream e vado a elaborare lo stack goto elabora; } else if( (opPrec==')' && isOp(x)) || x=='(' ) // se al posto di un numero c'è un operatore, e prima avevamo una parentesi chiusa, oppure al posto del numero c'è una parentesi aperta { cout << "Letto Op "" << x << "" invece di num" << endl; goto L45; } else { cout << "Carattere non valido ""<< x <<"" al posto di un numero" << endl; goto uscitaErrore; } }
//cin >> x; skipSpaces(); x = input[ptrIn++];
if( x!=' ' && !isOp(x) ) { cout << """ << x << "" non è un operatore" << endl; goto uscitaErrore; }
cout << "Letto Op: " << x << endl; //cout << " (Peek: "" << (char)cin.peek() << "")" << endl;
if(x==' ') { cout << " - vado fuori" << endl; goto fuori; }
PrintStack(stackNum, spNum); PrintStack(stackOp, spOp);
cout << "Testo " << x << "(" << getOpPriority(x) << ") e " << TopOp << "(" << getOpPriority(TopOp) << ")" << endl;
elabora:
while( (TopOp != '(') && (getOpPriority(x) <= getOpPriority(TopOp)) ) doOp();
if((x==')') && (TopOp == '(')) PopOp;
L45: if(x != ')') PushOp(x);
} while(x!=' ');
PopOp;
fuori:
cout << "son fuori" << endl;
PrintStack(stackNum, spNum); PrintStack(stackOp, spOp);
while(TopOp != '.'/*spOp > 1*/) doOp();
cout << "Ris: " << PopNum << endl; uscitaErrore: return 0; } In futuro gli darò una pulitina, magari diventa utile per qualcuno Qualche commento?
34
« il: 13 Giugno 2011, 21:46:26 »
Avevo intenzione di comprarmi uno smartphone, più che altro per mettermi a trafficare con le applicazioni Java :mrgreen:
Ho messo gli occhi sull' LG Optimus Dual (2X), lo ho provato dal vivo e sembra un buon prodotto.
Monta ancora Froyo, ma dovrebbe venir fuori l'aggiornamento ufficiale a Gingerbread in estate, e in caso c'è sempre CyanogenMod...
Cosa ne pensate voi?
35
« il: 12 Giugno 2011, 17:04:33 »
Salve ragazzi! Per chi non mi conoscesse, sono un ragazzo di 19 anni che sta per diventare perito informatico :mrgreen: I miei interessi sono l'informatica in generale, l'elettronica, retrocomputing, ma anche moto e motori. Più dettagliatamente, mi interesso di più dell'informatica di basso livello: sistemi operativi, architetture ecc..., infatti farò ingegneria informatica all'università. Son contento di aver l'occasione di partecipare alla crescita di un forum, spero diventi un forum di successo Non è che forse avete esagerato un pochino con le categorie? :lol:
|