A ~C! override can, if it wants, go put an error code in there, which ~AT28 does. This way, after a copy or xcomp process directly to EEPROM, one can verify whether all bytes were successfully written by checking whether "~C!ERR C@" is zero.master
@@ -1078,6 +1078,7 @@ HERESTART [IF] | |||||
[THEN] | [THEN] | ||||
SYSVARS 0x04 + LD(i)HL, ( RAM+04 == HERE ) | SYSVARS 0x04 + LD(i)HL, ( RAM+04 == HERE ) | ||||
A XORr, SYSVARS 0x3e + LD(i)A, ( 3e == ~C! ) | A XORr, SYSVARS 0x3e + LD(i)A, ( 3e == ~C! ) | ||||
SYSVARS 0x41 + LD(i)A, ( 41 == ~C!ERR ) | |||||
DE BIN( @ 0x04 ( BOOT ) + LDd(i), | DE BIN( @ 0x04 ( BOOT ) + LDd(i), | ||||
JR, L1 FWR ( execute, B287 ) | JR, L1 FWR ( execute, B287 ) | ||||
( ----- 286 ) | ( ----- 286 ) | ||||
@@ -1689,7 +1690,7 @@ driver code. Load the low part with "353 LOAD", the high part | |||||
with "390 LOAD" | with "390 LOAD" | ||||
( ----- 353 ) | ( ----- 353 ) | ||||
: RAM+ [ SYSVARS LITN ] + ; : BIN+ [ BIN( @ LITN ] + ; | : RAM+ [ SYSVARS LITN ] + ; : BIN+ [ BIN( @ LITN ] + ; | ||||
: HERE 0x04 RAM+ ; | |||||
: HERE 0x04 RAM+ ; : ~C!ERR 0x41 RAM+ ; | |||||
: CURRENT* 0x51 RAM+ ; : CURRENT CURRENT* @ ; | : CURRENT* 0x51 RAM+ ; : CURRENT CURRENT* @ ; | ||||
: H@ HERE @ ; | : H@ HERE @ ; | ||||
: FIND ( w -- a f ) CURRENT @ SWAP _find ; | : FIND ( w -- a f ) CURRENT @ SWAP _find ; | ||||
@@ -2159,14 +2160,18 @@ XCURRENT @ _xapply ORG @ 0x04 ( stable ABI BOOT ) + ! | |||||
':' X' _ 4 - C! ( give : its name ) | ':' X' _ 4 - C! ( give : its name ) | ||||
'(' X' _ 4 - C! | '(' X' _ 4 - C! | ||||
( ----- 400 ) | ( ----- 400 ) | ||||
( Write byte E at addr HL, assumed to be an AT28 EEPROM. | |||||
After that, poll repeatedly that address until writing is | |||||
complete. ) | |||||
( Write byte E at addr HL, assumed to be an AT28 EEPROM. After | |||||
that, poll repeatedly that address until writing is complete. | |||||
If last polled value is different than orig, set ~C!ERR ) | |||||
(entry) ~AT28 ( warning: don't touch D register ) | (entry) ~AT28 ( warning: don't touch D register ) | ||||
(HL) E LDrr, E (HL) LDrr, ( poll ) BEGIN, | |||||
(HL) E LDrr, A E LDrr, ( orig ) EXAFAF', ( save ) | |||||
E (HL) LDrr, ( poll ) BEGIN, | |||||
A (HL) LDrr, ( poll ) E CPr, ( same as old? ) | A (HL) LDrr, ( poll ) E CPr, ( same as old? ) | ||||
E A LDrr, ( save old poll, Z preserved ) | E A LDrr, ( save old poll, Z preserved ) | ||||
JRNZ, AGAIN, RET, | |||||
JRNZ, AGAIN, | |||||
EXAFAF', ( orig ) E SUBr, ( equal? ) | |||||
IFNZ, SYSVARS 0x41 + ( ~C!ERR ) LD(i)A, THEN, | |||||
RET, | |||||
( ----- 401 ) | ( ----- 401 ) | ||||
Grid subsystem | Grid subsystem | ||||
@@ -160,9 +160,9 @@ Here's a list of them: | |||||
SYSVARS FUTURE USES +3c BLK(* | SYSVARS FUTURE USES +3c BLK(* | ||||
+02 CURRENT +3e ~C!* | +02 CURRENT +3e ~C!* | ||||
+04 HERE +41 FUTURE USES | |||||
+06 C<? +43 FUTURE USES | |||||
+08 C<* override +45 FUTURE USES | |||||
+04 HERE +41 ~C!ERR | |||||
+06 C<? +42 FUTURE USES | |||||
+08 C<* override +43 FUTURE USES | |||||
+0a NL ialias +51 CURRENTPTR | +0a NL ialias +51 CURRENTPTR | ||||
+0c C<* +53 EMIT ialias | +0c C<* +53 EMIT ialias | ||||
+0e WORDBUF +55 KEY ialias | +0e WORDBUF +55 KEY ialias | ||||
@@ -197,6 +197,10 @@ BLK* "Disk blocks" in usage.txt. | |||||
the routine that writes a byte to memory and then returns. | the routine that writes a byte to memory and then returns. | ||||
Register usage is arch-dependent, see boot code for details. | Register usage is arch-dependent, see boot code for details. | ||||
~C!ERR: When an error happens during ~C! write overrides, sets | |||||
this byte to a nonzero value. Otherwise, stays at zero. Has to | |||||
be reset to zero manually after an error. | |||||
DRIVERS section is reserved for recipe-specific drivers. | DRIVERS section is reserved for recipe-specific drivers. | ||||
FUTURE USES section is unused for now. | FUTURE USES section is unused for now. | ||||
@@ -214,7 +218,8 @@ very few things. | |||||
2. Set CURRENT to value of LATEST field in stable ABI. | 2. Set CURRENT to value of LATEST field in stable ABI. | ||||
3. Set HERE to HERESTART const if defined, to CURRENT other- | 3. Set HERE to HERESTART const if defined, to CURRENT other- | ||||
wise. | wise. | ||||
4. Execute the word referred to by 0x04 (BOOT) in stable ABI. | |||||
4. Initialize ~C! and ~C!ERR to 0. | |||||
5. Execute the word referred to by 0x04 (BOOT) in stable ABI. | |||||
In a normal system, BOOT is in core words at B396 and does a | In a normal system, BOOT is in core words at B396 and does a | ||||
few things: | few things: | ||||