Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: Fabbroz75 - 29 Giugno 2006, 16:15:20
-
Ho iniziato una routine che "dovrebbe" leggere un testo e riconoscere dei caratteri per creare effetti e/o cambiare colore.
Qui, ho semplicemente messo un carattere per andare a capo.
Essendo la mia prima routine di questo genere sul c64.. sono pronto ad ottimizzazioni e consigli :)
Vorrei non finire mai d'imparare.
cloff = $d800
vic = $d000
vicscn = $0400
color = 646
gdcolo = 647
*=$0801
.byte $0b
.byte $08
.byte $be
.byte $1b
.byte $9e
.byte $32
.byte $30
.byte $35
.byte $39
.byte $0
lda #$0
jsr $e536
sei ; chiudo gli interrupt
cls
lda #$0; schermo nero
sta $d020
sta $d021
lda #147; shift -clrhome
jsr $ffd2 ;
nop
nop
nop
nop
testo
lda #5; colore del testo 0=nero
sta 646; reg colore testo
ldx #$00
lptxt
jsr $eeb3; attesa
lda txt,x ; mette la stringa nel reg X per leggerla
beq lptxt; è uguale al byte 0?
legge
jsr $ffd2 ; chiamo chrout
cmp #"@"
beq return
ldy #$1f ; ritardo
delay
jsr $eeb3; attesa
dey
bne delay
inx ; incrementa
BNE lptxt
cli
rts
return
lda #13
jmp legge
txt
byte "2006 by 2064 SOFTWARE@"
byte "IN UNA GALASSIA MOLTO LONTANA...@"
byte "MI RITROVAI PER UNA SELVA OSCURA...@QUANDO AD UN TRATTO...@"
byte "VIDI LA LUCE... UN C64...@"
byte 0
-
Copiare a casaccio da altri programmi senza capire cosa fa il programma e le varie istruzioni... non porta a nulla :)
Vediamo che si puo' migliorare.
color = $0286 ; ragionare in hex quando si programma in asm
;cloff = $d800
;vic = $d000
;vicscn = $0400
;gdcolo = $0287 ; se non ne fai uso non serve definire una costante
*=$0801
;impariamo a capire come settare correttamente una linea sys
word EndOfBasic; puntatore alla prossima riga O fine programma
word 7102 ; numero linea
byte $9e ; token di SYS
byte [start]d ; fai scrivere da DASM l'indirizzo di partenza
byte 0 ; terminatore riga basic
EndOfBasic
word 0 ; se il puntatore alla prossima riga e' 0
; e' finito anche il programma basic
start
;lda #$0 ; questa serve per cancellare lo schermo
;jsr $e536 ; colorando il testo di nero, e' una shortcut di
; lda #00
; sta $0286
; jsr $e544
;sei ; chiudo gli interrupt; al limite "fermi" ma non ti serve
lda #$0; schermo nero
sta $d020
sta $d021
;lda #147; shift -clrhome
;jsr $ffd2 ; inutile passare dalla CHROUT
jsr $e544
;nop ; inutili...
;nop
;nop
;nop
lda #5 ; colore del testo 0=nero
sta color ; reg colore testo; hai definito una costante, usala!
ldx #$00
lptxt
jsr $eeb3 ; attesa; per me e' in piu'
lda txt,x ; mette in A il byte che trova all'indirizzo txt + x
;beq lptxt ; è uguale a 0? ma per fare cosa??
; la fai loopare per sempre
beq fine ; casomai se e' 0 esci dal programma
legge
cmp #"@" ; prima lo stampi e poi lo controlli?
;beq return ; meglio il contrario, ma soprattutto non e'
bne stampalo ; necessario fare un branch
lda #$0d ; se era una @ ne cambiamo al volo il valore in $0d
; (tutto questo e' solo puramente didattico, molto
; meglio mettere i $0d direttamente nel testo!)
stampalo
jsr $ffd2 ; chiamo chrout
ldy #$1f ; ritardo
delay
jsr $eeb3 ; attesa
dey
bne delay
inx ; incrementa
BNE lptxt ; se X ritorna a 0 finisce comunque il programma
; quindi supporta solo 255 caratteri di testo
fine
;cli ; anche questa e' inutile
rts
;return
;lda #13
;jmp legge
txt
byte "2006 BY 2064 SOFTWARE@"
byte "IN UNA GALASSIA MOLTO LONTANA...@"
byte "MI RITROVAI PER UNA SELVA OSCURA...@"
byte "QUANDO AD UN TRATTO...@"
byte "VIDI LA LUCE... UN C64...@"
byte 0
-
Grazie Ian :)
Ho copiato la sysline xche' volevo far partire il programma e mi sono ripromesso di studiarla per bene ( in altri codici l'ho commentata )
Il programma invece, aimè è scritto da zero leggendo qua e là.
Grazie ancora per l'aiuto.. migliorero'.. prometto :)
Se non disturba, postero' altri codici.
:ciauz:
-
ho apportato una modifica ( e spero miglioria )
waitrast
cmp $d012
bne waitrast
al posto di
ldy #$1f ; ritardo
delay
jsr $eeb3 ; attesa
dey
bne delay
Cosi' facendo dovebbe essere meglio xche' sincronizzo?
-
Cosi' facendo dovebbe essere meglio xche' sincronizzo?
Sincronizzi con cosa? =)
Hint: CMP $xxxx sta per COMPARE A with $xxxx
Ora domandati: cosa c'e' in A?
-
...e soprattutto chiediti:qual'e' la funzione di $d012? :)
-
$d012 legge/scrive il raster o sbaglio? :)
-
$d012 legge/scrive il raster o sbaglio? :)
si, ma con cosa lo confronti? e perche'?
/me sente che sta perdendo molto tempo
-
rieccomi a voi dopo essere stato al CODEX Adria.. ed esseremi presentato col mio fido c64 :) ed aver pure fatto dimostrazione del prophet64 e ralativo sid2sid
@Ian
Perdonami se commetto erroracci... ma sto comincinado adesso in asm c64 :)
vedrai che migliorero'...
Devo imparare bene le sintassi...
il discorso del "cmp $d012" credevo facesse una sorta di lettura del raster.. pero' giustamente.. a cosa la comparo?... ( appunto.. come la comparo? )
-
Ehilà!
Scusate se mi permetto di rispondere, dal basso della mia ignoranza, a questo invitante topic, ma avevo qualche minuto libero e così...
Premetto che non ho capito perché questo programma avrebbe bisogno di "sincronizzarsi" usando le linee di raster. Ad ogni modo, visto che mi pare tu non voglia addentrarti nel magico mondo degli interrupt, forse vorresti caricare un valore a tua scelta in A prima di confrontarlo. Oppure:
waitrast
lda $d012
cmp #$40 ; $40 è un valore arbitrario.
bne waitrast
inx
;...eccetera
Mi sono testè accorto che l'avevi già corretta in un altro topic. Di solito non leggo tutti i topic, sorry. Cancellate pure :stordita: