Autore Topic: Routine Per Leggere Testo  (Letto 1595 volte)

Fabbroz75

  • Utente
  • **
  • Post: 65
  • Gioco Preferito: Aufwiedersehen Monty
Routine Per Leggere Testo
« il: 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.


Codice: [Seleziona]
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
C64/C64c/C128/C16/Vic20 | 64SD Infinity 2.0 |

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Routine Per Leggere Testo
« Risposta #1 il: 29 Giugno 2006, 21:47:27 »
 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.
Codice: [Seleziona]
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
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Fabbroz75

  • Utente
  • **
  • Post: 65
  • Gioco Preferito: Aufwiedersehen Monty
Routine Per Leggere Testo
« Risposta #2 il: 29 Giugno 2006, 23:04:25 »
 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:  
C64/C64c/C128/C16/Vic20 | 64SD Infinity 2.0 |

Fabbroz75

  • Utente
  • **
  • Post: 65
  • Gioco Preferito: Aufwiedersehen Monty
Routine Per Leggere Testo
« Risposta #3 il: 30 Giugno 2006, 00:04:05 »
 ho apportato una modifica ( e spero miglioria )

Codice: [Seleziona]
waitrast
       cmp $d012
       bne waitrast

al posto di

Codice: [Seleziona]
  ldy #$1f      ; ritardo
delay
   jsr $eeb3     ; attesa
   dey
   bne delay

Cosi' facendo dovebbe essere meglio xche' sincronizzo?
 
C64/C64c/C128/C16/Vic20 | 64SD Infinity 2.0 |

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Routine Per Leggere Testo
« Risposta #4 il: 30 Giugno 2006, 21:11:06 »
Citazione da: "Fabbroz75"
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?
 
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Routine Per Leggere Testo
« Risposta #5 il: 30 Giugno 2006, 23:33:50 »
 ...e soprattutto chiediti:qual'e' la funzione di $d012? :)  

Fabbroz75

  • Utente
  • **
  • Post: 65
  • Gioco Preferito: Aufwiedersehen Monty
Routine Per Leggere Testo
« Risposta #6 il: 30 Giugno 2006, 23:36:33 »
 $d012 legge/scrive il raster o sbaglio? :)
C64/C64c/C128/C16/Vic20 | 64SD Infinity 2.0 |

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Routine Per Leggere Testo
« Risposta #7 il: 01 Luglio 2006, 00:04:42 »
Citazione da: "Fabbroz75"
$d012 legge/scrive il raster o sbaglio? :)
si, ma con cosa lo confronti? e perche'?
/me sente che sta perdendo molto tempo
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Fabbroz75

  • Utente
  • **
  • Post: 65
  • Gioco Preferito: Aufwiedersehen Monty
Routine Per Leggere Testo
« Risposta #8 il: 02 Luglio 2006, 22:06:16 »
 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? )
 
C64/C64c/C128/C16/Vic20 | 64SD Infinity 2.0 |

Fox Cunning

  • Neo-iscritto
  • *
  • Post: 11
  • Gioco Preferito: Lazy Jones
Routine Per Leggere Testo
« Risposta #9 il: 07 Luglio 2006, 08:15:53 »
 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:
Codice: [Seleziona]
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: