                lxi sp,65535
                call IniciaPia
                call IniciaTimers
                call IniciaMotores
                call retardo1s
                call DaVueltas
                call retardo1s
                call retardo1s
inicio:
                jmp inicio
                in 1
                ani 00000011b   ;Solo interesan los dos bits menores.
                cpi 00000001b   ;Sensor izquierdo activo.
                cz obstaculoizq
                cpi 00000010b    ;Sensor derecho activo.
                cz obstaculoder
                jmp inicio
                hlt

obstaculoder:
                ;call PararAdelante
                ret
;----------------------------------------------------------------------------
obstaculoizq:
                ;call PararAdelante
                ret
;-----------------------------------------------------------------------------
GiroIzquierda:
                push psw
                pop psw
                ret
;-----------------------------------------------------------------------------
GiroDerecha:
                push psw
                pop psw
                ret
;-----------------------------------------------------------------------------
PararAdelante:
                push psw
                mvi a,0
                sta SentidoDer   ;Sentido hacia atr s.
                sta SentidoIzq
                mvi a,8
                sta VelocidadIzq
                sta VelocidadDer  ;M xima velocidad hacia atr s.
                call CargarMotores
                call retardo500ms
                mvi a,0           ;Para el motor.
                sta VelocidadDer
                sta VelocidadIzq
                call CargarMotores
                pop psw
                ret
;-----------------------------------------------------------------------------
PararAtras:
                push psw
                mvi a,1
                sta SentidoDer   ;Sentido hacia adelante.
                sta SentidoIzq
                mvi a,8
                sta VelocidadIzq
                sta VelocidadDer  ;M xima velocidad hacia atr s.
                call CargarMotores
                call retardo500ms
                mvi a,0           ;Para el motor.
                sta VelocidadDer
                sta VelocidadIzq
                call CargarMotores
                pop psw
                ret

;-----------------------------------------------------------------------------
DaVueltas:
                push psw
                mvi a,0
                sta SentidoDer
                mvi a,1
                sta SentidoIzq
                mvi a,8
                sta VelocidadDer
                sta VelocidadIzq
                call CargarMotores
                pop psw
                ret
;-----------------------------------------------------------------------------
ArrancaAdelante:
                push psw
                mvi a,1
                sta SentidoDer     ;Sentido de marcha hacia adelante.
                sta SentidoIzq
                mvi a,7
                sta VelocidadDer
                mvi a,5
                sta VelocidadIzq
                call CargarMotores
                pop psw
                ret
;-----------------------------------------------------------------------------
ArrancaAtras:
                push psw
                mvi a,0
                sta SentidoDer ;Sentido de marcha hacia atras.
                sta SentidoIzq
                mvi a,7
                sta VelocidadDer
                mvi a,7
                sta VelocidadIzq
                call CargarMotores
                pop psw
                ret
;-----------------------------------------------------------------------------
VelocidadIzq    .equ 32768
VelocidadDer    .equ 32769
SentidoIzq      .equ 32770
SentidoDer      .equ 32771
velocidad       .equ 32772
balance         .equ 32773
sentido         .equ 32774
byte            .equ 32775
;-----------------------------------------------------------------------------
IniciaTimers:
                mvi a,00111110b ;Timer 0
                out 7           ;Genera 8 khz del reloj del sistema.
                mvi a,10000000b
                out 4
                mvi a,00000001b   ;Divide los 3.072 Mhz por 384
                out 4
                mvi a,01010010b; Timer 1 en modo monoestable programable.
                out 7
                mvi a,0
                out 5    
                mvi a,10010010b; Timer 2 en modo monoestable programable.
                out 7
                mvi a,0
                out 6
                ret
;-----------------------------------------------------------------------------
IniciaPia:
        push psw
        mvi a,10000010b  ;Pa salida modo cero Pb entrada modo 0.
        out 3h           ;Pc baja salida, y Pc alta salida en modo cero.
        pop psw
        ret
;-----------------------------------------------------------------------------
retardo100us:
                push b
                mvi b,16
lazo100us:
                dcr b
                jnz lazo100us
                pop b
                ret
;-----------------------------------------------------------------------------
retardo500us:
                push b
                mvi b,105
lazo500us:
                dcr b
                jnz lazo500us
                pop b
                ret
;-----------------------------------------------------------------------------
retardo1ms:
                push b
                mvi b,218
lazo1ms:
                dcr b
                jnz lazo1ms
                pop b
                ret
;-----------------------------------------------------------------------------
retardo5ms:
                call retardo1ms
                call retardo1ms
                call retardo1ms
                call retardo1ms
                call retardo1ms
                ret
;-----------------------------------------------------------------------------
retardo10ms:
                call retardo5ms
                call retardo5ms
                ret
;-----------------------------------------------------------------------------
retardo20ms:
                call retardo10ms
                call retardo10ms
                ret
;-----------------------------------------------------------------------------
retardo100ms:
                call retardo20ms
                call retardo20ms
                call retardo20ms
                call retardo20ms
                call retardo20ms
                ret
;-----------------------------------------------------------------------------
retardo200ms:
                call retardo100ms
                call retardo100ms
                ret
;-----------------------------------------------------------------------------
retardo500ms:
                call retardo200ms
                call retardo200ms
                call retardo100ms
                ret
;-----------------------------------------------------------------------------
retardo1s:
                call retardo200ms
                call retardo200ms
                call retardo200ms
                call retardo200ms
                call retardo200ms
                ret
;-----------------------------------------------------------------------------
;Velocidad de 0-8
CargarMotorDerecho:
                push psw
                push b
                lda VelocidadDer
                cpi 9
                jnc fuera1
                cpi 8
                jz ocho
                cpi 0
                jnz cero
                mvi a,8
cero:

                mov b,a
                mvi a,8
                sub b    ; a = a - 8
                out 5
                in 0
                ani 11111110b
                out 0
                jmp fuera1
ocho:
                in 0           ;Es ocho pone a uno Pa0
                ori 00000001b
                out 0
fuera1:
                lda SentidoDer
                cpi 1
                cz  DerechoAdelante
                cpi 0
                cz DerechoAtras
                pop b
                pop psw
                ret
;-----------------------------------------------------------------------------
;Velocidad de 0-8
CargarMotorIzquierdo:
                push psw
                push b
                lda VelocidadIzq 
                cpi 9
                jnc fuera2
                cpi 8
                jz ocho1
                cpi 0
                jnz cero1
                mvi a,8
cero1:

                mov b,a
                mvi a,8
                sub b    ; a = a - 8
                out 6
                in 0
                ani 11111101b
                out 0
                jmp fuera2
ocho1:
                in 0           ;Es ocho pone a uno Pa1
                ori 00000010b
                out 0
fuera2:
                lda SentidoIzq
                cpi 1
                cz IzquierdoAdelante
                cpi 0
                cz IzquierdoAtras
                pop b
                pop psw
                ret
;-----------------------------------------------------------------------------
CargarMotores:
                call CargarMotorIzquierdo
                call CargarMotorDerecho
                ret
;-----------------------------------------------------------------------------
IzquierdoAdelante:
                push psw
                in 0
                ori 00001000b
                out 0
                pop psw
                ret
;-----------------------------------------------------------------------------
IzquierdoAtras:
                push psw
                in 0
                ani 11110111b
                out 0
                pop psw
                ret
;-----------------------------------------------------------------------------
DerechoAtras:
                push psw
                in 0
                ani 11111011b
                out 0
                pop psw
                ret
;-----------------------------------------------------------------------------
DerechoAdelante:
                push psw
                in 0
                ori 00000100b
                out 0
                pop psw
                ret
;-----------------------------------------------------------------------------
;Inicia los motores parados y sentido hacia adelante
IniciaMotores:
                push psw
                mvi a,0
                sta VelocidadDer
                sta VelocidadIzq
                sta velocidad
                mvi a,1
                sta SentidoIzq
                sta SentidoDer
                call CargarMotores
                pop psw
                ret
;-----------------------------------------------------------------------------
;sentido=1 Adelante  sentido=0 Atras
;Procesa la velocidad. Recibe el dato en el registro d      
ProcesaVelocidad:
                push psw
                push d
                lda byte
                ani 00001111b
                cpi 8
                jz igual8      ;salta a igual8 si es ocho
                jc menor8      ;si es menor salta a menor 8
                mvi d,8        ;sino es que es mayor de 8
                sub d
                sta velocidad
                mvi a,1
                sta sentido
                pop d
                pop psw
                ret
menor8:
                mov d,a
                mvi a,8
                sub d
                sta velocidad
                mvi a,0
                sta sentido
                pop d
                pop psw
                ret
igual8:
                mvi a,0
                sta velocidad
                mvi a,255
                sta sentido
                pop d
                pop psw
                ret

.end




