summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2013-10-07 23:08:15 +0200
committerDaniel Friesel <derf@finalrewind.org>2013-10-07 23:08:15 +0200
commitb3b147e2ad402c33d143f16563be0e2c46690942 (patch)
tree5c55393021a8a8660d4295d85671614271d05b5f
parentb1c6843aa37353952c693a384a79c398b8399248 (diff)
add almost-working SEARCH ROM support (command is not received correctly, rest works)
-rw-r--r--read-rom/main.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/read-rom/main.c b/read-rom/main.c
index 239f4a2..d00ea84 100644
--- a/read-rom/main.c
+++ b/read-rom/main.c
@@ -123,6 +123,7 @@ ISR(INT1_vect)
POS = 1;
APOS = 0;
BYTE = ~ADDR8;
+ EEAR = 0;
EIFR |= _BV(INTF1);
}
@@ -177,6 +178,60 @@ ISR(INT1_vect)
}
}
}
+ else if (LASTCMD == 0xf0) {
+
+ if (((EEAR == 0) && (BYTE & POS))
+ || ((EEAR == 1) && !(BYTE & POS))) {
+ //if (BYTE & POS) {
+ DDRD = _BV(PD3);
+
+ // 15us loop - r31 / r30 need not be preserved
+ asm volatile ("ldi r31, 0");
+ asm volatile ("ldi r30, 15"); // Z = 120
+ asm volatile ("wdr"); // <-----
+ asm volatile ("wdr");
+ asm volatile ("wdr");
+ asm volatile ("sbiw r30, 1");
+ asm volatile ("cp r30, r1");
+ asm volatile ("brne .-12"); // -^
+
+ DDRD = 0;
+ asm volatile ("wdr");
+ EIFR |= _BV(INTF1);
+ }
+ if (EEAR < 2) {
+ EEAR++;
+ }
+ else if (POS != 0x80) {
+ POS <<= 1;
+ EEAR = 0;
+ }
+ else {
+ EEAR = 0;
+ APOS++;
+ POS = 1;
+ if (APOS == 1)
+ BYTE = ~ADDR7;
+ else if (APOS == 2)
+ BYTE = ~ADDR6;
+ else if (APOS == 3)
+ BYTE = ~ADDR5;
+ else if (APOS == 4)
+ BYTE = ~ADDR4;
+ else if (APOS == 5)
+ BYTE = ~ADDR3;
+ else if (APOS == 6)
+ BYTE = ~ADDR2;
+ else if (APOS == 7)
+ BYTE = ~ADDR1;
+
+ else if (APOS == 8) {
+ LASTCMD = 0;
+ POS = 0;
+ }
+ }
+
+ }
asm volatile ("ldi r29, 0"); // LCNTH = 0
asm volatile ("ldi r28, 1"); // LCNTL = 1