Erratic Clock

I dismantled a cheap quartz clock and took control of its solenoid with quite a surreal effect. It has an erratic second hand, but the hour and minute hands keep good time. I had a little trouble with inductive kick, but I think it's functioning correctly now (currently in final stages of hardware testing).
 
; Clock nobble hardware test (c) R Geleit February 2009
; Version 0.1
; Clock that has an erratic second hand, but the hour and minute hands keep good time.
; PIC16F84A
; Crystal frequency 3.2768MHz

    list      p=16F84A             ; list directive to define processor
    #include <p16F84A.inc>          ; processor specific variable definitions

    __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC

    RADIX dec

;***** VARIABLE DEFINITIONS

mark32  equ        0x0C            ; postscaler = 1/100 sec
hundths equ        0x0D
secs    equ        0x0E
mins    equ        0x0F
hours   equ        0x10

flags   equ        0x11
ticking equ        0               ; tick/tock in progress (bit)

tickno  equ        0x13            ; current beep in list
buztick equ        0x14            ; 1/100 sec postscaler for beep timing
newtick equ        0x15            ; time for new tick?
ttline  equ        0x16            ; 4 or 8 (RA2 or RA3)
tikstop equ        0x17            ; 60mS after tick start 0x17

mark50  equ        0x18            ; to wait half a second

;**********************************************************************
        ORG     0x000              ; processor reset vector

        goto    start
        
init    clrf    PORTA              ; reset in/out
        clrf    PORTB              ;

        bsf     STATUS,5           ; select bank 1

        movlw   0                  ; All output. RA2 RA3 are solenoid
        movwf   TRISA

        movlw   8                  ; RB3 = button
        movwf   TRISB

        movlw   7+128              ; external timer, max prescale 00000111 (7) +no weak pullups
        movwf   OPTION_REG

        bcf     STATUS,5           ; select bank 0
        clrf    INTCON             ; no interrupts

        retlw   0

start   call    init

        movlw   4                  ; tick
        movwf   ttline

        movlw   0
        movwf   tickno
        movwf   newtick

        bcf     flags,ticking

swait   movlw   128                ; stabilise for button
        subwf   TMR0,W
        btfss   STATUS,Z
        goto    swait

bwait   btfss   PORTB,3            ; wait 'till button pressed
        goto    bwait 

    movlw    23
    movwf    hours
    movlw    59
    movwf    mins
    movlw    30
    movwf    secs

mloop   call    time               ; update file regs with current time
        call    ttover             ; time to terminate a ticktock?
        call    nextick            ; time for a ticktock?

        goto    mloop

time    movfw   mark32             ; update clock registers
        subwf   TMR0,W
        btfss   STATUS,Z           ; 32 ticks of TMR0?
        return
        
        movlw   32                 ; reset postscaler
        addwf   mark32,F
        
        incf    hundths,F
        incf    buztick,F
    
        movlw   100
        subwf   hundths,W
        btfss   STATUS,Z           ; 100 hundredths of a second?
        return
        
        clrf    hundths
;    call tiktok        
        incf    secs,F             ; then increase seconds
        movlw   60
        subwf   secs,W
        btfss   STATUS,Z           ; 60 seconds?
        return
        
        clrf    secs
        
        incf    mins,F             ; then increase minutes
        movlw   60
        subwf   mins,W
        btfss   STATUS,Z           ; 60 minutes?
        return
        
        clrf    mins
        
        incf    hours,F            ; then increase hours
        movlw   24
        subwf   hours,W
        btfss   STATUS,Z           ; 24 hours?
        return
        
        clrf    hours              ; then midnight

    ;    movlw    226              ; -30 seconds adjusts xtal default
    ;    movwf    secs
        
    call    nobble

        return

nextick movfw   newtick            ; time for ticktock?
        subwf   buztick,W
        btfss   STATUS,Z
        return

        incf    tickno             ; set next ticktock

        movfw   tickno
        andlw   127                ; 128 ticks in list
        movwf   tickno

        call    nextt
        addwf   buztick,W
        movwf   newtick

        call    tiktok
        return

nextt   movfw    tickno
        addwf    PCL,F

 retlw 69
 retlw 45
 retlw 87
 retlw 221
 retlw 30
 retlw 96
 retlw 153
 retlw 57
 retlw 255
 retlw 58
 retlw 255
 retlw 89
 retlw 91
 retlw 92
 retlw 31
 retlw 255
 retlw 93
 retlw 255
 retlw 64
 retlw 41
 retlw 28
 retlw 25
 retlw 54
 retlw 84
 retlw 82
 retlw 25
 retlw 98
 retlw 52
 retlw 45
 retlw 125
 retlw 46
 retlw 255
 retlw 36
 retlw 45
 retlw 83
 retlw 255
 retlw 56
 retlw 25
 retlw 25
 retlw 215
 retlw 68
 retlw 88
 retlw 70
 retlw 95
 retlw 223
 retlw 54
 retlw 43
 retlw 25
 retlw 187
 retlw 231
 retlw 85
 retlw 87
 retlw 74
 retlw 75
 retlw 53
 retlw 191
 retlw 43
 retlw 60
 retlw 25
 retlw 189
 retlw 71
 retlw 255
 retlw 48
 retlw 95
 retlw 80
 retlw 36
 retlw 94
 retlw 223
 retlw 47
 retlw 41
 retlw 167
 retlw 75
 retlw 55
 retlw 89
 retlw 25
 retlw 180
 retlw 82
 retlw 255
 retlw 32
 retlw 255
 retlw 38
 retlw 40
 retlw 25
 retlw 64
 retlw 122
 retlw 25
 retlw 101
 retlw 143
 retlw 208
 retlw 25
 retlw 94
 retlw 71
 retlw 81
 retlw 131
 retlw 99
 retlw 152
 retlw 78
 retlw 190
 retlw 57
 retlw 45
 retlw 175
 retlw 255
 retlw 66
 retlw 26
 retlw 38
 retlw 28
 retlw 203
 retlw 64
 retlw 68
 retlw 25
 retlw 119
 retlw 255
 retlw 74
 retlw 26
 retlw 74
 retlw 50
 retlw 241
 retlw 68
 retlw 25
 retlw 83
 retlw 255
 retlw 78
 retlw 95
 retlw 255
 retlw 61
 retlw 41
 retlw 65
 retlw 31

nobble
    call    wait50
    call    flip
    call    wait8
    call    flop
    call    wait50
    call    flip
    call    wait8
    call    flop
    call    wait50
    call    flip
    call    wait8
    call    flop
    call    wait50
    call    flip
    call    wait8
    call    flop
    call    wait50
    call    flip
    call    wait8
    call    flop
    call    wait50
    call    flip
    call    wait8
    call    flop
    call    wait50
    call    flip
    call    wait8
    call    flop
    call    wait50
    call    flip
    call    wait8
    call    flop
    call    wait50
    call    flip
    call    wait8
    call    flop
    return

wait50  movlw   50
        movwf   mark50

wait32  movfw   mark32
        subwf   TMR0,W
        btfss   STATUS,Z
        goto    wait32

        movlw   32                 ; reset postscaler
        addwf   mark32,F

        decfsz  mark50
        goto    wait32

        return

wait8   movlw   8
        movwf   mark50

wait328 movfw   mark32
        subwf   TMR0,W
        btfss   STATUS,Z
        goto    wait32

        movlw   32                 ; reset postscaler
        addwf   mark32,F

        decfsz  mark50
        goto    wait328

        return    

flip    movfw   ttline             ; swap output lines
        xorlw   0x0C
        movwf   ttline

        movwf   PORTA

        return

flop    clrf    PORTA
        return    

tiktok  movfw   ttline             ; swap output lines
        xorlw   0x0C
        movwf   ttline

        movwf   PORTA              ; start tick/tock

        bsf     flags,ticking

        movfw   buztick            ; set end of tick/tock
        addlw   8                  ; 80mS
        movwf   tikstop

        return

ttover  btfss   flags,ticking      ; tick/tock in progress?
        return

        movfw   tikstop            ; tick/tock ended?
        subwf   buztick,W
        btfss   STATUS,Z
        return

        clrf    PORTA              ; end tick/tock
        bcf     flags,ticking

        return
end