| mtd_asm_write#(PNUM, OFFSET, N0, N, BUF; PEBS; ERR) {if PNUM < # PEBS ∧ ¬ PEBS[PNUM].bad ∧ PEBS[PNUM].fill ≤ OFFSET ∧ OFFSET + N ≤ PEB_SIZE ∧ N0 + N ≤ # BUF ∧ is-aligned(OFFSET, EB_PAGE_SIZE) ∧ is-aligned(N, EB_PAGE_SIZE) then {fail_or_success#(; ; ERR); if ERR = ESUCCESS then {PEBS[PNUM].data := copy(BUF, N0, PEBS[PNUM].data, OFFSET, N); PEBS[PNUM].fill := OFFSET + N} else choose N1 with (N1 < N ∨ N1 = 0 ∧ N = 0) ∧ is-aligned(N1, EB_PAGE_SIZE) in if N1 ≠ 0 then {PEBS[PNUM].data := copy(BUF, N0, PEBS[PNUM].data, OFFSET, N1); PEBS[PNUM].fill := OFFSET + N1}} else abort } |