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... :overkiller: ).
Ciao!
(Per motivi di tempo non ho commentato tutto, ma per chiarimenti, insulti, ecc... sono qua).