;  PIC 16C84 compiler [V1.00 18 September 1999]
;  Source file - C:\uP\PICcompiler\dimmer2.psf
;  File compiled - Thursday 9/14/00 4:34:23 PM
;
;                     16C84
;         ONOFF  1  | i   i | 18  KEYDOWN     
;    ZERODETECT  2  | i   i | 17  KEYUP       
;      FEEDBACK  3  | i   i | 16  osc2        
;          mclr  4  | i   i | 15  osc1        
;           Vss  5  | p   p | 14  Vdd         
;           RB0  6  | i   o | 13  OUTON       
;       OUTPULS  7  | o   o | 12  OUTUP       
;           RB2  8  | i   o | 11  OUTDOWN     
;           RB3  9  | i   i | 10  RB4         
;
;  PIC clock frequency = 4000 kHz
;
;  No compiler errors.

_PCL	EQU H'02'
_STATUS	EQU H'03'
_C	EQU H'00'
_Z	EQU H'02'
_RP0	EQU H'05'
PORTA	EQU H'05'
PORTB	EQU H'06'
_EEDATA	EQU H'08'
_EEADR	EQU H'09'
_PCLATH	EQU H'0A'
_INTCON	EQU H'0B'
IRQ_ENABLE	EQU H'07'
_EECON1	EQU H'08'
_EECON2	EQU H'09'
_RD	EQU H'00'
_WR	EQU H'01'
_WREN	EQU H'02'
_STACK0	EQU H'0C'
_STACK1	EQU H'0D'
_STACK2	EQU H'0E'
_STACK3	EQU H'0F'
_STACK4	EQU H'10'
_STACK5	EQU H'11'
_STACK6	EQU H'12'
_STACK7	EQU H'13'
_STACK8	EQU H'14'
_STACK9	EQU H'15'
X	EQU H'16'
Y	EQU H'17'
YH	EQU H'18'
ON	EQU H'19'
RESO	EQU H'1A'
RESOH	EQU H'1B'
RESK	EQU H'1C'
RESKH	EQU H'1D'
KEYUP	EQU H'00'
KEYDOWN	EQU H'01'
ONOFF	EQU H'02'
ZERODETECT	EQU H'03'
FEEDBACK	EQU H'04'
OUTON	EQU H'07'
OUTUP	EQU H'06'
OUTDOWN	EQU H'05'
OUTPULS	EQU H'01'

	ORG 0

	goto MAIN

; Dimmer
; Paul Goossens

 list p=16F84
; #FUSE CP_OFF + PWRTE_ON + WDT_OFF + XT_OSC
	__config H'3FF9'

; var x : byte;	x geeft aan hoelang de puls vertraagd wordt na de zerodetectie
; var y : word;   y is een kopie van x, gebruikt in de lus van de vertraging
; var on : byte;
; var reso : word; geeft de resolutie van de vertraging aan
; var resk : word; kopie van res.


; PROCEDURE(MAIN)
MAIN
; alias(RA0,keyup);
; alias(RA1,keydown);
; alias(RA2,onoff);
; alias(RA3,zerodetect);
; alias(RA4,feedback);
; alias(RB7,outon);
; alias(RB6,outup);
; alias(RB5,outdown);
; alias(RB1,outpuls);
; output(outon);
	BSF	_STATUS,_RP0
	BCF	PORTB,OUTON
; output(outpuls);
	BCF	PORTB,OUTPULS
; output(outup);
	BCF	PORTB,OUTUP
; output(outdown);
	BCF	PORTB,OUTDOWN

; clr(outon);
	BCF	_STATUS,_RP0
	BCF	PORTB,OUTON
; clr(outpuls);
	BCF	PORTB,OUTPULS
; clr(on);	standaard uit;
	CLRF	ON
; clr(x);	        dimmer vol open;
	CLRF	X
; reso := 20;
	MOVLW	H'14'
	MOVWF	_STACK0
	MOVLW	H'00'
	MOVWF	_STACK1
	MOVF	_STACK0,W
	MOVWF	RESO
	MOVF	_STACK1,W
	MOVWF	RESOH

; while true
_WHILE0
;   if (keyup = 1)
_IF1
	BTFSS	PORTA,KEYUP
	GOTO	_ELSE1
;   begin 
;     outup=1;
	BSF	PORTB,OUTUP
;     outdown=0;
	BCF	PORTB,OUTDOWN
;     if x>=1 then
_IF2
	MOVF	X,W
	MOVWF	_STACK0
	MOVLW	H'01'
	SUBWF	_STACK0,W
	CLRW
	BTFSC	_STATUS,_C
	ADDLW	H'FF'
	BTFSC	_STATUS,_Z
	GOTO	_ELSE2
;     begin
;       x:=x-1;
	MOVF	X,W
	MOVWF	_STACK0
	MOVLW	H'01'
	SUBWF	_STACK0,W
	MOVWF	X
;     end
;   end
_ELSE2
;   if (keydown = 1)
_ELSE1
_IF3
	BTFSS	PORTA,KEYDOWN
	GOTO	_ELSE3
;   begin
;     outdown=1;
	BSF	PORTB,OUTDOWN
;     outup=0;
	BCF	PORTB,OUTUP
;     if x<=100 then
_IF4
	MOVF	X,W
	SUBLW	H'64'
	CLRW
	BTFSC	_STATUS,_C
	ADDLW	H'FF'
	BTFSC	_STATUS,_Z
	GOTO	_ELSE4
;     begin
;       x:=x+1;
	MOVF	X,W
	ADDLW	H'01'
	MOVWF	X
;     end
;   end
_ELSE4

;   if (onoff = 1) then
_ELSE3
_IF5
	BTFSS	PORTA,ONOFF
	GOTO	_ELSE5
;   begin
;     on:= 1 - on;   Toggle bits.
	MOVLW	H'01'
	MOVWF	_STACK0
	MOVF	ON,W
	SUBWF	_STACK0,W
	MOVWF	ON
;     outon:=on;
	MOVF	ON,W
	BTFSS	_STATUS,_Z
	BSF	PORTB,OUTON
	BTFSC	_STATUS,_Z
	BCF	PORTB,OUTON
;     while (onoff =1)
_WHILE6
	BTFSS	PORTA,ONOFF
	GOTO	_LOOP6
;       y=100
	MOVLW	H'64'
	MOVWF	_STACK0
	MOVLW	H'00'
	MOVWF	_STACK1
	MOVF	_STACK0,W
	MOVWF	Y
	MOVF	_STACK1,W
	MOVWF	YH
;       while (y>0)
_WHILE7
	MOVF	Y,W
	MOVWF	_STACK0
	MOVF	YH,W
	MOVWF	_STACK1
	MOVLW	H'00'
	MOVWF	_STACK2
	MOVLW	H'00'
	MOVWF	_STACK3
	CALL	_GREAT16
	BTFSC	_STATUS,_Z
	GOTO	_LOOP7
;         y:=y-1;
	MOVF	Y,W
	MOVWF	_STACK0
	MOVF	YH,W
	MOVWF	_STACK1
	MOVLW	H'01'
	SUBWF	_STACK0,F
	BTFSS	_STATUS,_C
	DECF	_STACK1,F
	MOVLW	H'00'
	SUBWF	_STACK1,F
	MOVF	_STACK0,W
	MOVWF	Y
	MOVF	_STACK1,W
	MOVWF	YH
;       loop   
	GOTO	_WHILE7
_LOOP7
;     loop
	GOTO	_WHILE6
_LOOP6
;   end
;   
;   while (zerodetect = 0)
_ELSE5
_WHILE8
	BTFSC	PORTA,ZERODETECT
	GOTO	_LOOP8
;   loop
	GOTO	_WHILE8
_LOOP8
;   
;
;   TEST TEST TESTING......
;



;   y :=(x*2);
	MOVF	X,W
	MOVWF	_STACK0
	CLRF	_STACK1
	MOVLW	H'02'
	MOVWF	_STACK2
	MOVLW	H'00'
	MOVWF	_STACK3
	CALL	_MUL16
	MOVF	_STACK0,W
	MOVWF	Y
	MOVF	_STACK1,W
	MOVWF	YH
;   while (y>0) 
_WHILE9
	MOVF	Y,W
	MOVWF	_STACK0
	MOVF	YH,W
	MOVWF	_STACK1
	MOVLW	H'00'
	MOVWF	_STACK2
	MOVLW	H'00'
	MOVWF	_STACK3
	CALL	_GREAT16
	BTFSC	_STATUS,_Z
	GOTO	_LOOP9
;     y:=y-1;
	MOVF	Y,W
	MOVWF	_STACK0
	MOVF	YH,W
	MOVWF	_STACK1
	MOVLW	H'01'
	SUBWF	_STACK0,F
	BTFSS	_STATUS,_C
	DECF	_STACK1,F
	MOVLW	H'00'
	SUBWF	_STACK1,F
	MOVF	_STACK0,W
	MOVWF	Y
	MOVF	_STACK1,W
	MOVWF	YH
;   loop
	GOTO	_WHILE9
_LOOP9

;   outpuls=1 ;
	BSF	PORTB,OUTPULS
;   y:=30;
	MOVLW	H'1E'
	MOVWF	_STACK0
	MOVLW	H'00'
	MOVWF	_STACK1
	MOVF	_STACK0,W
	MOVWF	Y
	MOVF	_STACK1,W
	MOVWF	YH
;   while (y>0)
_WHILE10
	MOVF	Y,W
	MOVWF	_STACK0
	MOVF	YH,W
	MOVWF	_STACK1
	MOVLW	H'00'
	MOVWF	_STACK2
	MOVLW	H'00'
	MOVWF	_STACK3
	CALL	_GREAT16
	BTFSC	_STATUS,_Z
	GOTO	_LOOP10
;     y:=y-1;
	MOVF	Y,W
	MOVWF	_STACK0
	MOVF	YH,W
	MOVWF	_STACK1
	MOVLW	H'01'
	SUBWF	_STACK0,F
	BTFSS	_STATUS,_C
	DECF	_STACK1,F
	MOVLW	H'00'
	SUBWF	_STACK1,F
	MOVF	_STACK0,W
	MOVWF	Y
	MOVF	_STACK1,W
	MOVWF	YH
;   loop  
	GOTO	_WHILE10
_LOOP10
;   outpuls :=0;
	BCF	PORTB,OUTPULS

;   
; loop
	GOTO	_WHILE0
_LOOP0


	GOTO	MAIN
; 16 * 16 Multiply
_MUL16
	CLRF	_STACK4
	CLRF	_STACK5
_MUL161
	BCF	3,0
	RRF	_STACK1,f
	RRF	_STACK0,f
	BTFSS	3,0
	GOTO	_MUL162
	MOVF	_STACK2,w
	ADDWF	_STACK4,f
	BTFSC	3,0
	INCF	_STACK5,f
	MOVF	_STACK3,W
	ADDWF	_STACK5,f
	BCF 3,0
_MUL162
	RLF	_STACK2,f
	RLF	_STACK3,f
	MOVF	_STACK0,W
	IORWF	_STACK1,W
	BTFSS	3,2
	GOTO	_MUL161
	MOVF	_STACK4,W
	MOVWF	_STACK0
	MOVF	_STACK5,W
	MOVWF	_STACK1
	RETURN
; 16 bit Greater than
_GREAT16
	MOVF	_STACK1,W
	SUBWF	_STACK3,W
	BTFSS	3,2
	GOTO	_GREAT161
	MOVF	_STACK0,W
	SUBWF	_STACK2,W
_GREAT161
	BTFSS	3,0
	GOTO	_GREAT162
	CLRF	_STACK0
	CLRF	_STACK1
	RETURN
_GREAT162
	IORLW	H'FF'
	MOVWF	_STACK0
	MOVWF	_STACK1
	RETURN
	END

