/**********************************************************/
/* Auslesen des IR-Empfaengers des RUG WARRIOR */
/* und Decodieren der empf. FB-Signale */
/* Katja Steuernagel, Michael Kapp */
/* SS99 */
/**********************************************************/
ORG MAIN_START
/* remote()-Funktion */
subroutine_remote:
sei /* Interrupts sperren */
tsx /* Stackpointer zwischenspeichern */
sync:
bsr cnthigh /* auf Low warten */
bsr cntlow /* Low-Laenge zaehlen */
cmpd #2000
blo sync /* auf Pause zwischen Codes warten */
bsr getcode /* 1. Code einlesen */
stab code1
bsr getcode /* 2. Code einlesen */
cmpb code1 /* 1.=2. Code? */
beq ok /* ja => alles klar */
stab code2
bsr getcode /* sonst 3. Code einlesen */
cmpb code1
beq ok
cmpb code2
beq ok /* 3.=1. oder 3.=2., dann ok */
ldab #0 /* sonst Fehler zurueckgeben */
ok:
ldaa #0
cli /* Interrupts freigeben */
rts
getcode: /* Code-Bits einlesen */
bsr cnthigh /* auf Low warten */
bsr cntlow /* Low-Laenge bestimmen */
cmpd #2000 /* Pause? */
bhi gc1 /* dann fertig */
cmpd #350 /* 0- oder 1-Bit? */
rol bits /* in Ergebnis rollen */
bra getcode /* nächstes Bit */
gc1:
ldab bits
andb #63 /* letzte 6 Bit ausmaskieren */
rts
cnthigh: /* High-Laenge messen */
ldd #0
std counter
ch1:
ldd counter
addd #1 /* Zaehler erhoehen */
cmpd #100 /* Timeout erreicht? */
bhi timeout /* dann Abbruch */
std counter
ldaa $100A /* IR-Port auslesen */
anda #16 /* Bit ausmaskieren */
beq ch1 /* geloescht => weiterzaehlen */
ldd counter
rts
cntlow: /* Low-Laenge messen */
ldd #0
std counter
cl1:
ldd counter
addd #1 /* Zaehler erhoehen */
cmpd #4000 /* Timeout erreicht? */
bhi timeout /* dann Abbruch */
std counter
ldaa $100A /* IR-Port auslesen */
anda #16 /* Bit ausmaskieren */
bne cl1 /* gesetzt => weiterzaehlen */
ldd counter
rts
timeout: /* Abbruch, wenn kein Signal empfangen */
txs /* Stackpointer in Ordnung bringen */
ldd #-1 /* -1 zurueckgeben */
cli /* Interrupts freigeben */
rts
/* Variable */
counter: fdb 0
bits: fdb 0
code1: fdb 0
code2: fdb 0
|