[...] ;**************************************************************** ; Deklaration der indirekt adressierbaren Bytes ;**************************************************************** INDIREKT_1 SEGMENT IDATA RSEG INDIREKT_1 RING_BUF: DS 20H ; 32 Bytes fuer den Ringpuffer DIREKT_1 SEGMENT DATA RSEG DIREKT_1 HEAD: DS 1 ; HEAD, Zeiger auf letzten empfangenen Wert ; im Ringbuffer TAIL: DS 1 ; TAIL, Zeiger auf letzten gesendeten Wert ; im Ringbuffer COUNTER: DS 1 ; COUNTER, Zählervariable für den Buffer [...] ;************************************************************************** MainLoop: ; Start Programmschleife ;************************************************************************** ; ---- Vorbereitung mov r0, #RING_BUF ; schreibe Ringbufferadresse in R0 mov @r0, #0AAH ; schreibe AA in erstes RingBuf Element inc r0 ; Ringbufferadresse++ mov HEAD, r0 ; aktueller RingBuf in HEAD inc COUNTER ; COUNTER++ mov @r0, #0F0H ; schreibe F0 in zweites RingBuf Element inc r0 ; Ringbufferadresse++ mov HEAD, r0 ; aktueller RingBuf in HEAD inc COUNTER ; COUNTER++ ; ---- Auswertung: ; immer 2 Bytes im Ringbuffer können nur sinnvoll ausgewertet werden: ; 1. Byte bestimmt make/break Code, 2. Byte bestimmt welche Taste mov a, COUNTER cjne a, #0, Weiter ; Counter == 0? wenn nicht, weiter jmp MainLoop ; Counter == 0 : nichts zu tun Weiter: cjne a, #1, newI2Cdata ; Counter == 1? wenn nicht, neue Daten zum Senden da jmp MainLoop ; Counter == 1 : nichts zu tun newI2Cdata: mov r0, TAIL ; Tail-Zeiger in r0 laden mov a, @r0 ; Wert von Buffer in r3 schreiben mov r3, a lcall PS2_sendFrame ; Wert senden inc TAIL dec COUNTER mov r0, TAIL ; Zeiger in r0 laden mov a, @r0 ; Wert von Buffer in r3 schreiben mov r3, a lcall PS2_sendFrame ; Wert senden inc TAIL dec COUNTER mov r2, #2 ; warte 2 * 20ms = 40ms lcall Delay20ms ;************************************************************************** LoopEnd: jmp MainLoop ; zurueck an Anfang ;**************************************************************************