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.
* = $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
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...

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