;------------------------------------------------------------
; Nombre del Proyecto: video_18f452_V2
; Fecha: 14/02/2009
; PIC: 18F452
; Cristal: 10 MHz PLLx4
; Velocidad de reloj: 40 Mhz
;------------------------------------------------------------


 LIST    P=PIC18F452
 INCLUDE <P18F452.inc>

 ;Bytes de configuración, consultar: C18_Config_Settings_51537e.pdf para cambiar

 CONFIG OSCS=OFF, OSC=HSPLL, BORV=42, BOR=ON, PWRT=ON, WDTPS=128, WDT=OFF, CCP2MUX=OFF, DEBUG=OFF, LVP=OFF, STVR=ON
 CONFIG CP3=OFF, CP2=OFF, CP1=OFF, CP0=OFF, CPD=OFF, CPB=OFF, WRT3=OFF, WRT2=OFF, WRT1=OFF, WRT0=OFF
 CONFIG WRTD=OFF, WRTB=OFF, WRTC=OFF, EBTR3=OFF, EBTR2=OFF, EBTR1=OFF, EBTR0=OFF, EBTRB=OFF


;------------------------------------------------------------
;                  Declaración de Registros
;------------------------------------------------------------

                CBLOCK  0x00
                Contador
                Contador2
                Flags
                Dato_Ram
                Contador_Pag
                Y1
                Y2
                X1
                X2
                X
                Y
                ENDC


;------------------------------------------------------------
;                  Declaración de Bits
;------------------------------------------------------------

#DEFINE         Sinc    LATA,5,0               ;Pin de salida de sincronismo
#DEFINE         RST     PORTB,0,0              ;Pin de entrada de RESET
#DEFINE         E_enab  PORTB,1,0              ;Pin de entrada de ENABLE
#DEFINE         RW      PORTB,2,0              ;Pin de entrada de LEER/ESCRIBIR
#DEFINE         DI      PORTB,3,0              ;Pin de entrada de Dato/INSTRUCCIÓN
#DEFINE         CS_2    PORTB,4,0              ;Pin de entrada de CS2
#DEFINE         CS_1    PORTB,5,0              ;Pin de entrada de CS1
#DEFINE         INV     PORTC,3,0              ;Pin de entrada de video invertido
#DEFINE         Busy    LATC,4,0               ;Pin de salida de ocupado

#DEFINE         t023us0 0xFF, 0xF7             ;Tiempo a cargar en el TMR0 (02,3uS)

#DEFINE         t295us0 0xFE, 0xE7             ;Tiempo a cargar en el TMR0 (29,5uS)

#DEFINE         t271us0 0xFE, 0xFF             ;Tiempo a cargar en el TMR0 (27,1uS)

#DEFINE         t047us0 0xFF, 0xDF             ;Tiempo a cargar en el TMR0 (04,7uS)

#DEFINE         t589us0 0xFD, 0xC1             ;Tiempo a cargar en el TMR0 (58,9uS)

#DEFINE         t589us1 0x6D, 0xC1             ;Tiempo a cargar en el TMR0 (58,9uS)
                                               ;En esta línea se debe activar el TMR1, para la salida de imagen.
                                               ;1º línea de video, debe sacar el dato de video sin rotar el byte.
                                               ;Restar 64 posiciones a FSR1 Y FSR2 para seguir rotando los mismos bytes.

#DEFINE         t589us2 0x4D, 0xC1             ;Tiempo a cargar en el TMR0 (58,9uS).
                                               ;En esta línea se debe activar el TMR1, para la salida de imagen.
                                               ;2º línea de video, debe sacar el dato de video y rotar el byte.
                                               ;Restar 64 posiciones a FSR1 Y FSR2 para seguir rotando los mismos bytes.

#DEFINE         t589us3 0x5D, 0xC1             ;Tiempo a cargar en el TMR0 (58,9uS).
                                               ;En esta línea se debe activar el TMR1, para la salida de imagen.
                                               ;2º línea de video, debe sacar el dato de video y rotar el byte.
                                               ;Incrementar el contador de páginas.

#DEFINE         t270us0 0xBE, 0xFF             ;Tiempo a cargar en el TMR0 (27,0uS), (Media línea del primer campo).
                                               ;Indica que el 1° campo llegó a su fin, FSR1 = 0x100, FSR2 = 0x300, contador = 0.

#DEFINE         t613us0 0xFD, 0x9C             ;Tiempo a cargar en el TMR0 (61,3uS)
                                               ;Última línea de post ecualización del 2° campo + media línea de sincro horizontal

#DEFINE         t589us4 0xBD, 0xC1             ;Tiempo a cargar en el TMR0 (58,9uS).
                                               ;Indica que la tabla llegó a su fin, recargar el TBLPTR (TBLPTRH = 0x40, TBLPTRL =0x00)
                                               ;También FSR1 = 0x100, FSR2 = 0x300, contador = 0.

;------------------------------------------------------------
;                  Declaración de Macros
;------------------------------------------------------------

Sacar_1         MACRO
                MOVFF   POSTINC1,LATE          ;Mueve el Dato apuntado por FSR1 al puerto E
                NOP                            ;y además incrementa FSR1
                ENDM

Sacar_2         MACRO
                MOVFF   POSTINC2,LATE          ;Mueve el Dato apuntado por FSR2 al puerto E
                NOP                            ;y además incrementa FSR2
                ENDM

Sacar_y_Rotar_1 MACRO
                MOVFF   INDF1,LATE             ;Mueve el Dato apuntado por FSR1 al puerto E
                RRNCF   POSTINC1,f,0           ;Rota el Dato e incrementa FSR1
                ENDM

Sacar_y_Rotar_2 MACRO
                MOVFF   INDF2,LATE             ;Mueve el Dato apuntado por FSR2 al puerto E
                RRNCF   POSTINC2,f,0           ;Rota el Dato e incrementa FSR2
                ENDM


;------------------------------------------------------------
;                        Inicio
;------------------------------------------------------------

                ORG     0x00
                BRA     Programa


;------------------------------------------------------------
;               Inicio de la interrupción por TMR0
;------------------------------------------------------------

                ORG     0x08                   ;Vector de interrupción de prioridad alta
Interr_TMR0     BRA     TMR0_Isr               ;salta a la rutina de interrupción de TMR0

;------------------------------------------------------------
;               Interrupción por TMR1
;------------------------------------------------------------

                ORG     0x18                   ;Vector de interrupción de prioridad baja
Interr_TMR1     BCF     PIR1,TMR1IF,0          ;baja la bandera de la interrupción por TMR1
                BCF     T1CON,TMR1ON,0         ;apaga el TMR1
                SETF    TMR1H,0                ;setea el TMR1 para la próxíma línea de video
                MOVLW   .165
                MOVWF   TMR1L,0
                BTFSS   Flags,5,0              ;Verifica si es una línea par o impar para repetir el patrón de dibujo
                BRA     No_Repite              ;saca y rota
                NOP

                Sacar_1                        ;1
                Sacar_1                        ;2
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1                        ;8

                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1                        ;16

                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1

                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1                        ;32

                Sacar_1                        ;33
                Sacar_1                        ;34
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1                        ;40

                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1                        ;48

                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1                        ;56

                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1
                Sacar_1                        ;64 veces



                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2

                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2
                Sacar_2                        ;64 veces

                NOP
                BCF     LATE,0,0               ;Pone en bajo la salida de video
                BRA     Salir_Video

No_Repite       Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1

                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1
                Sacar_y_Rotar_1                ;64 veces


                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2

                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2
                Sacar_y_Rotar_2                ;64 veces

                NOP
                BCF     LATE,0,0               ;Pone en bajo la salida de video

Salir_Video     BTFSS   Flags,4,0              ;verifica si debe saltar de página
                BRA     Restar_64
                INCF    Contador_Pag,F,0       ;Incrementa el Contador de páginas
                RETFIE  1
                                               ;Si no terminó de rotar los 8 bits los punteros deben recorrer de nuevo los 64 espacios
                                               ;por eso se le resta 64 a cada uno (FSR1 y FSR2)
Restar_64       TSTFSZ  FSR1L,0                ;Si FSR1L vale cero se le resta 1 a FSR1H y 1 a FSR2H(borrow)
                BRA     No_Cero
                DECF    FSR1H,f,0
                DECF    FSR2H,f,0
No_Cero         MOVLW   .64
                SUBWF   FSR1L,f,0              ;Se restan 64 posiciones a FSR1L
                SUBWF   FSR2L,f,0              ;Se restan 64 posiciones a FSR2L
                RETFIE  1                      ;y retorna de la interrupción y repone W, STATUS y BSR

;------------------------------------------------------------
;               Interrupción por TMR0
;------------------------------------------------------------


TMR0_Isr        BTG     Sinc                   ;Invierte la señal de Sincronismo
                BCF     INTCON,TMR0IF,0        ;Baja la bandera de la interrupción por TMR0
                TBLRD*+                        ;Lee la parte alta del TMR0
                MOVF    TABLAT,W,0
                MOVWF   Flags,0                ;El nible alto son banderas
                IORLW   0xF0                   ;Lo corrige para cargarlo en el Byte alto de TMR0
                MOVWF   TMR0H,0
                TBLRD*+                        ;Lee el byte bajo de TMR0
                MOVFF   TABLAT,TMR0L
                BTFSS   Flags,7,0              ;Verifica si esta línea tiene imagen
                BSF     T1CON,TMR1ON,0         ;activa el timer 1
                BTFSC   Flags,6,0              ;controla si llegó al final del campo
                RETFIE  1
                LFSR    1,0x100                ;inicializa los punteros de la ram
                LFSR    2,0x300
                CLRF    Contador_Pag,0         ;inicializa el contador de páginas
                BTFSS   TBLPTRH,3,0            ;Controla si llegó al final de toda la tabla
                RETFIE  1                      ;Retorna de la interrupción y repone W, STATUS y BSR
                MOVLW   0x40                   ;coloca el puntero en la primer posición de la tabla
                MOVWF   TBLPTRH,0              ;0x4000
                CLRF    TBLPTRL,0
                RETFIE  1                      ;Retorna de la interrupción y repone W, STATUS y BSR

                     


;------------------------------------------------------------
;                      programa principal
;------------------------------------------------------------

Programa        CLRF    TRISA,0                ;configura todos los puertos
                MOVLW   b'00111111'            ;pines B6 y B7 no usados (solo ICSP)
                MOVWF   TRISB,0
                MOVLW   b'00001000'            ;pines C3 como entrada (INV) y C4 como salida (Busy)
                MOVWF   TRISC,0
                SETF    TRISD,0                ;Puerto D como entrada de Datos
                CLRF    TRISE,0                ;Puerto E con la señal de Video
                CLRF    LATE,0                 ;Pone a cero el puerto E de 3 pines
                MOVLW   0x07                   ;Configura los puertos
                MOVWF   ADCON1,0               ;como E/S digitales
                BSF     Sinc                   ;Pone en alto la salida de sincronismo
                BCF     Busy
                LFSR    0,0x100                ;Carga el selector de registros 0 con el valor 0X100
                LFSR    1,0x100                ;Carga el selector de registros 1 con el valor 0X100 (sector de memoria de CS1)
                LFSR    2,0x300                ;Carga el selector de registros 2 con el valor 0x300 (sector de memoria de CS2)

                CLRF    X1,0                   ;pone a cero todos los registros  de eje X y Y de CS1 y CS2
                CLRF    Y1,0
                CLRF    X2,0
                CLRF    Y2,0
                BSF     T1CON,RD16,0           ;habilita la lectura o escritura simultánea de ambos bytes del TMR1
                SETF    TMR1H,0                ;carga los valores en el TMR1
                MOVLW   .165
                MOVWF   TMR1L,0
                CLRF    Contador_Pag,0         ;inicializa el Contador de páginas o líneas del GLCD

Limpia_Ram      SETF    Dato_Ram,0             ;pone el fondo claro
                BTFSS   INV                    ;dependiendo del pin de inversión de video
                CLRF    Dato_Ram,0             ;pone el fondo oscuro
                                               ;el siguiente bucle borra toda la ram de pantalla
                
                MOVLW   .64                    ;64 bits de alto
                MOVWF   Contador2,0
Bucle_Ext       MOVLW   .16                    ;16 Bytes de ancho (128 bits)
                MOVWF   Contador,0
Bucle_Int       MOVFF   Dato_Ram,POSTINC0      ;Carga el Dato al registro apuntado por fsr0 e incrementa el puntero
                DECFSZ  Contador,f,0           ;Decrementa el Contador, si es cero termina el bucle interno
                BRA     Bucle_Int
                DECFSZ  Contador2,f,0          ;Decrementa el Contador2, si es cero termina el bucle externo
                BRA     Bucle_Ext


                SETF    TMR0H,0                ;Primero se debe cargar TMR0H que es un buffer
                CLRF    TMR0L,0                ;y se actualiza con la escritura de TMR0L
                MOVLW   b'11100000'            ;Activa la interrupción por TMR0
                MOVWF   INTCON,0
                BSF     INTCON2,TMR0IP,0       ;activa la prioridad de la int de TMR0
                BSF     PIE1,TMR1IE,0          ;habilita la interrupción por TMR1
                BCF     IPR1,TMR1IP,0          ;baja prioridad para la int de TMR1
                BSF     RCON,IPEN,0            ;habilita las prioridades
                MOVLW   b'10001000'            ;Habilita TMR0 sin preescalado
                MOVWF   T0CON,0                ;Origen de la señal de reloj de TMR0 = reloj interno
                CLRF    LATE,0                 ;Pone a cero la señal de video
                BCF     Busy                   ;le avisa al micro principal que está listo


Bucle_Princ     BTFSS   E_enab                 ;Si no se solicita (verifica el pin de ENABLE)
                BRA     Bucle_Princ            ;queda en este bucle
                BSF     Busy                   ;Pone en alto el pin de Busy
                BTFSS   DI                     ;verifica el pin DI 1=Dato, 0=instrucción
                BRA     Instruccion            ;salta a la rutina de instrucción



;Calcula FSR0 para saber en que parte de la ram debe leer o escribir el Dato
Dato           MOVFF    X1,X                   ;carga el vector X1 de CS1 en el registro X (página o línea va de 0 a 7)
               MOVFF    Y1,Y                   ;carga el vector Y1 de CS1 en el registro Y (Nº de byte de cada página va de 0 a 63)
               BTFSC    CS_2                   ;si está seleccionado CS2
               MOVFF    X2,X                   ;carga el vector X2 de CS2 en el registro X
               BTFSC    CS_2                   ;si está seleccionado CS2
               MOVFF    Y2,Y                   ;carga el vector Y2 de CS2 en el registro Y
               MOVLW    .64                    ;carga Wreg con el decimal 64
               MULWF    X,0                    ;multiplica Wreg por X
               MOVF     PRODL,w,0              ;el byte bajo del resultado se carga en Wreg
               ADDWF    Y,w,0                  ;luego suma Y con Wreg
               MOVWF    FSR0L,0                ;y lo carga en el byte bajo del puntero FSR0
               MOVFF    PRODH,FSR0H            ;el byte alto de la multiplicación lo carga en el byte alto del puntero FSR0
               MOVLW    .1                     ;si el Dato corresponde a CS1 le suma 0X100 al puntero (osea 1 en el byte alto de FSR0)
               BTFSS    CS_1
               MOVLW    .3                     ;si el Dato corresponde a CS2 le suma 0x300 al puntero (osea 3 en el byte alto de FSR0)
               ADDWF    FSR0H,f,0              ;esto es porque CS1 va de 0X100 a 0X2FF y CS2 va de 0x300 a 0x4FF en la RAM del micro


;Verifica si se están rotando estos bytes en la RAM (misma página)

Verificacion   MOVF     Contador_Pag,w,0       ;Contador_Pag es el puntero de página de salida de video (cuenta de 0 a 7)
               XORWF    X,w,0                  ;X es el puntero de página de gestión de Datos (cuenta de 0 a 7)
               BTFSC    STATUS,Z,0             ;si están apuntando a la misma página no se puede leer o escribir la ram
               BRA      Verificacion           ;ya que esos bytes están siendo rotados,
                                               ;por lo tanto seguirá esperando hasta que dicha comparación dé distinta de 0.


Mueve_Dato     BTFSS    RW                     ;verifica si el micro principal quiere leer o escribir un Dato
               BRA      Guarda_Dato            ;si es escritura salta a guarda Dato

Saca_Dato      CLRF     TRISD,0                ;Si RW está en 1 puerto D como salidas
               MOVF     INDF0,w,0              ;lee el Dato de la ram mediante el puntero FSR0
               BTFSC    INV                    ;si el pin INV (video invertido) está en uno
               COMF     INDF0,w,0              ;invierte el Dato y lo guarda en Wreg
               MOVWF    PORTD,0                ;saca el Dato de Wreg en el puerto D
               BRA      Incrementa_Y           ;luego debe incrementar el puntero de byte

Guarda_Dato    SETF     TRISD,0                ;pone el puerto D como entrada
               MOVFF    PORTD,INDF0            ;mueve el Dato del puerto D a la RAM (registro apuntado por FSR0)
               BTFSC    INV                    ;si el pin INV (video invertido) está en uno
               COMF     INDF0,f,0              ;invierte el Dato guardado en la RAM
               
               

Incrementa_Y   INCF     Y,f,0                  ;incrementa Y
               BTFSC    Y,6,0                  ;si el bit 6=1 es porque Y > 63
               CLRF     Y,0                    ;y debe volver a cero
               BTFSC    CS_1                   ;si está seleccionado CS1
               MOVFF    Y,Y1                   ;guarda Y en el vector Y1
               BTFSC    CS_2                   ;si está seleccionado CS2
               MOVFF    Y,Y2                   ;guarda Y en el vector Y2
               BRA      Salida_GLCD            ;sale de la rutina


Instruccion    BTFSC    RW                     ;verifica si el micro principal desea escribir una instrucción
               BRA      Leer_Estado            ;o leer el byte de estado del GLCD
               MOVF     PORTD,w,0              ;guarda la instrucción enviada por el micro principal (puerto D) en Wreg
               ANDLW    b'11000000'            ;filtra los 2 bits más significativos
               BTFSC    STATUS,Z,0             ;si ambos bits son ceros
               BRA      On_Off                 ;es porque se desea  encender o apagar la pantalla
               BTFSS    PORTD,7,0              ;si el bit 7 es cero
               BRA      Eje_Y                  ;es porque se desea escribir el valor del eje Y
               BTFSS    PORTD,6,0              ;si el bit 6 es cero
               BRA      Eje_X                  ;es porque se desea escribir el valor del eje X


Eje_Z          ;no implementado                ;si ambos bits están en alto es porque se desea escribir el valor del eje Z
               BRA      Salida_GLCD            


Leer_Estado    ;no implementado
               BRA      Salida_GLCD            



On_Off         BTFSS    PORTD,0,0              ;verifica el estado del bit menos sigmificativo (bit 0)
               BRA      Espera_Off             ;si está en cero deberá apagar
               BSF      T0CON,TMR0ON,0         ;si está en uno enciende el GlCD (activa el TMR0)
               BRA      Salida_GLCD            ;sale de la rutina

Espera_Off     MOVLW    .61                    ;el micro muestra la imagen entre las líneas 62 y 190
               CPFSGT   Contador,0             ;por lo tanto verifica el Contador de líneas Horizontales
               BRA      Apaga_GLCD             ;para que no lo apague hasta que termine de dibujar.
               MOVLW    .191                   ;De esta forma nos aseguramos que no quedan bytes rotados
               CPFSLT   Contador,0
               BRA      Apaga_GLCD             ;salta a la rutina de apagado
               BRA      Espera_Off             ;repite hasta que salga

               
Apaga_GLCD     BCF      T0CON,TMR0ON,0         ;apaga el TMR0 por lo tanto no se vé nada en pantalla
               BRA      Salida_GLCD            ;sale de la rutina

Eje_Y          MOVF     PORTD,w,0              ;mueve el puerto D (con el valor de Y) a Wreg
               ANDLW    b'00111111'            ;filtra el valor
               BTFSC    CS_1                   ;si está seleccionado CS1
               MOVWF    Y1,0                   ;carga el valor en Y1
               BTFSC    CS_2                   ;si está seleccionado CS2
               MOVWF    Y2,0                   ;carga el valor en Y2
               BRA      Salida_GLCD            ;sale de la rutina
               
Eje_X          MOVF     PORTD,w,0              ;mueve el puerto D (con el valor de X) a Wreg
               ANDLW    b'00000111'            ;filtra el valor
               BTFSC    CS_1                   ;si está seleccionado CS1
               MOVWF    X1,0                   ;carga el valor en X1
               BTFSC    CS_2                   ;si está seleccionado CS2
               MOVWF    X2,0                   ;carga el valor en X2


Salida_GLCD    BTFSC    E_enab                 ;verifica que el micro principal ponga en bajo ENABLE
               BRA      Salida_GLCD            ;hasta que lo haga repite lo dos pasos anteriores
               BCF      Busy                   ;le indica al micro principal que terminó la rutina
               BRA      Bucle_Princ            ;finalmente sale de la rutina

;-----------------------------------------------------------------------------------------------------------------------------------------------------
;  Base de Datos con los tiempos de sincronismo a cargar en el TMR0: Se carga el primer byte en TMR0H y el que sigue en TMR0L y así sucesivamente.   ;
;  Como el valor del nible alto de TMR0H es siempre 0xF, se aprovecha este nible para guardar las banderas que le indican al micro ciertos momentos, ;
; como por ejemplo: cuando esta tabla llegó al final, cuando se debe activar el TMR1 para la salida de video, cuando se deben rotar los bytes de la  ;
; imagen de video, y cuando se deben recargar los valores de FSR1 y FSR2.                                                                            ;
; Cabe aclarar que estas banderas son activas por bajo, y que además el valor a cargar en el nible alto de TMR0H se corrige siempre a 0xF.                     ;
;                                                                                                                                                    ;
;                   TABLAT                                                                                                                           ;
;         ____________^____________                                                                                                                  ;
;        /                         \                                                                                                                 ;
;         NIBLE ALTO  -  NIBLE BAJO                                                                                                                  ;
;        _____^_____     _____^_____                                                                                                                 ;
;       /           \   /           \                                                                                                                ;
;       0 - 0 - 0 - 0 - X - X - X - X                                                                                                                ;
;       |   |   |   |   \_____ _____/                                                                                                                ;
;       |   |   |   |         y                                                                                                                      ;
;       |   |   |   |         |_____A TMR0H                                                                                                          ;
;       |   |   |   |                                                                                                                                ;
;       |   |   |   |                                                                                                                                ;                                                                                                                                
;       |   |   |   |_______________B4: 0- Restar 64 posiciones a FSR1 Y FSR2 para seguir rotando los mismos bytes.                                  ;
;       |   |   |                       1- Incrementar el contador de páginas.                                                                       ;
;       |   |   |                                                                                                                                    ;
;       |   |   |___________________B5: 0- 2º línea de video, debe sacar el dato de video y rotar el byte.                                         ;
;       |   |                           1- 1º línea de video, debe sacar el dato de video sin rotar el byte.                                       ;
;       |   |                                                                                                                                        ;
;       |   |_______________________B6: 0- Indica que la tabla llegó a su fin, recargar el TBLPTR si es el campo par (TBLPTRH = 0x40, TBLPTRL =0x00) ;
;       |                                  También FSR1 = 0x100, FSR2 = 0x300, contador = 0 en ambos campos.                                         ;
;       |                                                                                                                                            ;
;       |___________________________B7: 0- En esta línea se debe activar el TMR1, para la salida de imagen                                           ;
;                                       1- Línea de sincronismo sin salida de video.                                                                 ;
;                                                                                                                                                    ;
;----------------------------------------------------------------------------------------------------------------------------------------------------;


                ORG     0x4000

                DB      t023us0, t295us0, t023us0, t295us0, t023us0, t295us0
                DB      t023us0, t295us0, t023us0, t295us0, t023us0, t295us0   ;Pre ecualización 1ºCampo
                DB      t271us0, t047us0, t271us0, t047us0, t271us0, t047us0
                DB      t271us0, t047us0, t271us0, t047us0, t271us0, t047us0   ;Sincro vertical 1ºCampo
                DB      t023us0, t295us0, t023us0, t295us0, t023us0, t295us0
                DB      t023us0, t295us0, t023us0, t295us0, t023us0, t295us0   ;Post ecualización 1ºCampo


                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0                     ;62 líneas horizontales sin video


                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3

                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3

                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3

                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3

                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3

                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3

                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3

                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3                     ;128 líneas horizontales con video


                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;63 líneas horizontales sin video
                DB      t047us0, t270us0                                       ;y media línea sin video

                
                
                DB      t023us0, t295us0, t023us0, t295us0, t023us0, t295us0
                DB      t023us0, t295us0, t023us0, t295us0, t023us0, t295us0   ;Pre ecualización 2ºCampo
                DB      t271us0, t047us0, t271us0, t047us0, t271us0, t047us0
                DB      t271us0, t047us0, t271us0, t047us0, t271us0, t047us0   ;Sincro Vertical 2ºCampo
                DB      t023us0, t295us0, t023us0, t295us0, t023us0, t295us0
                DB      t023us0, t295us0, t023us0, t295us0, t023us0, t613us0   ;Post ecualización 2ºCampo

                
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0                           ;62 líneas horizontales sin video


                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3
                
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3
                
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3
                
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3
                
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3
                
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3
                
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3
                
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us2
                DB      t047us0, t589us1, t047us0, t589us3                           ;128 líneas horizontales con video


                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0   ;
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us0
                DB      t047us0, t589us0, t047us0, t589us0, t047us0, t589us4   ;63 líneas horizontales sin video y recarga de TBLPTR


                END

