Autore Topic: Assembler Questo Sconosciuto  (Letto 10897 volte)

Massi cadenti

  • Utente
  • **
  • Post: 237
    • http://massicadenti.altervista.org
  • Gioco Preferito: The Last Ninja
Assembler Questo Sconosciuto
« Risposta #15 il: 15 Ottobre 2005, 02:18:52 »
 
Citazione da: "Alberto"
Allora,andiamo con ordine.

1.Innanzitutto,la routine $ffd2 prende i caratteri ASCII di una stringa,mentre tu le hai passato delle locazioni di memoria (che forse volevano essere i codici schermo dei caratteri).
Sì nella fretta mi basavo sulla memoria video e non i codici ASCII.

Citazione
Se non erro,i codici ASCII dei caratteri A-Z vanno da 65 a 90 ($41-$5A in esadecimale).
Sì, o almeno 65 è A, di questo sono sicuro.
E i codici ASCII come glieli passo? Devo "pokargli" (tradotto: LDA... STA)i caratteri della stringa in delle locazioni e poi dargli i puntatori? O devo fare come prima passandoglieli nell'accumulatore? O devo usare un altro comando simile a LDA che a quanto sto capendo può essere usato solo per le locazioni di memoria (ma non era STA ad essere usato per quello e LDA per contenere il *valore*)?

Citazione
2.Ti conviene creare un ciclo per non scrivere la stessa istruzione 5 volte.
Devo ripassare le istruzioni per i cicli in Assembly. Finché è in BASIC è intuitivo con un bel FOR...NEXT, qui mi perdo ;)

Citazione
Ovviamente,ti servirà un "cursore" (ossia,un indice) per poterti spostare lungo la stringa,in modo da stamparne un carattere alla volta.
No, qui proprio mi perdo del tutto e non ti seguo più. Se non va bene passargli un carattere alla volta io ho capito che devo dargli tutta la stringa insieme, ma se gli passo la stringa insieme perché dovrei far spostare il cursore? Perché, forse vorrebbe stampare la stringa senza muovere il cursore col risultato di una bella "O" (ultima lettera della stringa).
Senza contare che ancora non ho capito DOVE questa stringa andrebbe stampata, io avevo capito nel posto dove si trova il cursore e cioè (dato che abbiamo dato una SYS da BASIC) immediatamente sotto la SYS.

Citazione
P.S.:per ora lascia perdere il GOTO 10;un concetto alla volta. ;)
Quello è semplice (un JMP all'inizio della routine e tanti saluti, anche se non la rende più rilocabile ma pazienza), il problema semmai è come uscire dal ciclo SENZA andare a scomodare il vettore NMI usando RUN/STOP + RESTORE. Quello sì che è complicato (no, reset o power off non vanno bene :P).
Lo so, per tanti è difficile da capire anche se ormai sono 12 anni che lo uso, ma <b>il mio nick ha la "c" <u>minuscola</u></b>...
"Prima volta" nel settembre 1982 (Vic20 di mio cugino)
Utente C16 dal 25 dicembre 1984. Utente C128 dal 24 dicembre 1987
C16(4), C128, Vic20, 1541, 1541-II, 1530(3), 1531(2), X1541, MPS802, CaptainMikyII, Moviola x C64, esp.16KB x C16, ca.1300 cassette, ca.900 floppy, ca.10 joystick, paddles, accessori vari
<a href="http://massicadenti.altervista.org/algasoft.html">La mia pagina sulle Alga Soft, sulle cassette napoletane e su come Napoli ha vissuto a modo tutto suo gli anni d'oro della pirateria</a>
<a href="http://ready64.it/forum/?showtopic=2252#">Massi cadenti non è né un esperto (anche se si millanta tale) né un frequentatore di questo forum</a>
Importante: <a href="http://ready64.massicadenti.com">Ready64 è un sito che <B><U>non</U> è di Massi cadenti</B> ma di Rob Nicoletti</a>

6526_CIA

  • Neo-iscritto
  • *
  • Post: 25
  • Gioco Preferito: KATAKIS;ENFORCER
Assembler Questo Sconosciuto
« Risposta #16 il: 15 Ottobre 2005, 18:58:22 »
 Ho scaricato il corso di assembler dal sito  degli HF
Devo dire che è fatto veramente bene....ma ho un problema.

In primis da dire che non faccio girare l'esempio su un c64 reale ma su ccs64
secondo uso un software cross development chiamato 6502sdk.
Il fatto che non funzioni niente è dovuto all'emulatore o al 6502sdk?
E' frustrante avere come risposta sempre e comunque READY. e non succede niente..... :angry:
 :hail: Aiutatemi......gia non ci capisco niente se poi anche i programmi che uso mi complicano la vita... :doh: confiso in voi per essere consigliato al meglio
Grazie  

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Assembler Questo Sconosciuto
« Risposta #17 il: 15 Ottobre 2005, 19:57:23 »
Citazione da: "6526_CIA"
Il fatto che non funzioni niente è dovuto all'emulatore o al 6502sdk?
 
Potrebbe essere anche nel tuo codice, non pensi?
Posta e vediamo che c'e' che non va.
non ho mai visto questo 6502sdk, ora lo provo
 
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Massi cadenti

  • Utente
  • **
  • Post: 237
    • http://massicadenti.altervista.org
  • Gioco Preferito: The Last Ninja
Assembler Questo Sconosciuto
« Risposta #18 il: 15 Ottobre 2005, 20:03:02 »
Citazione da: "6526_CIA"
In primis da dire che non faccio girare l'esempio su un c64 reale ma su ccs64
secondo uso un software cross development chiamato 6502sdk.
 
Ti consiglio il monitor del VICE, è molto più immediato e ricorda quello del C16/+4/C128.
Lo so, per tanti è difficile da capire anche se ormai sono 12 anni che lo uso, ma <b>il mio nick ha la "c" <u>minuscola</u></b>...
"Prima volta" nel settembre 1982 (Vic20 di mio cugino)
Utente C16 dal 25 dicembre 1984. Utente C128 dal 24 dicembre 1987
C16(4), C128, Vic20, 1541, 1541-II, 1530(3), 1531(2), X1541, MPS802, CaptainMikyII, Moviola x C64, esp.16KB x C16, ca.1300 cassette, ca.900 floppy, ca.10 joystick, paddles, accessori vari
<a href="http://massicadenti.altervista.org/algasoft.html">La mia pagina sulle Alga Soft, sulle cassette napoletane e su come Napoli ha vissuto a modo tutto suo gli anni d'oro della pirateria</a>
<a href="http://ready64.it/forum/?showtopic=2252#">Massi cadenti non è né un esperto (anche se si millanta tale) né un frequentatore di questo forum</a>
Importante: <a href="http://ready64.massicadenti.com">Ready64 è un sito che <B><U>non</U> è di Massi cadenti</B> ma di Rob Nicoletti</a>

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Assembler Questo Sconosciuto
« Risposta #19 il: 16 Ottobre 2005, 05:46:57 »
Citazione da: "Massi cadenti"
Ti consiglio il monitor del VICE
Il monitor di vice va bene per debuggare, ma per scrivere programmi via monitor (che gia' e' un assurdita' di questi tempi) e' la cosa piu' orribile da usare. Molto meglio quello di CCS o un qualsiasi altro monitor (smon o quello delle varie cartucce)
Ad ogni modo scrivere da monitor andava bene quando non c'era altro, mi permetto di dirlo perche' l'ho fatto per TROPPO tempo; per fare le cose come si deve meglio un assembler.
Turbo assembler, Zeus, merlin, etc se si vuole fare da c64. C64asm, DASM, ca65, anche quel 6502sdk (anche se non mi sembra molto orientato al c64) etc se si vuole usare un crossassembler. Io consiglio caldamente DASM.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Assembler Questo Sconosciuto
« Risposta #20 il: 16 Ottobre 2005, 10:19:16 »
 
Citazione
(un JMP all'inizio della routine e tanti saluti, anche se non la rende più rilocabile ma pazienza), il problema semmai è come uscire dal ciclo SENZA andare a scomodare il vettore NMI usando RUN/STOP + RESTORE. Quello sì che è complicato (no, reset o power off non vanno bene ).


???

Citazione
devo fare come prima passandoglieli nell'accumulatore?

Sì.

Citazione
QUOTE 
Ovviamente,ti servirà un "cursore" (ossia,un indice) per poterti spostare lungo la stringa,in modo da stamparne un carattere alla volta.

No, qui proprio mi perdo del tutto e non ti seguo più. Se non va bene passargli un carattere alla volta io ho capito che devo dargli tutta la stringa insieme, ma se gli passo la stringa insieme perché dovrei far spostare il cursore? Perché, forse vorrebbe stampare la stringa senza muovere il cursore col risultato di una bella "O" (ultima lettera della stringa).
Senza contare che ancora non ho capito DOVE questa stringa andrebbe stampata, io avevo capito nel posto dove si trova il cursore e cioè (dato che abbiamo dato una SYS da BASIC) immediatamente sotto la SYS.

Stai facendo un pò di confusione... :)
Se usi un ciclo ti serve un cursore,cioè un indice che ti permetta di stampare prima la P,poi la I,poi l'altra P etc...;ovviamente dovrai prima memorizzare la stringa da qualche parte.

Cmq,per adesso dimenticati del ciclo.
Suggerimento:il tuo listato va bene,solo che carichi nell'accumulatore i valori sbagliati.

Ciao

6526_CIA

  • Neo-iscritto
  • *
  • Post: 25
  • Gioco Preferito: KATAKIS;ENFORCER
Assembler Questo Sconosciuto
« Risposta #21 il: 16 Ottobre 2005, 14:33:51 »
 Ian....DASM dove lo trovo?
Sul tuo sito?

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Assembler Questo Sconosciuto
« Risposta #22 il: 16 Ottobre 2005, 19:41:39 »
 
Citazione
un cursore,cioè un indice
Chiamiamo le cose con il loro nome altrimenti si' che si fa confusione.
Cursore e indice sono forse sinonimi ma universalmente si usa cursore per l'aggeggio lampeggiante che indica la posizione attuale a video, e con indice si indica uno dei 2 registri atti all'indirizzamento indicizzato (appunto)

Quello che vuole fare Massicadenti si puo' riassumere BREVEMENDE
Codice: [Seleziona]
; versione con controllo di terminatore stringa (0)
    * = $1000
    ldy #$00      ; init indice Y
loop
    lda scritta,y ; carica A con il byte a scritta+Y
                  ; in A abbiamo uno 0?
    beq esci      ; se si esci

    jsr $ffd2     ; chiama la CHROUT, output di A

    iny           ; incrementa Y
    bne loop      ; limitiamo a 256 chars la stringa

esci
    rts

scritta
    BYTE "CHE SCRIVIAMO OGGI?"
    BYTE 0
O magari sapendo quanto e' lunga la stringa
Codice: [Seleziona]
; versione con conteggio caratteri
    * = $1000
    ldy #0; init indice Y
loop
    lda scritta,y ; carica A con il byte a scritta+Y

    jsr $ffd2     ; chiama la CHROUT, output di A

    iny           ; incrementa Y
    cpy #(fine-scritta)
    bne loop      ; se Y=numero di char abbiamo finito

esci
    rts

scritta
    BYTE "CHE SCRIVIAMO OGGI?"
fine
    BYTE 0
Ma se vogliamo usare la routine di stampa del BASIC si puo' far prima
Codice: [Seleziona]
; versione con routine di print
    * = $1000
    lda #<scritta ; Byte basso indirizzo di stringa
    ldy #>scritta ; Byte alto  indirizzo di stringa
    jsr $ab1e     ; routine di print, stampa la stringa
    rts

scritta
    BYTE "CHE SCRIVIAMO OGGI?"
    byte 0
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Assembler Questo Sconosciuto
« Risposta #23 il: 17 Ottobre 2005, 15:45:12 »
 
Citazione
Quello che vuole fare Massicadenti si puo' riassumere BREVEMENDE

; versione con controllo di terminatore stringa (0)
   * = $1000
   ldy #$00      ; init indice Y
loop
   lda scritta,y ; carica A con il byte a scritta+Y
                 ; in A abbiamo uno 0?
   beq esci      ; se si esci

   jsr $ffd2     ; chiama la CHROUT, output di A

   iny           ; incrementa Y
   bne loop      ; limitiamo a 256 chars la stringa

esci
   rts

scritta
   BYTE "CHE SCRIVIAMO OGGI?"
   BYTE 0

Così però non ci si può lamentare se nessuno impara niente,caro iAN CooG...

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Assembler Questo Sconosciuto
« Risposta #24 il: 17 Ottobre 2005, 18:08:11 »
Citazione da: "Alberto"
Così però non ci si può lamentare se nessuno impara niente,caro iAN CooG...
Almeno ora ha un idea di come vadano fatte le cose, studiarsi i sorgenti altrui (e disassemblati) aiuta sempre.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Assembler Questo Sconosciuto
« Risposta #25 il: 21 Ottobre 2005, 16:03:23 »
 
E' vero,ma è importante che chi vuole imparare qualcosa di assy si studi le basi (per questo richiamo più volte la guida di MarC=ello) e soprattutto impari a ragionare,specie per programmi così semplici.

Ragazzi,al solito fateci sapere il vostro pensiero altrimenti qui parliamo sempre in tre e si finisce sempre per chiedersi se uno è interessato oppure se a nessuno gliene frega niente...insomma,parlate pure liberamente,nessuno si offende qua dentro!
Ciao
 :)

 

Evincaro

  • Utente
  • **
  • Post: 437
    • http://xoomer.virgilio.it/ovgrav/
  • Gioco Preferito: Spy Vs Spy
Assembler Questo Sconosciuto
« Risposta #26 il: 21 Ottobre 2005, 17:46:23 »
 
Citazione
Ragazzi,al solito fateci sapere il vostro pensiero altrimenti qui parliamo sempre in tre e si finisce sempre per chiedersi se uno è interessato oppure se a nessuno gliene frega niente...insomma,parlate pure liberamente,nessuno si offende qua dentro!

Ciao Alberto,
io sarei anche interessato all'argomento, ma ci sono due grossi problemi all'assimilazione dell'assembrel per il C=64 per quanto mi riguarda, il primo è che ho poco tempo da dedicare allo studio e il secondo è che sono "piombo", nel senso che non ne capisco nulla di programmazione in linguaggio macchina (che andando in "goto" con il primo problema crea un loop infinito...  ;) )...
A presto amici.
 :ciauz:
 
I difetti in un ambiente possono essere i pregi in uno differente.

albman

  • Utente
  • **
  • Post: 125
  • Gioco Preferito: Wonder Boy / Bubble Bobble
Assembler Questo Sconosciuto
« Risposta #27 il: 29 Ottobre 2005, 18:36:23 »
 Vi prego non fermate questa discussione!!!!! Forse l'unico modo per chi con buone conoscenze di basic del C64 ma NESSUNA conoscenza di assembler vuole iniziare...

1° dove trovo la guida di Marcello?

2° ho deciso di iniziare usando il monitor di CCS64: siccome parto davvero  da zero, come si usa il monitor? cioè il listato in assembler, per esempio quello indicato all'inizio della discussione per "pokare" il valore decimale 15 nella locazione 49152

LDA $0F ; Carica il numero decimale 15 nell'accumulatore...
STA $C000 ; ... e piazzalo nella locazione decimale 49152
RTI ; Torna da interrupt

va' realmente digitato usando il monitor, cioè scrivendo ogni riga e premendo invio alla fine della stessa? Purtroppo le catene del Basic sono pesanti e nella mia mente c'e' ancora il concetto di  programma come insieme sequenziale  di istruzioni, con la possibilità di listarlo e memorizzarlo.... oltre che scriverlo cosa devo fare per poterlo lanciare con una bella SYS da basic? Cioè come si fa ad assemblare il listato trasformandolo in codice macchina? e soprattutto come decido a prtire da quale locazione andrà a finire in memoria?

Grazie e speriamo che nessuno si spazientisca per il livello basso delle domande....

 
"If you want to become the old figure, use the power of your friendship, and fight me"

eregil

  • Administrator
  • Utente
  • *****
  • Post: 710
  • Gioco Preferito: Impossible Mission
Assembler Questo Sconosciuto
« Risposta #28 il: 29 Ottobre 2005, 22:20:11 »
 
Citazione da: "albman"
1° dove trovo la guida di Marcello?
http://ready64.org/smf/index.php?topic=1132.0

Leggi con attenzione questo thread poi, erano stati segnalati degli errori nel disassemblato che hai ripostato. Lo correggo visto che è talmente semplice che ci riesco anch'io: :fagiano:

LDA #$0F ; Carica il numero decimale 15 nell'accumulatore...
STA $C000 ; ... e piazzalo nella locazione decimale 49152
RTS ; Esci dalla subroutine

RTI non si usa a meno che non stia programmando appunto routine di interrupt, normalmente si usa RTS. In secondo luogo per caricare il numero decimale 15 l'istruzione è LDA #$0F: senza diesis carica il contenuto della locazione 15 in pagina zero.

Per quanto riguarda la digitazione nel monitor di CSS, purtroppo non ce l'ho presente e non so dirti se tale monitor supporti l'inserimento di assembly con il comando A. Quello che ti posso dire è che sicuramente non devi digitare direttamente LDA #$0F eccetera nella riga di comando del monitor.

Alcuni monitor (non so se anche quello di CSS) ti permettono di inserire del codice assembly così:

1) digiti A xxxx istruzione assembly
dove xxxx è un indirizzo esadecimale, ad esempio

Codice: [Seleziona]
A 1000 LDA #$0F
inserisce l'istruzione all'indirizzo 4096 ($1000). A questo punto compare da solo l'indirizzo dell'istruzione successiva, 1002 (perché la prima istruzione occupa due byte, quindi la seconda sarà due byte più avanti) e tu dietro digiti STA $C000; e così vai avanti finché non hai finito e allora premi Return invece di inserire un'istruzione.

Quando hai finito usi il comando X per uscire dal monitor e a quel punto in questo caso puoi provare la SYS di partenza del semplice programmino (nell'esempio SYS 4096)...

Prova, tanto non danneggi nulla ;)
Non rispondo a richieste private, di qualunque genere esse siano.
Per domande tecniche leggete le FAQ e usate l'apposito forum.
Per questioni amministrative contattate lo staff tramite il form Contatti sul sito.

albman

  • Utente
  • **
  • Post: 125
  • Gioco Preferito: Wonder Boy / Bubble Bobble
Assembler Questo Sconosciuto
« Risposta #29 il: 30 Ottobre 2005, 14:46:44 »
 Grandioso! Funziona! si, il monitor del CCS 64 usa A per caricare le istruzioni , esattamente come dicevi... e io ho potuto scrivere le mie  PRIME righe di assembler funzionanti, osservate che meraviglia :-)

LDA #$00
STA D020
LDA #$01
STA D020

ho messo tutto a partireda $1000 ho concluso con

JMP $1000

Spettacolo !!!!! Grazie!!


E adesso le domande

1) l'accumulatore che carica i valori con LDA è unico? cioè mi devo dimenticare il concetto delle variabili, caselle potenzialmente infinite dove stoccare i miei dati numerici e alfanumerici a piacimento? se ho bisogno di mettere da parte un valore che faccio? lo scarico (STA) in una locazione di memoria e poi melo vado a riprendere quando mi serve?

2) come salvo il mio listato? e il programma assemblato? cioè io lo digito nel monitor, poi esco digitando X, e lancio il mio programma, ma se prima di lanciarlo voglio salvarlo su floppy, per poi caricarlo con il classico load "xyz",8,1  come faccio?


e ora mi metto a studiare seriamente ! ciao:-)
 
"If you want to become the old figure, use the power of your friendship, and fight me"