*----------------------------------------------------------- * Title : * Written by : * Date : * Description: *----------------------------------------------------------- ORG $1000 START: * Stampa a video* insert: LEA messaggio,A1 MOVE.B #14,D0 TRAP #15 *Legge il valore e si assicura che sia compreso tra 0 e 255 altrimenti lo richiede* MOVE.B #4,D0 TRAP #15 cmp.l #255,d1 bgt insert cmp.l #0,d1 blt insert move.b d1,numero *salva in memoria fine move.b numero,-(a7) *passa tramite stack il numero letto jsr binario *chiamo la subroutine per trasformarlo in binario move.l #irq1,$64 *inizializza la isr loopInf nop nop bra loopInf STOP #$00 binario: movem.l d0-d1/a0,-(a7) move.b 16(a7),d0 clr.l d1 lea cifre,a0 *spazio in cui salvare il numero in base2 ciclo1 add #1,d1 *conta il numero di cifre di cui sarà composto il binario cmp.w #2,d0 *se è minore di 2 non è necessario convertirlo blt fine1 divs.w #2,d0 *converto in base2 dividendo e prendendo il resto swap d0 *swap per prendere il resto move.b d0,(a0)+ *salvo la singola cifra binaria move.b #0,d0 *resetto il resto swap d0 *swap di nuovo jmp ciclo1 fine1 move.b d0,(a0)+ move.b d1,ncifre movem.l (a7)+,d0-d1/a0 rts segment7: movem.l d3-d4/a0/a2/a3,-(a7) lea digits,a0 jsr resettaDisplay move.l #$E00000,a2 *Indirizzo del display a segmenti lea CIFRE,A3 move.b ncifre,d4 move.l #14,d1 *Prima cifra a destra ci move.b (A3)+,d3 *sposta di volta in volta la singola cifra in d3 move.b (a0,d3),(a2,d1) *la visualizza sul display sub.b #2,d1 *mi sposto alla posizione accanto sub.l #1,D4 bgt ci res: movem.l (a7)+,d3-d4/a0/a2/a3 rts resettaDisplay: movem.l d3/d4/a2,-(a7) move.l #$E00000,a2 *Indirizzo del display a segmenti move.l #10,d3 *spegne le varie cifre move #14,d4 *il ciclo mi serve per spegnerle tutte cic: move.b (a0,d3),(a2,d4) *indirizz. indiretto con reg. indirizzo + indice + scostamento (in questo caso non c'è) sub.l #2,d4 bge cic movem.l (a7)+,d3/d4/a2 rts irq1: * move.l d0,-(a7) btst #0,check *variabile che mi dice se stampare il binario (pari)o il contatore(dispari) beq pari disp: add.b #1,count *se è dispari, incremento il contatore da stampare cmp.b #10,count *se arriva a 10 lo resetto blt continua move.b #0,count continua lea digits,a0 jsr resettaDisplay move.l #$E00000,a2 move.b count,d0 move.b (a0,d0),(a2) jmp fineisr pari jsr segment7 *visualizzo il numero in base 2 fineisr add.b #1,check *movem.l (a7)+,d0 rte SIMHALT ; halt simulator * Put variables and constants here digits: *dc.b $3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F,$00,$40 dc.b $3F *digit 0 dc.b $06 *digit 1 dc.b $5B *digit 2 dc.b $4F *digit 3 dc.b $66 *digit 4 dc.b $6D *digit 5 dc.b $7D *digit 6 dc.b $07 *digit 7 dc.b $7F *digit 8 dc.b $6F *digit 9 dc.b $00 *digit off dc.b $40 *dash messaggio dc.b 'Inserisci un numero compreso tra 0 e 255 ',0 numero ds.b 1 *Spazio in cui salvare il numero cifre ds.b 8 *Spazio in cui salvare il numero base2 check dc.b 0 ncifre dc.b 1 count dc.b 0 END START *~Font name~Courier New~ *~Font size~16~ *~Tab type~1~ *~Tab size~4~