Autore Topic: Altro Programma Assembler  (Letto 2195 volte)

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Altro Programma Assembler
« il: 17 Giugno 2004, 21:20:16 »
 Ciao,

dopo l'emulatore dello studente di matematica delle elementari, ecco un altro semplice programma in assembler.

CIao ciao!

Codice: [Seleziona]
; MarC=ello productions.
;
; Questo programma agisce direttamente sulla memoria dello schermo
; nella routine che visualizza 10 volte la linea immessa dall'utente
; a puro scopo illustrativo - per gli interessati -
; dell'utilizzo del modo di indirizzamento
; indiretto indicizzato.
; Per semplicità si ipotizza che l'utente immetta soltanto lettere e spazi.
; Una conversione completa dall'ASCII ai codici di schermo video non è stata qui
; implementata per brevità.
; Ci sarebbe da fare il controllo anche sui tasti di editazione e altre cosettine
; ma come esempio può andare bene così :-).
; "Uso" (non serve a un bit...): assemblare con C64asm, poi - caricato il;programma -
; battere SYS49152.
; Il programma accetta fino a 40 car. Battere return per l'immissione.
; Se si digitano 40 caratteri il programma prende in input la linea automaticamente,
; senza dover premere RETURN.
* = 49152
;INIZIO DEL PROGRAMMA
lda #13
sta 53280;bordo verde chiaro
lda #11
sta 53281; sfondo grigio scuro
lda #13; codice colore = verde chiaro
sta 646; imposta il colore del testo
lda #147; pone il codice ASCII della combinazione di tasti SHIFT+HOME
;nell'accumulatore

jsr $ffd2; cancella lo schermo (la subroutine CHROUT che la Commodore
;ci ha gentilmente
; offerto nel suo set di routine predefinite su ROM - il KERNAL -
; locata a $ffd2
; nella tavola dei salti, stampa il codice ASCII contenuto nell'accumulatore).

jsr RETURN; stampa un RETURN

; visualizza il messaggio di richiesta immissione di una linea
ldx #$00
ciclo lda messaggio,x
jsr $ffd2
inx
cpx #36
bne ciclo

jsr RETURN; stampa ancora un RETURN

; MODULO DI LETTURA - richiesta di una linea all'utente
; la memorizza dalla locazione TESTO in poi
ldx #$00
ldy #$00
lda #$00
sta contatore
; azzera i registri X, Y e A del 6510.
; Azzera anche la locazione di memoria contatore.
inizio jsr $ffe4; chiede un carattere (routine GETIN del KERNAL,
; preleva un carattere
;da tastiera e ne colloca il corrispondente ASCII nell'accumulatore).
;nell'ipotesi che i caratteri immessi siano solo lettere o lo spazio
cmp #$0d; è il RETURN
beq fine; se sì, esci dal modulo di lettura
; il codice ASCII di quel carattere è nell'accumulatore
cmp #$00
beq inizio
jsr $ffd2; visualizza il carattere
cmp #32
beq memorizza
sec; si prepara per la sottrazione
sbc #64; converte l'ascii in codice dello schermo video
memorizza ldy contatore
sta testo,y
inc contatore;*
lda contatore
cmp #40
bne inizio; se no, chiedi un carattere**
fine nop; un label inutile... tanto per rimpiazzare l'RTS che c'era qui all'inizio senza
;cambiare le istruzioni di salto sopra... sono pigro!


; * nota: si è dovuta usare la locazione di memoria contatore
; perché la routine GETIN
; non è gentile come la CHROUT: questa modifica i registri X Y e,
; nel VIC-20 e nel C-64,
; anche l'indicatore di riporto.
; ** nota: siccome GETIN modifica (o comunque può modificare)
; l'indicatore di riporto, per i
; salti condizionati non si devono usare BCC o BCS, ma BNE e BEQ,
; le quali non si interessano
; del flag C (carry) ma del flag Z ("zero", più propriamente EQUAL FLAG).

;MODULO "DISPTEN" - visualizza il messaggio 10 volte utilizzando la memoria
;dello schermo - indirizzamento indiretto indicizzato -
;Si parte dalla locazione iniziale della memoria dello schermo + (40*6)
;in modo da non sovrapporre la visualizzazione con quanto in precedenza nello schermo
;e lasciare un po' di spazio.
;La pagina di memoria della memoria di schermo  (e quindi il byte alto da usare) è indicata
;nella locazione 648. Siccome 6*40=240 < 255 tale pagina è OK.
;Locazioni di pagina zero usate: 187 e 188.
;Prima di tutto, si deve impostare la locazione base.
; Si tratta di collocare il byte basso
;e alto della parola di 16bit corrispondente alla parte desiderata
;della memoria dello schermo nelle locazioni 187 e 188.
lda #240
sta 187
lda 648
sta 188
ldy #$00
ldx #$00;azzeramento registri
;ora si può dare inizio al loop
loop2 lda testo,y; colloca nell'accumulatore il primo carattere
sta (187),y; lo copia nella locazione base schermo+240, incrementata di Y

;(al primo loop Y=0)

iny; incrementa (di uno) il registro Y
cpy contatore; confronta Y con la lunghezza del testo immesso dall'utente
bcc loop2; se il registro Y ha un valore minore della lunghezza del testo,
; allora leggi il carattere successivo
;----
;qui siamo fuori dal loop2
;si deve incrementare la locazione in pagina zero (che finito il primo loop è base
; schermo+240)
;di modo che si passi alla linea successiva. La si deve incrementare di 40.
clc; si prepara per la somma azzerando l'indicatore di riporto
lda 187; carica il byte basso nell'accumulatore
adc #40; somma 40 (per portarsi alla colonna successiva)
sta 187; pone il risultato in 187
lda 188; carica il byte alto nell'accumulatore
adc #0; somma zero più - attenzione - l'eventuale riporto
sta 188; memorizza il risultato in 188
ldy #$00; azzera l'indice di indirizzamento
inx; incrementa l'indice x che ci serve a tenere il conto delle linee visualizzate
cpx #10; si è arrivati alla linea 10?
bcc loop2; se no, visualizza un'altra linea

RETURN lda #13; "routinettina" che va a capo (stampa un RETURN)
jsr $ffd2
rts

messaggio .text "ciao! immetti una linea di testo :-)"
contatore = *

testo = * + 1

; MarC=ello r00lez! (ehmm... a little bit :-( ).

-=MarC=ellO=-

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Altro Programma Assembler
« Risposta #1 il: 18 Giugno 2004, 14:52:16 »
 Mi tocca ovviamente precisare che questo programma può essere riscritto molto più breve, ovviamente utilizzando sempre la routine CHROUT del KERNAL per visualizzare i caratteri. Ho invece manipolato direttamente la memoria dello schermo per illustrare agli interessati un modo per poter manipolare la memoria. Ciao a tutti
-=MarC=ellO=-