Visualizza post

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

Pagine: 1 2 [3]
31
Altri & "Nerd OS" / KolibriOS - Riscoprite la velocità!
« 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! :D

32
Suggerimenti e proposte. / Titolo Pagine Forum
« 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
Linguaggi di programmazione e scripting / Valutare espressioni
« 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 :D

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++:
Codice: [Seleziona]
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)
Codice: [Seleziona]
#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
Tablet, PDA, smartPhone / LG Optimus Dual?
« 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
Presentati / Ci sono anche io!
« 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:

Pagine: 1 2 [3]