diff --git a/recipes/rc2014/eeprom/usr.asm b/recipes/rc2014/eeprom/usr.asm new file mode 100644 index 0000000..f14b4e5 --- /dev/null +++ b/recipes/rc2014/eeprom/usr.asm @@ -0,0 +1,43 @@ +; If you find youself needing to write to an EEPROM through a shell that isn't +; built for this, compile this dependency-less code (change memory offsets as +; needed) and run it in a USR-like fashion. + + ld bc, 0x1000 ; bytecount to write + ld de, 0xd000 ; source data + ld hl, 0x2000 ; dest EEPROM memory mapping + +loop: + ld a, (de) + ld (hl), a + push de ; --> lvl 1 + push bc ; --> lvl 2 + ld bc, 0x2000 ; Should be plenty enough to go > 10ms + ld e, a ; save expected data for verification +wait: + ; as long as writing operation is running, IO/6 will toggle at each + ; read attempt and IO/7 will be the opposite of what was written. Simply + ; wait until the read operation yields the same value as what we've + ; written + ld a, (hl) + cp e + jr z, waitend + dec bc + ld a, b + or c + jr nz, wait + ; mismatch + pop bc ; <-- lvl 2 + pop de ; <-- lvl 1 + ld a, 1 ; nonzero + or a ; unset Z + ret +waitend: + pop bc ; <-- lvl 2 + pop de ; <-- lvl 1 + inc hl + inc de + dec bc + ld a, b + or c + jr nz, loop + ret ; Z already set