ASCII ASM S19

close load
if
; Replace common IO register names with numbers for a ATmega168
	_replace PINB, 0x03
	_replace DDRB, 0x04
	_replace PORTB, 0x05
	_replace PINC, 0x06
	_replace DDRC, 0x07
	_replace PORTC, 0x08
	_replace PIND, 0x09
	_replace DDRD, 0x0a
	_replace PORTD, 0x0b

	_replace ADCL, 0x78
	_replace ADCH, 0x79
	_replace ADCSRA, 0x7a
	_replace ADCSRB, 0x7b
	_replace ADMUX, 0x7c
	_replace DIDR0, 0x7e

	_replace SPH, 0x3e
	_replace SPL, 0x3d
	_replace RAMEND_HI, 0x04
	_replace RAMEND_LO, 0xff

; Rest and Interrupt table for ATmega168
	_loc 0
	jmp RESET		; Reset Handler
	jmp IgnoreINT		; IRQ0 Handler
	jmp IgnoreINT		; IRQ1 Handler
	jmp IgnoreINT		; PCINT0 Handler
	jmp IgnoreINT		; PCINT1 Handler
	jmp IgnoreINT		; PCINT2 Handler
	jmp IgnoreINT		; Watchdog Timer
	jmp IgnoreINT		; Timer2 Compare
	jmp IgnoreINT		; Timer2 Compare
	jmp IgnoreINT		; Timer2 Overflow Handler
	jmp IgnoreINT		; Timer1 Capture Handler
	jmp IgnoreINT		; Timer1 Compare A Handler
	jmp IgnoreINT		; Timer1 Compare B Handler
	jmp IgnoreINT		; Timer1 Overflow Handler
	jmp IgnoreINT		; Timer0 Compare A Handler
	jmp IgnoreINT		; Timer0 Compare B Handler
	jmp IgnoreINT		; Timer0 Overflow Handler
	jmp IgnoreINT		; SPI Transfer Complete Handler
	jmp IgnoreINT		; USART, RX Complete Handler
	jmp IgnoreINT		; USART, UDR Empty Handler
	jmp IgnoreINT		; USART, TX Complete Handler
	jmp IgnoreINT		; ADC Conversion Complete Handler
	jmp IgnoreINT		; EEPROM Ready Handler
	jmp IgnoreINT		; Analog Comparator Handler
	jmp IgnoreINT		; 2-wire Serial Interface Handler
	jmp IgnoreINT		; Store Program Memory Ready Handler

IgnoreINT:	reti

RESET:	ldi   r16, RAMEND_HI	; Main program start
	out   SPH, r16		;Set Stack Pointer to top of RAM
	ldi   r16, RAMEND_LO
	out   SPL, r16
	cli			; No interrupts
	ldi   r16, 0x7e		; Turn off digital inputs on analog pins.
	sts   DIDR0, r16

	clr   r0		; 'A' All vars initialize to 0
	clr   r1
	clr   r2		; 'B'
	clr   r3
	clr   r4		; 'C'
	clr   r5
	clr   r6		; 'D'
	clr   r7
	clr   r8		; 'E'
	clr   r9

	jmp   LADDER		; Start climbing the ladder.

	; Read the ADC for a pin.
	; Desired source is in R16
getAnalog:
	; Setup ADC
	andi  r16, 7	; Which input to sample
	; Use Internal reference, right aligned
	ori   r16, 0xc0
	sts   ADMUX, r16
	ldi   r16, 0xc7 ; ADC Enable, ADC Start, No interrupt, /128
	sts   ADCSRA, r16
	; wait...
getAnalog_waitforit:
	lds   r16, ADCSRA
	sbrs  r16, 4	; If complete, stop waiting.
	rjmp  getAnalog_waitforit
	; Put result into r16:17
	lds   r16, ADCL
	lds   r17, ADCH
	ret

	; Set the PWM output on a pin.
	; R16:R17 is the value
	; R18 is which output
setPWM:
	; TODO how to do this?
	ret