MODERAZIONE:
Non riesumare thread vecchi, è meglio aprire un nuovo thread e inserire un link all'originale.
Thread diviso da: http://ready64.org/smf/index.php?topic=3668
-eregilCiao a tutti.
Scusate se riporto in vita questo vecchio topic ma credo ne valga la pena visto che non é stato molto discusso il programma.
Cercavo da niubbone alcuni esempi per capire meglio come creare un charset personalizzato e altrove ho trovato risposte abbastanza soddisfacenti ( anche se mi piacerebbe scrivere un programma in assembly il più breve e chiaro possibile che permetta direttamente di scrivere dal Basic con un charset diverso da quello originale Commodore).
Ordunque cercando di studiarmi questo lavoro per motivi didattici mi sono reso conto pure io nella mia grande niubbità che é un insieme pasticciatissimo di istruzioni che spesso sono messe lì e che non servono a niente. I miei complimenti comunque a Elder (sinceri!) perché nnostante ciò in qualche modo il suo demo funziona(anche se secondo me qualcosa non va proprio come dovrebbe).
Dopo aver fatto partire l'eseguibile ho provato ad assemblare il listato originale a CBM prg Studio ma purtroppo non mi digerisce alcune istruzioni, che io non capisco appieno, tipo:
*=*+1
Cosa significa? L'indirizzo di partenza viene spostato di 1? Come altro posso scriverlo?
*= $5000-26
Scritto così sembra che da un numero esadecimale venga sottratto un numero decimale. Sono (ovviamente) due numeri entrambi esadecimali?
Passiamo al listato:
lda #$18 ; screen at $0400 chars a $2000
sta $d016 ;multicolor!
Ovviamente qua c'é un pasticcio. $18 andava assegnato ad $d018, come infatti succede qualche riga sotto. A $d016 Elder voleva assegnare qualcos'altro.
Questo 'ambo' di righe viene ripetuto ancora nel corso del listato, un copincolla davvero malfatto.
lda #$1b
ldx #$08
ldy #$18
sta $d011 ; text mode
sty $d018 ; screen a $0400, charset a $2000
Che senso ha quel ldx #$08 se non viene assegnato a niente?
Oppure non ci ho capito io qualcosa di quello che ho studiato, ma qualche riga sotto un bel ldx#$ff toglie pochi dubbi al pasticcio.
Se qualcuno si prende la briga mi spiega se ha un senso, o non molto del perché la prima istruzione 'sei' viene data a riga 11 e la rispettiva 'cli' a riga 132? E' normale? O bastava mettere la 'sei' all'inizio delle istruzioni di interrupt?
Dalla riga 145 ritroviamo queste:
lda #$1b
ldx #$08
ldy #$18
sta $d011 ; Clear high bit di $d012: text mode
sty $d018
lda #$18 ; screen at $0400 chars a $2000
sta $d016 ; multicolor!
A che serve ripetere? Ritroviamo anche ldx #$08 e company.
stx counter
lda $212e,x ; byte xesimo dai caratteri
eor $ff ; inverti
sta $212e,x ; store al suo posto
inx
lda #<int2
ldx #>int2
sta $0314
stx $0315
ldy #$92
sty $d012
asl $d019
pla
tay
pla
tax
pla
rti
Qua c'é una chiamata ad un interrupt. E' normale che non sia preceduto e seguito da sei e cli ?
Funziona, ma a proprio rischio e pericolo?
Mi fermo qui, il listato é lungo, nel frattempo spero che qualcuno abbia voglia di togliermi dubbi e dare conferme alle mie certezze!