Commodore 64 > Programmazione, Grafica e Musica

Un Programmetto In Assembly

(1/1)

MarC=ello:
 Ciao,

qua posto un semplicissimo programma in assembly che chiede in input un numero di una cifra. Se è più piccolo di 5, lo raddoppia, se è più grande di 5 o uguale a 5, lo divide per due, troncando l'eventuale resto (aritmetica degli interi). E' un programma semplice, lo so, ma potrebbe interessare a chi, come me, non è un demo coder... Ah, per maggiore chiarezza non ho usato il modo di indirizzamento indiretto indicizzato, ma sono ricorso a del codice automodificante.


--- Codice: ---* = $c000
init
; sottoprocedura NUMLEG, legge un tasto numerico (esclusivamente) e ne colloca
; il valore corrispondente nell'accumulatore (dopo averlo visualizzato)
JSR $FFE1; controlla se il tasto STOP viene premuto
BEQ fine; se sì vai a fine
JSR $FFE4; controlla se è stato premuto un tasto
; e ne colloca il codice ASCII nell'accumulatore
CMP #$30; confronta con il codice dello 0
BCC init; il contenuto dell'accumulatore è minore del codice ASCII dello zero?
; se sì salta (Branch Clear Carry) termina => il tasto premuto non corrisponde
; ad un numero
CMP #$3A; confronta il codice successivo al numero 9
BCS init; se il codice nell'A è maggiore o uguale a $3A, allora termina;
JSR $FFD2; se il codice nell'A è dunque un numero, allora visualizzalo
AND #$0F; memorizza nell'accumulatore il valore binario del numero digitato
fine RTS

; inizio programma -
ldx #$00
lda #<MESS1
sta PRINT+1
lda #>MESS1
sta PRINT+2
; richiede un numero di una cifra
jsr PRINT
jsr PRINT
jsr PRINT
jsr init
jsr RETURN
cmp #$05
bcs dividi
tay
ldx #0
lda #<MINORE
sta PRINT+1
lda #>MINORE
sta PRINT+2
jsr PRINT
ldx #0
lda #<DOPPIO
sta PRINT+1
lda #>DOPPIO
sta PRINT+2
jsr PRINT
tya
asl
jmp stampa_car
dividi
tay
ldx #0
lda #<MAGGIORE
sta PRINT+1
lda #>MAGGIORE
sta PRINT+2
jsr PRINT
ldx #0
lda #<META
sta PRINT+1
lda #>META
sta PRINT+2
jsr PRINT
tya
lsr
stampa_car
ora #$30
jsr $ffd2
rts

MESS1 .TEXT "---- CIAO DA MARC=ELLO ---@"
 .TEXT "---------------------------------@"
 .TEXT "INSERISCI UN NUMERO.@"
MINORE .TEXT "IL NUMERO E' PIU' PICCOLO DI 5.@"
MAGGIORE .TEXT "IL NUMERO E' MAGGIORE O UGUALE A 5.@"
DOPPIO .TEXT "IL DOPPIO E': @"
META .TEXT "LA META' (RESTO ESCLUSO) E': @"

;sottoprocedura PRINT
PRINT lda mess1,x
cmp #$40
beq EXIT
jsr $ffd2
inx
jmp PRINT
EXIT inx
lda #$0d
jsr $ffd2
rts

;sottoprocedura RETURN
RETURN
sta $033c
lda #$0d
jsr $ffd2
lda $033c
rts
 

--- Termina codice ---

Per assemblarlo usare C64ASM.
Per eseguirlo, una volta caricato il programma digitare SYS 49174 (ho piazzato una subroutine prima del "main" per avere una SYS alternativa...  :overkiller: ).

Ciao!


(Per motivi di tempo non ho commentato tutto, ma per chiarimenti, insulti, ecc... sono qua).


 

iAN CooG:
 Possiamo prenderlo come esempio di programma da ottimizzare.
Ci sono molti punti in cui possiamo risparmiarci tanti bytes, se non routine intere.
C'e' qualche bravo studente che vuole fare il compito? ;)
Forza, che si impara anche cosi'! Coraggio fatevi avanti!  

MarC=ello:
 
--- Citazione ---Possiamo prenderlo come esempio di programma da ottimizzare.
Ci sono molti punti in cui possiamo risparmiarci tanti bytes, se non routine intere.

--- Termina citazione ---

Ho fatto in modo che fosse leggibile anche a chi non è esperto ;) Possiamo prenderlo anche come un programma che non rispetta uno stile elegante di programmazione ma che dovrebbe essere meglio comprensibile anche per chi ha una modesta conoscenza dell'assembler.

E' chiaro ed evidente che nelle chiamate alla routine per visualizzare i messaggi, si possono evitare tutti quei LDA #.. e STA #: basta modificare l'indice. Così come quelle JSR PRINT di fila, messe per fare somigliare il programma ad un programma BASIC, possono essere tolte.

Ecco, così ho dato dei suggerimentini... al lavoro per l'ottimizzazione, amici ;)

 

iAN CooG:
 Lo so che tu lo sai scrivere "meglio", e infatti e' un ottimo inizio per far scattare qulache lampadina, tipo quelle che hai suggerito tu, o altre...
hint1: far finire le stringhe con un piu' standard byte 0
hint2: trovare la routine del kernel che fa gia' la stessa cosa e sfruttarla...
ho gia' detto troppo.
Dai, se ne parliamo io e marc=ello non serve a niente, qualcuno si faccia avanti, anche solo con delle domande!
Diamo un senso al nostro C64, per giocare c'e' la play *grin*

MarC=ello:
 Un hint... date un'occhiata alle routine del KERNAL sulla reference guide di Project64... capitolo 5... c'è una routine che inizia per S e finisce per Y che agevola la vita... ed è utilissima anche per l'altro programmino che ho postato...

Navigazione

[0] Indice dei post

Vai alla versione completa