The "other" project

This is my second PIC project. It's a robotic t-shirt! If you can't work out what it does, ask me for a demonstration.
 
; the 'other' project (c) Rob Geleit September 2007
; Version 1.1
; Comedy robotic t-shirt
; PIC16F676
; Crystal frequency 3.2768MHz

;**********************************************************************
 
    list      p=16f676             ; list directive to define processor
    #include <p16F676.inc>         ; processor specific variable definitions

    errorlevel  -302               ; suppress message 302 from list file

    __CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC 

; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See data sheet for additional information on configuration word settings.

    RADIX dec


;***** VARIABLE DEFINITIONS
w_temp         EQU     0x20        ; variable used for context saving 
status_temp    EQU     0x21        ; variable used for context saving

pscale1        EQU     0x22
pscale2        EQU     0x23

position       EQU     0x24
posnstore      EQU     0x25
flags          EQU     0x26

_st            EQU     20
_en            EQU     252
_md            EQU     219

;**********************************************************************
        ORG     0x000              ; processor reset vector
        goto    start              ; go to beginning of program
      
      
        ORG     0x004              ; interrupt vector location
         
        bcf     PORTC,5            ; interrupt routine for single servo
        bcf     INTCON,T0IF        ; clear T0 interrupt
        retfie
        
;        movwf   w_temp            ; interrupt routine for multiple servos
;        movf    STATUS,w
;        movwf   status_temp
;     
;        clrf    PORTC
;     
;        movf    status_temp,w
;        movwf   STATUS
;        swapf   w_temp,f
;        swapf   w_temp,w
;        retfie


start   call    init

loop    ;bsf        ADCON0,1       ; start conversion
       
        bcf     INTCON,GIE         ; stop interrupts
        bsf     PORTC,5            ; start 5V -> Servo ctrl
       
        movlw   0                  ; wait for 1.696ms
        movwf   TMR1L
wait17  movlw   150
        subwf   TMR1L,W
        btfss   STATUS,Z
        goto    wait17
     
        btfsc   PORTC,0
        goto    special
        
        btfss   flags,0
        goto    cont
        movfw   posnstore
        movwf   position  

cont    btfsc   PORTA,2
        incf    position,F
        btfsc   PORTC,2
        decf    position,F
        bcf     flags,0
       
        movfw   position
        sublw   _st
        btfsc   STATUS,Z
        incf    position
       
        movfw   position
        sublw   _en
        btfsc   STATUS,Z
        decf    position

rntr    movfw   position           ; move position reg to TMR0
        movwf   TMR0
       
        movlw   160                ; enable interrupts
        movwf   INTCON
       
        movlw   0                  ; wait 18ms
        movwf   TMR1L              ; PORTC,0 will be cleared by interrupt
        movwf   TMR1H              ; during this time
wait18  movlw   9
        subwf   TMR1H,W
        btfss   STATUS,Z
        goto    wait18
        
        goto    loop

special btfsc   flags,0
        goto    alrdy
        movfw   position
        movwf   posnstore
        bsf     flags,0
        movlw   _md
        movwf   position

alrdy   incf    position
        incf    position
        incf    position
        movfw   position
        sublw   _en
        btfss   STATUS,Z
        goto    rntr
        movlw   _md
        movwf   position
        goto    rntr

init    bcf     STATUS,RP0         ; bank 0

        clrf    PORTA              ; reset io
        clrf    PORTC
        
        movlw   7                  ; disable comparator
        movwf   CMCON
        
        movlw   32                 ; disable interrupts, enable TMR0 interrupt
        movwf   INTCON

        movlw   0                  ; ADC off (left justify and AD on =1)
        movwf   ADCON0

        movlw   49                 ; max prescale + turn on TMR1
        movwf   T1CON
        
        bsf     STATUS,RP0         ; bank 1
        
        movlw   4                  ; RA2 is input
        movwf   TRISA
        
        movlw   7                  ; RC0-2 are inputs
        movwf   TRISC
        
        movlw   0                  ; No ADC pins
        movwf   ANSEL
        
        movlw   96                 ; slow AtoD
        movwf   ADCON1
        
        movlw   1                  ; internal timer - 2x prescale (=0)
        movwf   OPTION_REG
        
        bcf     STATUS,RP0         ; bank 0
        
        bsf     PORTA,1            ; LED power (should have cut track!)

        movlw   _st
        movwf   position
        
        return

        END                       ; directive 'end of program'