; ruotaled.asm
;
; MC68QY908
; 2  PTB7 -> S5 (Al centro)
; 3  PTB6 -> EN_LCD - LED Verde
; 5  PTA4 -> RS_LCD - LED Giallo
; 15 PTB0 -> DB4
; 14 PTB1 -> DB5
; 11 PTB2 -> DB6
; 10 PTB3 -> DB7

;************************************************************************************
;* Porte Parallele
;************************************************************************************
PTA            =     0x00                   ;I/O PORT A
PTB            =     0x01                   ;I/O PORT B
;******  DATA DIRECTION REGISTERS A-B ************************************************
DDRA           =      0x04                  ;PORT A DATA DIRECTION REGISTER
DDRB           =      0x05                  ;PORT B DATA DIRECTION REGISTER
;******  DATA DIRECTION REGISTERS A-B ************************************************
PTAPUE         =      0x0B                  ;PULLUP ENABLE PORT A
PTBPUE         =      0x0C                  ;PULLUP ENABLE PORT B
;****** CONFIG  1 REGISTER ***********************************************************
CONFIG1        =      0x001F                ;CONFIG1 REGISTER
;****** CONFIG  2 REGISTER ***********************************************************
CONFIG2        =      0x001E                ;CONFIG2 REGISTER
;
;
STARTPGM    =   0xee00    ; L'inizio della ROM
STARTRAM    =   0x80      ; L'inizio della RAM
RESETVECT   =   0xfffe    ; La posizione del vettore di reset
;
        .area   PROGRAMMA (ABS)
        .org    STARTPGM
;
MAIN:
        rsp                             ; resetta lo stack pointer
        ; Inizializa i registri di configurazione del processore
        mov     #0x31,*CONFIG1          ; LVI Reset disanilitato (5);
                                        ; Alimentazione LVI disabilitati (4)
                                        ; COP disabilitato (0)
        mov     #0x08,*CONFIG2          ; Oscillatore esterno (4;3 = 01)

        ; Inizializza le porte
        mov     #0x10,*PTA              ; Accendo il LED Giallo
        mov     #0x10,*DDRA             ; Metto in OUT PTA4
        mov     #0x01,*PTB              ; Accendo un LED (bit 0 di PTB)
        mov     #0x80,*PTBPUE           ; Abilita il Pull-Up sul pulsante
        mov     #0x4F,*DDRB             ; Mette in Output i 4 bit bassi di B

        ; La configurazione corrente dei LED e' mantenuta in A
        lda     #0x1                    ; Mette a 1 il bit 0 di A

MAIN_LOOP:
        psha                            ; Salva la configurazione dei LED

        ; Ciclo di ritardo da circa 1S
        ; ripeto 5 * 255 * 255 volte una push ed una pull
        lda     #5                      ; Numro ripetizioni ciclo esterno
LOOPP:
        psha                            ; Salva contatore ciclo esterno
        lda     #0xFF                   ; Numero Ripetizioni ciclo intermedio
LOOPA:
        ldx     #0xFF                   ; 2 - Numero ripetizioni ciclo interno
LOOPX:
        psha                            ; 2
        pula                            ; 2 - Perde tempo
        dbnzx   LOOPX                   ; 3 - Ciclo interno
        dbnza   LOOPA                   ; 3 - Ciclo intermedio
        pula                            ; Recupera il contatore del ciclo esterno
        dbnza   LOOPP                   ; Ciclo esterno di ritardo

        pula                            ; Recupera la configurazione die LED
        ; Fine cicli di rtaardo

        lsla                            ; Ruota a sinistra i LED
        cmp     #0x10                   ; Dopo 4 rotazioni, A vale 0x10
        bne     CONTINUA_ROTAZIONE      ; Se non c'è arrivato, continua
        lda     #0x1                    ; Mette a 1 il bit 0 di A
CONTINUA_ROTAZIONE:
        sta     *PTB                    ; Accende i LED

        ; Adesso controlla il pulsante connesso a PTB7
        brclr   #7,*PTB,PRESSED         ; Controlla il pulsante
        bclr    #6,*PTB                 ; Rilasciato - Led Giallo Acceso
        bset    #4,*PTA                 ; Rialsciato - LED Verde Spento
        bra     CLEARED                 ; Torna al codice comune
PRESSED:
        bset    #6,*PTB                 ; Premuto - Led Giallo Spento
        bclr    #4,*PTA                 ; Premuto - LED Verde Acceso
CLEARED:

        bra     MAIN_LOOP               ; Ciclo infinito

;
        .area   RESET (ABS)
        .org    RESETVECT
        .word   MAIN                    ; Vettore di RESET
