From 50d0dc982c47c528cb083c6cc2a881410f0c9396 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sun, 14 Jul 2019 09:04:51 -0400 Subject: [PATCH] ed: check addr bounds --- apps/ed/cmd.asm | 14 -------------- apps/ed/main.asm | 44 +++++++++++++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/apps/ed/cmd.asm b/apps/ed/cmd.asm index 9d3cc7d..9291004 100644 --- a/apps/ed/cmd.asm +++ b/apps/ed/cmd.asm @@ -153,17 +153,3 @@ cmdParse: pop bc ret -; Make (IX) point to addr 1 -cmdAddr1: - ld ix, CMD_ADDR1 - ret - -; Make (IX) point to addr 2 -cmdAddr2: - ld ix, CMD_ADDR2 - ret - -; Set A to CMD_TYPE -cmdType: - ld a, (CMD_TYPE) - ret diff --git a/apps/ed/main.asm b/apps/ed/main.asm index 5f3ca6a..b80fbd2 100644 --- a/apps/ed/main.asm +++ b/apps/ed/main.asm @@ -88,22 +88,17 @@ edMain: call stdioGetLine call cmdParse jr nz, .error - call cmdType + ld a, (CMD_TYPE) cp 'q' - ret z + jr z, .doQuit jr .doPrint +.doQuit: + xor a + ret .doPrint: - call cmdAddr1 - call edResolveAddr - ex de, hl ; DE: addr1 - call cmdAddr2 - call edResolveAddr - ld (ED_CURLINE), hl - ex de, hl ; HL: addr1, DE: addr2 - call cpHLDE - jr z, .doPrintLoop ; DE == HL, ok - jr nc, .error ; DE < HL, not good + call edReadAddrs + jr nz, .error .doPrintLoop: push hl call bufGetLine @@ -112,9 +107,12 @@ edMain: call printcrlf pop hl call cpHLDE - jr nc, .mainLoop + jr z, .doPrintEnd inc hl jr .doPrintLoop +.doPrintEnd: + ld (ED_CURLINE), hl + jr .mainLoop .error: ld a, '?' call stdioPutC @@ -140,3 +138,23 @@ edResolveAddr: pop de ret +; Read absolute addr1 in HL and addr2 in DE. Also, check bounds and set Z if +; both addresses are within bounds, unset if not. +edReadAddrs: + ld ix, CMD_ADDR2 + call edResolveAddr + ex de, hl + ld hl, (BUF_LINECNT) + ex de, hl ; HL: addr2 DE: cnt + call cpHLDE + jp nc, unsetZ ; HL (addr2) >= DE (cnt). no good + ex de, hl ; DE: addr2 + ld ix, CMD_ADDR1 + call edResolveAddr + ex de, hl ; HL: addr2, DE: addr1 + call cpHLDE + jp c, unsetZ ; HL (addr2) < DE (addr1). no good + ex de, hl ; HL: addr1, DE: addr2 + cp a ; ensure Z + ret +