        ;---------------- avvio display -------------------------
        ;--------------- inizializzazione display e led ---------
        call    init_dsp
        ;---------- tutti leds display accesi  per 1S -----
        ldi     w,11111111b     ;carattere (all)
        call    disp_all
        call    delay_1s
        ;---------------------------
        ;---------- invio pagina presentazione per 2S------
        call    disp_pag
        call    delay_1s
        call    delay_1s

        ;---------- cancellazione display -----------------
        ldi     w,0a0h          ;carattere ( )
        call    disp_all
        ;--------------- fine avvio display ---------------------

;---------------------------- ROUTINES DISPLAY -----------------------------
;---------------------------------------------------------------------------
;init_dsp                 
;       
;funzione : inizializza display LCD LM016L (routine consigliata pag.260 data
;           book Hitaci x HD44780U)
;
;parametri: function set = 00111000b =8bits/due righe attive/5x7dots
;           display on/off control=00001111b=display on/cursor on/flash on
;           entry mode = 00000110b=increment on/ display  no shift
;           clear display= 00000001b=cursore in IřcarIřriga(80h)/tutti spazi
;
;utilizzati:            a invariato
;modificati:            stack3
;calls:                 D_50ms, istr_out
;da non modificare nelle calls:         stack1, stack2
;
;---------------------------------------------------------------------------
init_dsp:
        down

        ld      stack3,a                ;push a
        call    D_50ms                  ;      ritardo 50  msec

        ldi     a,00110000b             ;function set =8 bits /1 riga
        call    istr_out                ;trasmette istruzione al display
        call    D_50ms                  ;      ritardo 50  msec

        ldi     a,00110000b             ;function set =8 bits / 1riga
        call    istr_out                ;trasmette istruzione al display
        call    D_50ms                  ;      ritardo 50  msec

        ldi     a,00110000b             ;function set = 8 bits / 1 riga
        call    istr_out                ;trasmette istruzione al display

        ldi     a,00111000b             ;function set = 56 =
                                        ;8bits mode/ 2 righe attive/5x7dots  
        call    istr_out                ;trasmette istruzione al display

        ldi     a,00001111b             ;display on/off control =0FH =
                                        ;display= on /cursore =on /flash=on
        call    istr_out                ;trasmette istruzione al display

        ldi     a,00000001b             ;clear display =1=
                                        ;corsore in alto sx /tutti spazi
        call    istr_out                ;trasmette istruzione al display

        ldi     a,00000110b             ;entry mode set =6 =
                                        ;inc=on / no shift display
        call    istr_out                ;trasmette istruzione al display

        ld      a,stack3                ;pop a
        ret

;---------------------------------------------------------------------------
;disp_pag
;
;funzione:      scrive pagina base sul display
;
;paramateri     a, x, y 
;               
;       inizio pag.      50h addr   3dh drwr
;       cambio drwr      7fh addr
;       fine pag.        5fh addr   3eh drwr
;
;utilizzati:            a, x, y
;modificati:            stack3,
;calls:                 istr_out, car_out
;da non modificare nelle calls: stack1, stack2
;
;drwr (rdw)   .def 0c9h                ; Data rom window register.
;
;        bit address                     X X 5 4 3 2 1 0
;                                        0 1 ł ł ł ł ł ł
;        bit drwr         X  6  5  4 3 2 1 0 ł ł ł ł ł ł
;                         0  ł  ł  ł ł ł ł ł ł ł ł ł ł ł
;                            ł  ł  ł ł ł ł ł ł ł ł ł ł ł
;                            V  V  V V V V V V V V V V V
;        bit real address   12 11 10 9 8 7 6 5 4 3 2 1 0
;---------------------------------------------------------------------------

disp_pag:
	down

        ld      stack3,a        ;push a into stack3
        ld      a,x
        ld      stack4,a        ;push x into stack4
        ld      a,y
        ld      stack5,a        ;push y into stack5

        ldi     x,50h
        ldi     drwr,3dh        ;( 0f50h  pag. logo )
        ldi     y,00h           ;posizione carattere
disp_loop
        ld      a,y
        set     7,a             ;obbligatorio per set DDRAM
        call    istr_out
        ld      a,(x)
        call    car_out
        inc     y
        inc     x                ;( 0f9fh = 5fh addr 3eh drwr )
        ;--- controllo cambio 1 riga ---
        ld      a,y
        cpi     a,14h
        jrnz    disp_ny1
        ldi     y,40h
disp_ny1
        ;--- controllo cambio 2 riga ---
        ld      a,y
        cpi     a,54h
        jrnz    disp_ny2
        ldi     y,14h
disp_ny2
        ;--- controllo cambio 3 riga ---
        ld      a,y
        cpi     a,28h
        jrnz    disp_ny3
        ldi     y,54h
disp_ny3
        ;--- controllo cambiamento drwr ---
        ld      a,x
        cpi     a,80h           ;(7fh + 1)
        jrnz    disp_jp
        ldi     drwr,3eh
        ldi     x,40h
disp_jp
        ;--- controllo fine ciclo ---
        ld      a,y
        cpi     a,68h
        jrnze   disp_loop


        ldi      a,00001100b            ;assenza cursore
        res     DATA,bk_pa
        res     CLK,bk_pa
        call    istr_out                ;trasmette istruzione al display

        ld      a,stack5
        ld      y,a                     ;pop y
        ld      a,stack4
        ld      x,a                     ;pop x
        ld      a,stack3                ;pop a
        ret

;---------------------------------------------------------------------------
;disp_ram
;
;funzione:      scrive su display riga da ram
;paramateri     a, x, y 
;
;utilizzati:            a, x=add ram, y
;calls:                 istr_out, car_out
;da non modificare nelle calls: stack1, stack2
;
;---------------------------------------------------------------------------
disp_ram:
	down
        ld      baka,a
        ;ld      a,x             ;add uP lettura dati
        ;ld      bakx,a
        ;ld      a,y             ;posizione carattere
        ;ld      baky,a
        ld      a,w
        ld      bakw,a
        ;ld      a,v
        ;ld      bakv,a

        ldi     w,20            ;contatore caratteri
disp_rloop
        ld      a,y
        set     7,a             ;obbligatorio per set DDRAM
        call    istr_out
        ld      a,(x)
        call    car_out
        inc     y
        inc     x                ;( 0f9fh = 5fh addr 3eh drwr )
        ;--- controllo fine ciclo ---
        dec     w
        jrnze   disp_rloop

        ldi      a,00001100b            ;assenza cursore
        res     DATA,bk_pa
        res     CLK,bk_pa
        call    istr_out                ;trasmette istruzione al display

        ;ld      a,bakx
        ;ld      x,a                             ;pop x
        ;ld      a,baky
        ;ld      y,a                             ;pop y
        ld      a,bakw
        ld      w,a                             ;pop w
        ;ld      a,bakv
        ;ld      v,a                             ;pop v
        ld      a,baka                          ;pop a or rx mem
        ret


;----------------------------------------------------------------------------        
;istr_out                     
;       
;funzione : invia istruzione al display                          
;           a all'inizio deve contenere l'istruzione da inviare al display
;
;utilizzati: a,x invariati
;modificati: stack1 e stack2
;---------------------------------------------------------------------------
istr_out:
	down
        ld      stack1,a                ;push  a
        ld      a,x
        ld      stack2,a                ;push x

        ld      a,stack1
        ld      drb,a                   ;istruzione in out

        set     E,bk_pa                 ;         ____
        ld      a,bk_pa                 ; E      |
        ld      dra,a                   ;    ____|

        res     E,bk_pa                 ;    ____
        ld      a,bk_pa                 ;E       |
        ld      dra,a                   ;        |____


	;--------------------------------------------------        
	;D_2ms                    
	;       
	;funzione : attende in loop 2  msec                              
	;--------------------------------------------------
	down
        ldi     x,2  
d50m1a  ldi     a,41  
d50m2a  down                    ;                   |   circa
        dec     a               ;                   |   23 microsec
        cpi     a,0             ;z=1 quando a=0     | a=41       quindi
        jrnz    d50m2a          ;se Z=0 vai a d50m2a| 41 x23=943 microsec
        dec     x               ;                        
        ld      a,x             ;                   | circa
        cpi     a,0             ;z=1 quando a=0     | 26,5 microsec
        jrnz    d50m1a          ;se z=0 vai a d50m1a| x=2 quindi
                                ;riproduce x volte  | 2x26,5=52,8 microsec
                                ;il ciclo precedente|
                                ;----------------------------------------
                                ; tempo tot = 0,943+ 0,0528 =0,9958 x 2 =
                                ;           = 1,9916 msec
        ld      a,stack2
	ld      x,a                     ;pop x
	ld      a,stack1                ;pop a
	ret


;---------------------------------------------------------------------------        
;car_out                     
;       
;funzione : invia carattere  al display                          
;           a all'inizio deve contenere il carattere da inviare al display
;
;
;utilizzato: a=in invariato
;modificato: stack1
;---------------------------------------------------------------------------
car_out
        down

        ld      stack1,a        ;push a
	ld      drb,a           ;istruzione in out

        set     DATA,bk_pa              ;       ___
        ld      a,bk_pa                 ;RS    |
        ld      dra,a                   ;   ___|

        set     E,bk_pa                 ;       ___
        ld      a,bk_pa                 ;E     |
        ld      dra,a                   ;   ___|

        res     E,bk_pa                 ;   ___
        ld      a,bk_pa                 ;E     |
        ld      dra,a                   ;      |___

        res     DATA,bk_pa              ;   ___
        ld      a,bk_pa                 ;RS    |
        ld      dra,a                   ;      |___

        ld      a,stack1        ;pop a
	ret

;---------------------------------------------------------------------------
;disp_all                    
;       
;funzione : scrive tutta la pagina con il carattere in w                            
;
;---------------------------------------------------------------------------
disp_all 

        ldi     a,00h                   ;set dd ram address
					;Iř car. Iř riga                
        set     7,a                     ;obbligatorio
        call    istr_out                ;trasmette istruzione al display
	
        ldi     loop,20   
disp_lo1        
        ld      a,w                     ;in a  carattere in
        call    car_out                 ;invia carattere
        dec     loop
        jrnz    disp_lo1                ;loop volte

;--------------------------------------------------------------------
	
        ldi     a,40h                   ;set dd ram address
					;IIř riga                
        set     7,a                     ;obbligatorio
        call    istr_out                ;trasmette istruzione al display
	
        ldi     loop,20   
disp_lo2        
        ld      a,w                     ;in a  carattere in
	call    car_out                 ; invia carattere
        dec     loop
        jrnz    disp_lo2                ;loop volte
	
;----------------------------------------------------------------------
        ldi     a,14h                   ;set dd ram address
                                        ;IIIř riga                
        set     7,a                     ;obbligatorio
        call    istr_out                ;trasmette istruzione al display
	
        ldi     loop,20   
disp_lo3        
        ld      a,w                     ;in a  carattere in
	call    car_out                 ; invia carattere
        dec     loop
        jrnz    disp_lo3                ;loop volte
	
;----------------------------------------------------------------------
        ldi     a,54h                   ;set dd ram address
                                        ;IIIIř riga                
        set     7,a                     ;obbligatorio
        call    istr_out                ;trasmette istruzione al display
	
        ldi     loop,20   
disp_lo4        
        ld      a,w                     ;in a  carattere in
	call    car_out                 ; invia carattere
        dec     loop
        jrnz    disp_lo4                ;loop volte
	
;----------------------------------------------------------------------

        ldi     a,00001100b             ;set dd ram address
					;assenza cursore                
        call    istr_out                ;trasmette istruzione al display
	
	ret

;----------------------- FINE ROUTINES DISPLAY -----------------------------

;---------------------------------------------------------------
;delay_1s
;               funzione: attende per 1 S
;call: 20 volte D_50ms
;---------------------------------------------------------------
delay_1s:
        ldi     loop,20                ;20 cicli di 50ms= 1 S
delay_l1        
	down
	call    D_50ms
        dec     loop
	jrnz    delay_l1
	ret
