Full Version : Chipalowsky & Librach Universal IR Remote
avr >>LIGHT & VISION PROJECTS >>Chipalowsky & Librach Universal IR Remote


Admin5- 04-22-2006
UNIVERSAL REMOTE CONTROL

Kevin Chipalowsky & Jennifer Librach

Introduction

A universal remote is a common everyday household appliance. Used to do everything from TV/Video/Cable to ceiling fan control, this project is a extremely versatile product.

We planned to have a 32-button remote that could replicate the IR characteristics of a VCR & TV remote control.

For our final project, we undertook to create a replica of this product. Using the Atmel 8535 microcontroller chip, we believe that we can accurately replicate the characteristics of the device.

We also wanted to see how hard it would be to use the microcontroller without the limitation of a prefabed ATMEL board. We used the board to test and program our device, but the final project is a fully portable project. Basically, we thought it would be cool to be able to bring our project home with us to control our own TV.
Results

Our final product did not work up to our proposed specifications. It did record pulses from OEM remotes, and it did play them back. The VCR that we are testing our device with receives the IR pulses and behaves appropriately. Unfortunately, our inexact replication sometimes makes the button appear to be pressed multiple times (it will turn on then off immediately). Perhaps, it did not recreate them precisely enough to be interpreted by OEM receivers correctly. Looking at an oscilloscope, our recreated waveforms are nearly identical to the OEM generated ones.

One of our problems was too weak an infrared transmitter. The project must be close to the VCR and aimed directly at it to work.

Also, our IR messages were played back with more noise than appeared in the original signals.

We discovered that the 8535 did not have enough memory to record complex signals for 30 seperate buttons as we had originally planned. All IR signals turned out to be far more complex than we had guessed. Realistically, it had enough memory for about 5 different buttons.

Improvements

Better Box- We believe that we could have made an extremely compact and light-weight design project. The actual chip and circuitry takes up very little space. With accurate soldering and ideal parts we could have made the project 1/8 the current size.
Stronger LED- The remote controls we have been using to program our device were detectable by our IR receiver 5 ft away from 90 degree angles, the LED had to be within 10" of the receiver and directly in front of it.
Research- We should have done more research on the tolerance of cable boxes. We don't know how exact the replication of the signal has to be. We also assumed that we could generalize from only 2 remotes that behaved similarly. It turned out that a 3rd cable box remote has different characteristics if you hold down a button then the other two remotes have.

Link: http://instruct1.cit.cornell.edu/courses/e...ts/s1999/kevin/

CODE


; Kevin Chipalowsky 375281

; Jennifer Librach 374980

; ee476

; Friday section

; FINAL PROJECT

.include "8535def.inc"

.device AT90S8535

.def savREG0 =r0

.def timer1 =r1

.def savREG1 =r2

.def messL =r3

.def messH =r4

.def saveYL =r5

.def saveYH =r6

.def t0overflow=r7

.def temp =r16;temporary register

.def keysC =r17

.def keysD =r18

.def pulselength=r19

.def tempI0 =r20;temporary register for ISR 0

.def output =r21

.def progcount=r22;stores 16-current length in memory when programming

.def progtemp=r23;temporary register for programming

.def state =r24

.def maxlen =r25;maximum length of a compared memory region

.def temp2 =r26



.equ prescal0=3;Timer0 prescal =clk/64

.equ prescal1=1;Timer1 prescal =clk/1

.equ T1=exp2(OCIE1A);timer1 compare match

.equ Timer0=exp2(TOIE0);timer0

.equ nootherkey=0xff

.equ keys=0;state0

.equ prog=1;state1

.equ playmess=2;state2

.equ erprog=0xee;displayed error code

.equ ert0;displayed error code

;**********************************************

;Buttons Decoded

.equ button0=0x77

.equ button1=0x7b

.equ button2=0x7d

.equ button3=0x7e

.equ button4=0xb7

.equ button5=0xbb

.equ button6=0xbd

.equ button7=0xbe

.equ button8=0xd7

.equ button9=0xdb

.equ button10=0xdd

.equ button11=0xde

.equ button12=0xe7

.equ button13=0xeb

.equ button14=0xed

.equ button15=0xee

.equ button16=0x77

.equ button17=0x7b

.equ button18=0x7d

.equ button19=0x7e

.equ button20=0xb7

.equ button21=0xbb

.equ button22=0xbd

.equ button23=0xbe

.equ button24=0xd7

.equ button25=0xdb

.equ button26=0xdd

.equ button27=0xde

.equ button28=0xe7

.equ button29=0xeb

.equ button30=0xed

.equ progkey=0xee

;**************************************

.dseg

mess0: .byte 1;a sixteen pulse count including a zero terminate

mess1: .byte 1;a sixteen pulse count including a zero terminate

mess2: .byte 1;a sixteen pulse count including a zero terminate

mess3: .byte 1;a sixteen pulse count including a zero terminate

mess4: .byte 1;a sixteen pulse count including a zero terminate

mess5: .byte 1;a sixteen pulse count including a zero terminate

mess6: .byte 1;a sixteen pulse count including a zero terminate

mess7: .byte 1;a sixteen pulse count including a zero terminate

mess8: .byte 1;a sixteen pulse count including a zero terminate

mess9: .byte 1;a sixteen pulse count including a zero terminate

mess10: .byte 1;a sixteen pulse count including a zero terminate

mess11: .byte 1;a sixteen pulse count including a zero terminate

mess12: .byte 1;a sixteen pulse count including a zero terminate

mess13: .byte 1;a sixteen pulse count including a zero terminate

mess14: .byte 1;a sixteen pulse count including a zero terminate

mess15: .byte 1;a sixteen pulse count including a zero terminate

mess16: .byte 1;a sixteen pulse count including a zero terminate

mess17: .byte 1;a sixteen pulse count including a zero terminate

mess18: .byte 1;a sixteen pulse count including a zero terminate

mess19: .byte 1;a sixteen pulse count including a zero terminate

mess20: .byte 1;a sixteen pulse count including a zero terminate

mess21: .byte 1;a sixteen pulse count including a zero terminate

mess22: .byte 1;a sixteen pulse count including a zero terminate

mess23: .byte 1;a sixteen pulse count including a zero terminate

mess24: .byte 1;a sixteen pulse count including a zero terminate

mess25: .byte 1;a sixteen pulse count including a zero terminate

mess26: .byte 1;a sixteen pulse count including a zero terminate

mess27: .byte 1;a sixteen pulse count including a zero terminate

mess28: .byte 1;a sixteen pulse count including a zero terminate

mess29: .byte 1;a sixteen pulse count including a zero terminate

mess30: .byte 400;a sixteen pulse count including a zero terminate

;**************************************

.cseg

.org $0000

rjmp RESET;reset entry vector

reti;ext int 0

reti;ext int 1

reti;timer 2 compare match

reti;timer 2 overflow

reti;timer 1 capture event

rjmp T1cmp;timer 1 compare match A

reti;timer 1 compare match B

reti;timer 1 overflow

rjmp T0ovfl;timer 0 overflow

reti;serial transfer complete

reti;uart rx complete

reti;uart data empty

reti;uart tx complete

reti;adc convertion complete

reti;eeprom ready

reti;analog comparator







RESET: ldi temp, LOW(RAMEND);setup stack pointer

out SPL, temp

ldi temp, HIGH(RAMEND)

out SPH, temp


;setup timers

; setup Timer 0

ldi temp, Prescal0

out TCCR0, temp;set T0 prescaler

ldi Temp, timer0;enable timer0 interrupt

out TIMSK, Temp

ldi Temp,0x00

out OCR1AH, Temp;load timer1 compareH

ldi Temp, 100

out OCR1AL, Temp;load timer1 compareL

ldi temp, exp2(CTC1);enable clear on compare match

ori temp, exp2(CS10);load T1 prescaler

out TCCR1B, temp

;enable keyboard portsD&C as inputs

clr temp

out DDRD, temp

out DDRC, temp

;enable portB as an output, pinB4 as input and out initially 0

ldi temp, 0xef

out DDRB, temp

clr temp

out PORTB, temp

ldi temp, T1

mov timer1, temp;in a register for use in xor funct

ldi state, keys; state=0

; is anything pressed state = 0

spin: rcall keypadpoll

cpi keysD, progkey

breq M_prog

cpi keysD, nootherkey;is a key pressed on padD?

brne j2play

cpi keysC, nootherkey;is a key pressed on padC?

brne j2play

rjmp spin

j2play: rjmp M_play


M_prog: ldi state, prog

in temp, PORTB

andi temp, 0x3f; turn on bits 6&7 when in prog state

out PORTB, temp

;wait until prog released, then get another button, then record

rcall keypadpoll

cpi keysD, 0xff

brne M_prog

waitp:;timeout? show LED in prog mode?

rcall keypadpoll


ldi temp, 0x55

out PORTB, temp

cpi keysD, progkey

breq spin; if prog was pressed return to main

cpi keysC, button0

brne nexttest0

rjmp prog_B0

nexttest0:

cpi keysC, button1

brne nexttest1

rjmp prog_B1

nexttest1:

cpi keysC, button2

brne nexttest2

rjmp prog_B2

nexttest2:

cpi keysC, button3

brne nexttest3

rjmp prog_B3

nexttest3:

cpi keysC, button4

brne nexttest4

rjmp prog_B4

nexttest4:

cpi keysC, button5

brne nexttest5

rjmp prog_B5

nexttest5:

cpi keysC, button6

brne nexttest6

rjmp prog_B6

nexttest6:

cpi keysC, button7

brne nexttest7

rjmp prog_B7

nexttest7:

cpi keysC, button8

brne nexttest8

rjmp prog_B8

nexttest8:

cpi keysC, button9

brne nexttest9

rjmp prog_B9

nexttest9:

cpi keysC, button10

brne nexttest10

rjmp prog_B10

nexttest10:

cpi keysC, button11

brne nexttest11

rjmp prog_B11

nexttest11:

cpi keysC, button12

brne nexttest12

rjmp prog_B12

nexttest12:

cpi keysC, button13

brne nexttest13

rjmp prog_B13

nexttest13:

cpi keysC, button14

brne nexttest14

rjmp prog_B14

nexttest14:

cpi keysC, button15

brne nexttest15

rjmp prog_B15

nexttest15:

cpi keysD, button16

brne nexttest16

rjmp prog_B16

nexttest16:

cpi keysD, button17

brne nexttest17

rjmp prog_B17

nexttest17:

cpi keysD, button18

brne nexttest18

rjmp prog_B18

nexttest18:

cpi keysD, button19

brne nexttest19

rjmp prog_B19

nexttest19:

cpi keysD, button20

brne nexttest20

rjmp prog_B20

nexttest20:

cpi keysD, button21

brne nexttest21

rjmp prog_B21

nexttest21:

cpi keysD, button22

brne nexttest22

rjmp prog_B2

nexttest22:

cpi keysD, button23

brne nexttest23

rjmp prog_B23

nexttest23:

cpi keysD, button24

brne nexttest24

rjmp prog_B24

nexttest24:

cpi keysD, button25

brne nexttest25

rjmp prog_B25

nexttest25:

cpi keysD, button26

brne nexttest26

rjmp prog_B26

nexttest26:

cpi keysD, button27

brne nexttest27

rjmp prog_B27

nexttest27:

cpi keysD, button28

brne nexttest28

rjmp prog_B28

nexttest28:

cpi keysD, button29

brne nexttest29

rjmp prog_B29

nexttest29:

cpi keysD, button30

brne nexttest30

rjmp prog_B30

nexttest30:

rjmp waitp

prog_B0:ldi ZL, LOW(mess0);shifted because pgm memory is words

ldi ZH, HIGH(mess0);

rjmp record

prog_B1:ldi ZL, LOW(mess1);shifted because pgm memory is words

ldi ZH, HIGH(mess1);

rjmp record

prog_B2:ldi ZL, LOW(mess2);shifted because pgm memory is words

ldi ZH, HIGH(mess2);

rjmp record

prog_B3:ldi ZL, LOW(mess3);shifted because pgm memory is words

ldi ZH, HIGH(mess3);

rjmp record

prog_B4:ldi ZL, LOW(mess4);shifted because pgm memory is words

ldi ZH, HIGH(mess4);

rjmp record

prog_B5:ldi ZL, LOW(mess5);shifted because pgm memory is words

ldi ZH, HIGH(mess5);

rjmp record

prog_B6:ldi ZL, LOW(mess6);shifted because pgm memory is words

ldi ZH, HIGH(mess6);

rjmp record

prog_B7:ldi ZL, LOW(mess7);shifted because pgm memory is words

ldi ZH, HIGH(mess7);

rjmp record

prog_B8:ldi ZL, LOW(mess8);shifted because pgm memory is words

ldi ZH, HIGH(mess8);

rjmp record

prog_B9:ldi ZL, LOW(mess9);shifted because pgm memory is words

ldi ZH, HIGH(mess9);

rjmp record

prog_B10:ldi ZL, LOW(mess10);shifted because pgm memory is words

ldi ZH, HIGH(mess10);

rjmp record

prog_B11:ldi ZL, LOW(mess11);shifted because pgm memory is words

ldi ZH, HIGH(mess11);

rjmp record

prog_B12:ldi ZL, LOW(mess12);shifted because pgm memory is words

ldi ZH, HIGH(mess12);

rjmp record

prog_B13:ldi ZL, LOW(mess13);shifted because pgm memory is words

ldi ZH, HIGH(mess13);

rjmp record

prog_B14:ldi ZL, LOW(mess14);shifted because pgm memory is words

ldi ZH, HIGH(mess14);

rjmp record

prog_B15:ldi ZL, LOW(mess15);shifted because pgm memory is words

ldi ZH, HIGH(mess15);

rjmp record

prog_B16:ldi ZL, LOW(mess16);shifted because pgm memory is words

ldi ZH, HIGH(mess16);

rjmp record

prog_B17:ldi ZL, LOW(mess17);shifted because pgm memory is words

ldi ZH, HIGH(mess17);

rjmp record

prog_B18:ldi ZL, LOW(mess18);shifted because pgm memory is words

ldi ZH, HIGH(mess18);

rjmp record

prog_B19:ldi ZL, LOW(mess19);shifted because pgm memory is words

ldi ZH, HIGH(mess19);

rjmp record

prog_B20:ldi ZL, LOW(mess20);shifted because pgm memory is words

ldi ZH, HIGH(mess20);

rjmp record

prog_B21:ldi ZL, LOW(mess21);shifted because pgm memory is words

ldi ZH, HIGH(mess21);

rjmp record

prog_B22:ldi ZL, LOW(mess22);shifted because pgm memory is words

ldi ZH, HIGH(mess22);

rjmp record

prog_B23:ldi ZL, LOW(mess23);shifted because pgm memory is words

ldi ZH, HIGH(mess23);

rjmp record

prog_B24:ldi ZL, LOW(mess24);shifted because pgm memory is words

ldi ZH, HIGH(mess24);

rjmp record

prog_B25:ldi ZL, LOW(mess25);shifted because pgm memory is words

ldi ZH, HIGH(mess25);

rjmp record

prog_B26:ldi ZL, LOW(mess26);shifted because pgm memory is words

ldi ZH, HIGH(mess26);

rjmp record

prog_B27:ldi ZL, LOW(mess27);shifted because pgm memory is words

ldi ZH, HIGH(mess27);

rjmp record

prog_B28:ldi ZL, LOW(mess28);shifted because pgm memory is words

ldi ZH, HIGH(mess28);

rjmp record

prog_B29:ldi ZL, LOW(mess29);shifted because pgm memory is words

ldi ZH, HIGH(mess29);

rjmp record

prog_B30:ldi ZL, LOW(mess30);shifted because pgm memory is words

ldi ZH, HIGH(mess30);

record:

ldi temp, 0xf0

out PORTB, temp

RXhigh: sbis PINB,4; wait until input goes high

rjmp RXhigh

RXlow: sbic PINB,4; now wait until input goes low again

rjmp RXlow

in progtemp, PINB

andi progtemp, exp2(4); only interested in input from RX


; save beginning of message

mov messL, ZL

mov messH, ZH

; begin recording

ldi temp, timer0;enable timer0

out TIMSK, temp

ldi temp, 1

out TCNT0, temp

ldi progcount, 255; initialize length of recording

clr t0overflow

com t0overflow

progloop:

out PORTB, progcount

in temp, PINB

andi temp, exp2(4); only interested in input from RX

cp temp, progtemp

brne change; change in input

tst t0overflow

brne progloop

ldi temp, 0x01

rjmp storenow

change:

mov progtemp, temp; update last value in progtemp

in temp, TCNT0

neg temp; 256-time so that reload will overflow correctly

storenow:

st Z+, temp; store width of period

clr temp

inc temp

out TCNT0, temp; reset timer0

clr t0overflow

com t0overflow

subi progcount, 1

cpi progcount, 0

brne progloop

; write null terminator

clr temp

st Z+, temp

; turn off all timers

clr temp

out TIMSK, temp

rjmp spin

; state = 1 play message; not program

M_play: ldi state, playmess


cpi keysC, button0

brne playtest1

ldi ZL, LOW(mess0);shifted because pgm memory is words

ldi ZH, HIGH(mess0);

rjmp playnow

playtest1:

cpi keysC, button1

brne playtest2

ldi ZL, LOW(mess1);shifted because pgm memory is words

ldi ZH, HIGH(mess1);

rjmp playnow

playtest2:

cpi keysC, button2

brne playtest3

ldi ZL, LOW(mess2);shifted because pgm memory is words

ldi ZH, HIGH(mess2);

rjmp playnow

playtest3:

cpi keysC, button3

brne playtest4

ldi ZL, LOW(mess3);shifted because pgm memory is words

ldi ZH, HIGH(mess3);

rjmp playnow

playtest4:

cpi keysC, button4

brne playtest5

ldi ZL, LOW(mess4);shifted because pgm memory is words

ldi ZH, HIGH(mess4);

rjmp playnow

playtest5:

cpi keysC, button5

brne playtest6

ldi ZL, LOW(mess5);shifted because pgm memory is words

ldi ZH, HIGH(mess5);

rjmp playnow

playtest6:

cpi keysC, button6

brne playtest7

ldi ZL, LOW(mess6);shifted because pgm memory is words

ldi ZH, HIGH(mess6);

rjmp playnow

playtest7:

cpi keysC, button7

brne playtest8

ldi ZL, LOW(mess7);shifted because pgm memory is words

ldi ZH, HIGH(mess7);

rjmp playnow

playtest8:

cpi keysC, button8

brne playtest9

ldi ZL, LOW(mess8);shifted because pgm memory is words

ldi ZH, HIGH(mess8);

rjmp playnow

playtest9:

cpi keysC, button9

brne playtest10

ldi ZL, LOW(mess9);shifted because pgm memory is words

ldi ZH, HIGH(mess9);

rjmp playnow

playtest10:

cpi keysC, button10

brne playtest11

ldi ZL, LOW(mess10);shifted because pgm memory is words

ldi ZH, HIGH(mess10);

rjmp playnow

playtest11:

cpi keysC, button11

brne playtest12

ldi ZL, LOW(mess11);shifted because pgm memory is words

ldi ZH, HIGH(mess11);

rjmp playnow

playtest12:

cpi keysC, button12

brne playtest13

ldi ZL, LOW(mess12);shifted because pgm memory is words

ldi ZH, HIGH(mess12);

rjmp playnow

playtest13:

cpi keysC, button13

brne playtest14

ldi ZL, LOW(mess13);shifted because pgm memory is words

ldi ZH, HIGH(mess13);

rjmp playnow

playtest14:

cpi keysC, button14

brne playtest15

ldi ZL, LOW(mess14);shifted because pgm memory is words

ldi ZH, HIGH(mess14);

rjmp playnow

playtest15:

cpi keysC, button15

brne playtest16

ldi ZL, LOW(mess15);shifted because pgm memory is words

ldi ZH, HIGH(mess15);

rjmp playnow

playtest16:

cpi keysD, button16

brne playtest17

ldi ZL, LOW(mess16);shifted because pgm memory is words

ldi ZH, HIGH(mess16);

rjmp playnow

playtest17:

cpi keysD, button17

brne playtest18

ldi ZL, LOW(mess17);shifted because pgm memory is words

ldi ZH, HIGH(mess17);

rjmp playnow

playtest18:

cpi keysD, button18

brne playtest19

ldi ZL, LOW(mess18);shifted because pgm memory is words

ldi ZH, HIGH(mess18);

rjmp playnow

playtest19:

cpi keysD, button19

brne playtest20

ldi ZL, LOW(mess19);shifted because pgm memory is words

ldi ZH, HIGH(mess19);

rjmp playnow

playtest20:

cpi keysD, button20

brne playtest21

ldi ZL, LOW(mess20);shifted because pgm memory is words

ldi ZH, HIGH(mess20);

rjmp playnow

playtest21:

cpi keysD, button21

brne playtest22

ldi ZL, LOW(mess21);shifted because pgm memory is words

ldi ZH, HIGH(mess21);

rjmp playnow

playtest22:

cpi keysD, button22

brne playtest23

ldi ZL, LOW(mess22);shifted because pgm memory is words

ldi ZH, HIGH(mess22);

rjmp playnow

playtest23:

cpi keysD, button23

brne playtest24

ldi ZL, LOW(mess23);shifted because pgm memory is words

ldi ZH, HIGH(mess23);

rjmp playnow

playtest24:

cpi keysD, button24

brne playtest25

ldi ZL, LOW(mess24);shifted because pgm memory is words

ldi ZH, HIGH(mess24);

rjmp playnow

playtest25:

cpi keysD, button25

brne playtest26

ldi ZL, LOW(mess25);shifted because pgm memory is words

ldi ZH, HIGH(mess25);

rjmp playnow

playtest26:

cpi keysD, button26

brne playtest27

ldi ZL, LOW(mess26);shifted because pgm memory is words

ldi ZH, HIGH(mess26);

rjmp playnow

playtest27:

cpi keysD, button27

brne playtest28

ldi ZL, LOW(mess27);shifted because pgm memory is words

ldi ZH, HIGH(mess27);

rjmp playnow

playtest28:

cpi keysD, button28

brne playtest29

ldi ZL, LOW(mess28);shifted because pgm memory is words

ldi ZH, HIGH(mess28);

rjmp playnow

playtest29:

cpi keysD, button29

brne playtest30

ldi ZL, LOW(mess29);shifted because pgm memory is words

ldi ZH, HIGH(mess29);

rjmp playnow

playtest30:

cpi keysD, button30

brne playtest31

ldi ZL, LOW(mess30);shifted because pgm memory is words

ldi ZH, HIGH(mess30);

rjmp playnow

playtest31:

rjmp spin

playnow:

; remember message address so that we can repeat it if requested

mov messL, ZL

mov messH, ZH

messageplay:

clr temp

out PORTB, temp

ld pulselength, Z+

out PORTB, pulselength

out TCNT0, pulselength

mov temp, timer1;enable timer1

ori temp, timer0;enable timer0

out TIMSK, temp

sei

; keypadpoll while playing

rcall keypadpoll

clr t0overflow

playloop:

tst pulselength

brne playloop; branch to main if zero terminate reached

; do we play it again?

cpi keysD, 0xff

brne playagain

cpi keysC, 0xff

brne playagain

; stop playing

clr temp

out TIMSK, temp

rjmp spin

playagain:

; reset message

mov ZL, messL

mov ZH, messH

; pulse for external trigger on scope

in temp, PORTB

ori temp, 0x01

out PORTB, temp

rjmp messageplay

;*************************************************************************

;ISRs

T0ovfl: in savREG0, sREG

cpi state, prog

breq progoverflow

ld pulselength, Z+

out TCNT0, pulselength

; if the previous pulse length was an overflow, then don't invert

tst t0overflow

brne afterinvert

in tempI0, TIMSK

eor tempI0, timer1;Toggle timer1 enable

out TIMSK, tempI0

afterinvert:

; if the recorded pulse length was an overflow, then don't

; toggle timer1 after this pulse

clr t0overflow

cpi pulselength, 0x01

brne nooverflow

com t0overflow

nooverflow:

; generate "cleaned up" waveform on pin 2 0

and tempI0, timer1

cp tempI0, timer1

breq done

ldi tempI0, 0x02

out PORTB, tempI0

done: out sREG, savREG0

reti

progoverflow:

; overflowed during programming, so stop the wait loop

clr t0overflow

rjmp done

T1cmp: in savREG1, sREG

com output

andi output, exp2(5)

out PORTB, output

out sREG, savREG1

reti

=============================================

; compare memory regions pointed to by Z and Y and of maximum length maxlen

; bytes are the same if they are within 1.

; If maxlen is returned as 0, the two memory regions are the same.

comparemem:

; save old Z and Y

mov messL, ZL

mov messH, ZH

mov saveYL, YL

mov saveYH, YH

compareagain:

ld temp, Z+

ld temp2, Y+

sub temp, temp2

brsh alreadypositive

neg temp

alreadypositive:

cpi temp, 2

; todo: if temp is less than 2, they are the same, compare next byte

brsh return

; count off another byte compared.

dec maxlen

brne compareagain

; restore pointers and return

return:

mov ZL, messL

mov ZH, messH

mov YL, saveYL

mov YH, saveYH

ret




Forumer™ is Voted #1 Free Forum Hosting provider
Build your own community today with the largest message board hosting company.