n° 219
Novembre 2017
Dicembre 14, 2017, 12:50:02 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: 1 2 3 [4]   Vai giù
  Stampa  
Autore Discussione: Z80: Problema puntatori ?  (Letto 20617 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +224/-19
Scollegato Scollegato

Messaggi: 2988


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #45 inserita:: Ottobre 11, 2015, 08:43:08 »

sono per caso questi ? nomi delle routines e indirizzi, ad esempio CF_INIT all'indirizzo 8010 ?

Sembrerebbe di sì, a quanto pare la mappa globale dei simboli riporta gli indirizzi di codice e dati.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
GizMo
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 40


Mostra profilo E-mail
« Risposta #46 inserita:: Ottobre 11, 2015, 09:16:21 »

quindi per chiamare una routines compilata del bios o nel kernel del SO posso semplicemente inserire ne; codice C un'istruzione assembler

Codice:
call $8010

Quindi sostituisco la libreria con le funzioni di accesso a basso livello con una libreria bios.h con delle funzioni formate solo dal call verso l'indirizzo del bios.

Ma le funzioni a cui posso passare dei parametri come le utilizzo ?
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +224/-19
Scollegato Scollegato

Messaggi: 2988


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #47 inserita:: Ottobre 11, 2015, 09:56:40 »

Ma le funzioni a cui posso passare dei parametri come le utilizzo ?

Tutto dipende dalla calling convention usata da codesto cross-compiler. Non esiste alcunché di minimamente somigliante ad uno "standard" quando si parla di piattaforme embedded a 8/16 bit, ogni cross-compiler fa storia a sè. Quindi devi leggere il listato assembly generato e cercare di capire come vengono passati i parametri, i.e. usando registri o un'area di RAM o qualche altro metodo.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
GizMo
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 40


Mostra profilo E-mail
« Risposta #48 inserita:: Ottobre 12, 2015, 11:25:58 »

scusa la domanda stupida, ma quando gli faccio fare il salto indietro alla posizione dell subroutine, quando ha finito di eseguirla torna indietro da solo al programma che l'ha lanciata?
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +224/-19
Scollegato Scollegato

Messaggi: 2988


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #49 inserita:: Ottobre 12, 2015, 12:43:34 »

Lo schema concettuale è molto semplice.

Codice:
0123    CALL $FF10
...
8269    BLA BLA BLA
...
827A    RET      ; Ritorna alla CALL piu' recente -> 0123
...
FF10    JMP $8269
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
GizMo
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 40


Mostra profilo E-mail
« Risposta #50 inserita:: Ottobre 14, 2015, 12:00:39 »

ret in assembler immagino sia l'istruzione di return, e immagino che il compilatore C per foza di cose la metta, quindi a mio avviso dovrebbe funzionare.

PS: lo stampatore di PCB dice che secondo lui il mio stampato viene senza problemi, se andava il vecchio bruttissimo e fatto fa cani deve andare anche questo ma senza falsi contatti che saltano fuori ogni volta che tiri un chip, adesso sono in attesa che mi arrivino i 5 pezzi dell'ordine minimo poi ricomincio a divertirmi.

Domanda sul C: sulla eprom mi rimane spazio se inserire le routines di trasferimento seriale di dati verso la CF, volevo implementare l'upload del kernel del SO sulla CF in caso questo manchi, per non aver bisogno di usare l'adattatore USB sul PC per caricarlo la prima volta o in caso di corruzzione, come faccio a implementare un delay dentro il quale se viene premuto un tasto avvia l'upload se non viene premuto niente prosegue con il boot normale ?

il comando getchar ad esempio implica l'interruzione del flusso del programma finche' non viene premuto un tasto, esiste un modo per dargli un timeout oltre il quale prosegue anche se non viene premuto niente ?
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +224/-19
Scollegato Scollegato

Messaggi: 2988


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #51 inserita:: Ottobre 14, 2015, 05:24:40 »

Hai ovviamente bisogno di implementare un ritardo software per tempi lunghi, dell'ordine di 1-5 sec.

L'argomento è assolutamente una FAQ da circa trent'anni... Ghigno
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
GizMo
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 40


Mostra profilo E-mail
« Risposta #52 inserita:: Ottobre 14, 2015, 06:15:14 »

ma a parte il delay che lo avrei anche gia' implementato con un semplice ciclo for che non fa niente al suo interno, il punto della domanda era come intercettare l'arrivo o no di un carattere senza bloccare il flusso del programma finche' qualcosa non viene premuto.

Tornando al delay sulla scheda ho il CTC di cui solo un timer su 4 e' usato per generare il clock della seriale, se non ho capito male potrei usare un timer del CTC per fare dei delay piu' precisi.
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +224/-19
Scollegato Scollegato

Messaggi: 2988


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #53 inserita:: Ottobre 14, 2015, 10:02:07 »

Ovviamente l'uso di un timer hardware è sempre preferibile. Il loop deve semplicemente controllare in polling se c'è un carattere nel buffer di tastiera (o seriale), in tal caso si interromperà il conteggio e si intraprenderanno le azioni necessarie.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
GizMo
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 40


Mostra profilo E-mail
« Risposta #54 inserita:: Ottobre 18, 2015, 03:16:10 »

Ovviamente l'uso di un timer hardware è sempre preferibile. Il loop deve semplicemente controllare in polling se c'è un carattere nel buffer di tastiera (o seriale), in tal caso si interromperà il conteggio e si intraprenderanno le azioni necessarie.

In questo modo pero' finche' non arriva un input dalla seriale resta li in attesa.
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +224/-19
Scollegato Scollegato

Messaggi: 2988


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #55 inserita:: Ottobre 18, 2015, 03:54:16 »

In questo modo pero' finche' non arriva un input dalla seriale resta li in attesa.

No. Il loop procede comunque nel conteggio, e si limita a verificare se nel frattempo è stato ricevuto un carattere nel buffer seriale. Qualsiasi UART dà la possibilità di farlo in modo non bloccante, in genere controllando un flag.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
GizMo
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 40


Mostra profilo E-mail
« Risposta #56 inserita:: Novembre 16, 2015, 02:44:04 »

Sono riuscito a compilare applicazioni come file, ho avuto parecchi problemi, poi ho capito cosa succedeva, nella lettura dei settori avvengono spesso errori di lettura.

Premetto che la CF l'ho testata sul PC con software apposito ed e' esente da difetti, sono assolutamente certo che le operazioni di scrittura sono perfette.

Ho modificato la routines di lettura del settore cosi':

Codice:
/* carica un settore di 512byte nel buffer */  
int load_seek(unsigned long lba_addr)
{
do {
errore = 0;
clear_buff();
LBA(lba_addr);
cf_read_cmd();
for(cf_io_contatore = 0; cf_io_contatore < 512; cf_io_contatore++) /* carica il settore in ram */
{
ram_buff[cf_io_contatore] = inp(cfreg0);
loop_busy();
}
/* verifica */
LBA(lba_addr);
cf_read_cmd();
for(cf_io_contatore = 0; cf_io_contatore < 512; cf_io_contatore++) /* carica il settore in ram */
{
if (ram_buff[cf_io_contatore] != inp(cfreg0)) { errore = 1; }
loop_busy();
}
} while ( errore == 1);
}

Ora funziona senza errori anche se e' diventato piuttosto lento, spesso legge un settore diverse volte prima di riuscire e non capisco da cosa sia causato il problema, forse la CF e' troppo veloce ? ma la cosa piu' strana in assoluto e' che ke stesse operazioni di lettura del settore e caricamento in ram effettuate dal bios in fase di boot vanno regolamente spedite senza controllo di errore senza fallire nemmeno una volta.

Altra cosa strana la lettura di file di testo semplice, apparentemente non causa errori di lettura.
Registrato
flameman
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 76


Mostra profilo E-mail
« Risposta #57 inserita:: Febbraio 23, 2016, 10:29:32 »

bel progetto, anche per per giocare con Z80 preferisco il Nintendo GameBoy1, di cui ho modificato una cartuccia. E' circa compatibile con Z80, ed SDCC (patchato) lo supporta.

Il vantaggio e' il sottosistema grafico e sonoro, su hw a basso costo e di ottima qualita'.
Registrato
Pagine: 1 2 3 [4]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines