; Specify Device.
.include "i2c\8515def.inc"

;;; emacs for dos: toggle-buffer-file-coding-system

;**** Global Constants ****
.equ    PWM_PIN=  PINC    
.equ    PWM_DDR=  DDRC    
.equ    PWM_PORT=  PORTC    

.equ    LASER_PIN = PIND
.equ    LASER_DDR = DDRD
.equ    LASER_PORT=  PORTD    
	
.equ	LEDS_PIN  = PINB
.equ	LEDS_DDR  = DDRB
.equ	LEDS_PORT = PORTB

.EQU    PWM	=0
.EQU    VSWR	=1
.EQU    DIGFOR	=2
.EQU    DIGREFL	=3
.EQU    OVER_TEMP	=4
.EQU    LASER_STAT	=5
.EQU    ON_LED  =2
.EQU    PWM_OUT_LED  =3
.EQU    LASER_STAT_LED  =1


;*** Registers used  ****
   .def  time_high = r17        ; number of delays to execute
   .def  PWM_bad   = r24	; 
   .def  rgen1     = r25	; general register 1
   .def  rgen2     = r26	; general register 2

;
; Code segment start
;
.CSEG

	rjmp start; 
	rjmp start;
	rjmp start;

;;; 
;;; Subroutines here
;;; 

short_delay:

   sbic  LASER_PIN, PWM        ; if its on go to next line
   ldi   PWM_bad, $FF
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   ret

;;; 
;;; Start of program
;;; 

start:	
   ldi   rgen1,HIGH(RAMEND)	; Stack setting to highest RAM adress
   out   SPH,rgen1
   ldi   rgen1,LOW(RAMEND)
   out   SPL,rgen1

	;; zeros are inputs
   ldi   rgen1, 0b00100000
   out   LASER_DDR, rgen1
	
   ldi   rgen1, 0b00100000
   out   LASER_PORT, rgen1
	
	;; ones are outputs
   ldi   rgen1, 0b11111111	
   out   LEDS_DDR, rgen1	; configure for all outputs

   ldi   rgen1, 0b11111111
   out   LEDS_PORT, rgen1
	
   ldi   rgen1, 0b00000000
   out   PWM_DDR, rgen1
	
   ldi   rgen1, 0b00000000
   out   PWM_PORT, rgen1
	
   cbi   LEDS_PORT, ON_LED
   cbi   LASER_PORT, LASER_STAT ; set to off. 

   ;; TRANSITION PWM OUTPUT
   cbi   LEDS_PORT, PWM_OUT_LED
	
   ;; TRANSITION PWM OUTPUT
   cbi   LEDS_PORT, PWM_OUT_LED
	

main_loop:
   
   in    rgen1, LASER_PIN
   in    time_high, PWM_PIN	        ; read input buffer
   com   time_high
   cbr   time_high, 0b11000000    

   ;; TRANSITION PWM OUTPUT - HIGH?
   sbi   LEDS_PORT, PWM_OUT_LED

   ldi   rgen2, $FF

   cpi   PWM_bad, 0             ; test if PWM_bad
   breq  _PWM_not_bad           ; if its its not, jump to _PWM_high
   sbi   LASER_PORT, LASER_STAT ; turn this is on. 
   cbi   LEDS_PORT, LASER_STAT_LED
   dec   PWM_bad
   cpi   PWM_bad, 0             ; test if it transitioned to zero
   brne  _PWM_not_bad           ; if its its not, jump to _PWM_high
   cbi   LASER_PORT, LASER_STAT ; it was, so flip to off. 
   sbi   LEDS_PORT, LASER_STAT_LED

_PWM_not_bad:

   cpi   time_high, 0           ; test if time_high is zero
   breq  _PWM_minimum_setup

_PWM_high:		
   rcall  short_delay
   dec   rgen2
   dec   time_high
   brne  _PWM_high

_PWM_minimum_setup:		
   ldi   time_high, $01
_PWM_minimum:		
   rcall  short_delay
   nop
   dec   time_high
   brne  _PWM_minimum

   ;; TRANSITION PWM OUTPUT
   cbi   LEDS_PORT, PWM_OUT_LED

_PWM_low:		
   nop
   nop
   nop
   dec   rgen2
   brne  _PWM_low

rjmp main_loop


