From bc45a9263c233a3f5cc98a76626f3da80da72eba Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Sun, 15 Dec 2019 13:24:26 -0800 Subject: [PATCH] Fix some editor redraw issues --- doc/Editor.md | 31 ++--- images/apple/PLASMA2-SYS.PO | Bin 143360 -> 143360 bytes images/apple/PLASMA2.2mg | Bin 819264 -> 819264 bytes src/toolsrc/ed.pla | 262 ++++++++++++++++++++++-------------- 4 files changed, 175 insertions(+), 118 deletions(-) diff --git a/doc/Editor.md b/doc/Editor.md index 4936168..5ec5e87 100644 --- a/doc/Editor.md +++ b/doc/Editor.md @@ -2,8 +2,8 @@ WELCOME TO THE PLASMA EDITOR! ============================= FIRST THINGS FIRST: -TO NAVIGATE, USE THE ARROW KEYS. ON THE -APPLE ][: +TO NAVIGATE, USE THE ARROW KEYS. ON +THE APPLE ][: CTRL-K = UP CTRL-J = DOWN. @@ -18,22 +18,23 @@ TO JUMP AROUND THE TEXT FILE USE: CTRL-Q = JUMP BEGINNING CTRL-E = JUMP END -THE 'ESCAPE' KEY WILL PUT YOU IN COMMAND -MODE. FROM THERE YOU CAN EXIT BY -ENTERING 'Q' AND 'RETURN'. YOU CAN ALSO -RETURN TO THE EDITOR BY JUST PRESSING -'RETURN'. +THE 'ESCAPE' KEY WILL PUT YOU IN +COMMAND MODE. FROM THERE YOU CAN +EXIT BY ENTERING 'Q' AND 'RETURN'. +YOU CAN ALSO RETURN TO THE EDITOR BY +JUST PRESSING 'RETURN'. ------- THE PLASMA EDITOR IS A SIMPLE TEXT EDITOR FOR ENTERING AND MANIPULATING -TEXT AND SOURCE CODE FILES. THE EDITOR -ONLY SUPPORTS 40 COLUMN TEXT ALTHOUGH -LINES CAN BE UP TO 79 CHARACTERS LONG. -THE SCREEN WILL SCROLL HORIZONTALLY -AS THE CURSOR MOVES. THERE IS 16K OF -MEMORY FOR THE TEXT BUFFER. +TEXT AND SOURCE CODE FILES. THE +EDITOR ONLY SUPPORTS 40 COLUMN TEXT +ALTHOUGH LINES CAN BE UP TO 79 +CHARACTERS LONG. THE SCREEN WILL +SCROLL HORIZONTALLY AS THE CURSOR +MOVES. THERE IS 16K OF MEMORY FOR +THE TEXT BUFFER. IT HAS TWO MODES, COMMAND AND EDIT. @@ -82,7 +83,7 @@ EDIT COMMANDS: APPLE ][, UPPER AND LOWER CASE ENTRY WORKS AS EXPECTED. - CTRL-C = FORCE LOWER-CASE CHARS + ESC T = FORCE LOWER-CASE CHARS If you have a lower-case character generator installed, you can force @@ -128,7 +129,7 @@ EDIT COMMANDS: OA-7 = JUMP BEGIN OA-1 = JUMP END OA-5 = DELETE CHAR - OA-- = DELETE/CUT LINE + OA-- = DELETE/CUT LI OA-0 = COPY DELETED LINE OA-ENTER = OPEN NEW LINE OA-. = TOGGLE INSERT/OVERWRITE diff --git a/images/apple/PLASMA2-SYS.PO b/images/apple/PLASMA2-SYS.PO index 53b786add7f90d073eeca74c6a3b1420f7e86c11..71302a9a62bc706e8ecc8f3f6afb0d454477fb64 100755 GIT binary patch delta 7419 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 Lr?sVjmt+11hjyy< diff --git a/images/apple/PLASMA2.2mg b/images/apple/PLASMA2.2mg index 85b5a121eeb6eb0573fff770092729118a4b6118..069da3093b42f1c0690792d56d5e02d6805fe1fc 100644 GIT binary patch delta 11239 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 diff --git a/src/toolsrc/ed.pla b/src/toolsrc/ed.pla index 1c553e1..b3509f9 100755 --- a/src/toolsrc/ed.pla +++ b/src/toolsrc/ed.pla @@ -72,6 +72,7 @@ const shiftlock = 128 // Text screen row address array // const scrnwidth = 35 +const scrnheight = 23 word txtscrn = $0404,$0484,$0504,$0584,$0604,$0684,$0704,$0784 word = $042C,$04AC,$052C,$05AC,$062C,$06AC,$072C,$07AC word = $0454,$04D4,$0554,$05D4,$0654,$06D4,$0754,$07D4 @@ -89,7 +90,8 @@ word numcliplines = 0 word arg word strplsize = MAXSTRPLSIZE word strpool, strplmapsize, txtlinbuf, cliplinbuf, strpoolmap -byte cursx, cursy, scrnleft, curscol, underchr, curschr +word cursx, cursy, scrnleft, curscol +byte underchr, curschr word keyin, cursrow, selrow, scrntop, cursptr byte a3echo = $80 byte a3noecho = $00 @@ -262,7 +264,7 @@ def striptail(strptr, chr)#0 end def strstripcpy(dststr, srcstr)#0 memcpy(dststr, srcstr, ^srcstr + 1) - striptail(dststr, $80 | ' ') + striptail(dststr, keyspace) end def delstr(strptr)#0 byte mask, ofst @@ -280,7 +282,7 @@ def newstr(strptr) word newptr strlen = ^strptr - while ^(strptr + strlen) == $8D or ^(strptr + strlen) == $A0 + while ^(strptr + strlen) == keyenter or ^(strptr + strlen) == keyspace strlen-- loop if strlen == 0 @@ -484,7 +486,8 @@ def drawgutter(scrnrow, ofst)#0 // // Draw line numbers and gutter hilites // - ofstch = ofst ?? $80 | '<' :: $80 | ' ' + //ofstch = ofst ?? $80 | '<' :: keyspace + ofstch = ofst ?? '<' :: ' ' huns, tens = divmod(scrnrow + 1, 100) tens, ones = divmod(tens, 10) for row = 0 to 23 @@ -619,6 +622,44 @@ def redraw#0 drawscrn(scrntop, scrnleft) curson end +def curshpos(hpos)#1 + byte needredraw + + needredraw = TRUE + if hpos < 0; hpos = 0; fin + if hpos > MAXLNLEN; hpos = MAXLNLEN; fin + curscol = hpos + cursx = curscol - scrnleft + if cursx > scrnwidth + cursx = scrnwidth + scrnleft = curscol - scrnwidth + elsif cursx < 0 + cursx = 0 + scrnleft = curscol + else + needredraw = FALSE + fin + return needredraw +end +def cursvpos(vpos)#1 + byte needredraw + + needredraw = TRUE + if vpos < 0; vpos = 0; fin + if vpos > numlines - 1; vpos = numlines - 1; fin + cursrow = vpos + cursy = cursrow - scrntop + if cursy > scrnheight + cursy = scrnheight + scrntop = cursrow - scrnheight + elsif cursy < 0 + cursy = 0 + scrntop = cursrow + else + needredraw = FALSE + fin + return needredraw +end def curshome#0 cursoff cursrow = 0 @@ -664,11 +705,15 @@ def cursup#0 fin end def pgup#0 - byte i - - for i = 0 to pgjmp - cursup - next + cursoff + if cursvpos(cursrow - pgjmp) + drawscrn(scrntop, scrnleft) + else + if flags & selection + drawgutter(scrntop, scrnleft) + fin + fin + curson end def cursdown#0 if cursrow < numlines - 1 @@ -687,11 +732,15 @@ def cursdown#0 fin end def pgdown#0 - byte i - - for i = 0 to pgjmp - cursdown - next + cursoff + if cursvpos(cursrow + pgjmp) + drawscrn(scrntop, scrnleft) + else + if flags & selection + drawgutter(scrntop, scrnleft) + fin + fin + curson end def cursleft#0 if curscol > 0 @@ -707,11 +756,15 @@ def cursleft#0 fin end def pgleft#0 - byte i - - for i = 0 to 7 - cursleft - next + cursoff + if curshpos(curscol - 8) + drawscrn(scrntop, scrnleft) + else + if flags & selection + drawgutter(scrntop, scrnleft) + fin + fin + curson end def cursright#0 if curscol < MAXLNLEN @@ -727,43 +780,21 @@ def cursright#0 fin end def pgright#0 - byte i - - for i = 0 to 7 - cursright - next -end -def curshpos(hpos)#0 - cursoff - curscol = hpos - if curscol > scrnwidth - cursx = curscol - scrnwidth - scrnleft = scrnwidth - else - cursx = curscol - scrnleft = 0 - fin - curson -end -def cursvpos(vpos)#0 - cursrow = vpos - if cursrow > numlines - 1 - cursrow = numlines - 1 - fin - if numlines > 23 and cursrow > 12 - cursy = 12 - scrntop = cursrow - 12 - else - cursy = cursrow - scrntop = 0 - fin - redraw + cursoff + if curshpos(curscol + 8) + drawscrn(scrntop, scrnleft) + else + if flags & selection + drawgutter(scrntop, scrnleft) + fin + fin + curson end // // Find string in text // def findline(strptr)#1 - byte upstr[80], scan, i + byte upstr[MAXLNLEN+1], scan, i if ^strptr >= findstr lnupcpy(@upstr, strptr) @@ -990,7 +1021,7 @@ end // Printer routines // def printtxt(slot)#0 - byte txtbuf[80] + byte txtbuf[MAXLNLEN+1] word i, scrncsw scrncsw = *csw @@ -1002,17 +1033,6 @@ def printtxt(slot)#0 next *csw = scrncsw end -def openline(row) - if numlines < MAXLINES - memcpy(@txtlinbuf=>[row + 1], @txtlinbuf=>[row], (numlines - row) * 2) - txtlinbuf=>[row] = @nullstr - numlines++ - flags = flags | changed - return TRUE - fin - bell - return FALSE -end def freesel#0 word i @@ -1097,7 +1117,7 @@ def pastesel#0 fin end def indentsel#0 - byte indentstr[80], l + byte indentstr[MAXLNLEN+1], l word firstsel, lastsel, i freesel @@ -1107,8 +1127,8 @@ def indentsel#0 if l < MAXLNLEN - 2 memcpy(@indentstr + 3, txtlinbuf=>[i] + 1, l) indentstr[0] = l + 2 - indentstr[1] = $A0 - indentstr[2] = $A0 + indentstr[1] = keyspace + indentstr[2] = keyspace delstr(txtlinbuf=>[i]) txtlinbuf=>[i] = newstr(@indentstr) flags = flags | changed @@ -1117,7 +1137,7 @@ def indentsel#0 redraw end def undentsel#0 - byte undentstr[80], l + byte undentstr[MAXLNLEN+1], l word firstsel, lastsel, i freesel @@ -1126,10 +1146,10 @@ def undentsel#0 l = ^(txtlinbuf=>[i]) if l memcpy(@undentstr + 1, txtlinbuf=>[i] + 1, l) - if undentstr[1] == $A0 + if undentstr[1] == keyspace memcpy(@undentstr + 1, @undentstr + 2, l - 1) l-- - if l and undentstr[1] == $A0 + if l and undentstr[1] == keyspace memcpy(@undentstr + 1, @undentstr + 2, l - 1) l-- fin @@ -1142,15 +1162,36 @@ def undentsel#0 next redraw end +def autoindent(strptr)#0 + byte i + + for i = 1 to ^strptr + if ^(strptr + i) <> keyspace + break + fin + next + curshpos(i - 1) +end +def openline(row) + if numlines < MAXLINES + memcpy(@txtlinbuf=>[row + 1], @txtlinbuf=>[row], (numlines - row) * 2) + txtlinbuf=>[row] = @nullstr + numlines++ + flags = flags | changed + return TRUE + fin + bell + return FALSE +end def joinline#0 - byte joinstr[80], joinlen, stripjoin[80] + byte joinstr[MAXLNLEN+1], joinlen, stripjoin[MAXLNLEN+1] if cursrow < numlines - 1 strstripcpy(@joinstr, txtlinbuf=>[cursrow]) memcpy(@stripjoin, txtlinbuf=>[cursrow + 1], ^(txtlinbuf=>[cursrow + 1]) + 1) - striplead(@stripjoin, $80 | ' '); + striplead(@stripjoin, keyspace); joinlen = joinstr + stripjoin - if joinlen < 80 + if joinlen <= MAXLNLEN curshpos(joinstr) memcpy(@joinstr + joinstr + 1, @stripjoin + 1, stripjoin) joinstr = joinlen @@ -1160,14 +1201,13 @@ def joinline#0 numlines-- memcpy(@txtlinbuf=>[cursrow + 1], @txtlinbuf=>[cursrow + 2], (numlines - cursrow) * 2) flags = flags | changed - redraw - else - bell + return fin fin + bell end def splitline#0 - byte splitstr[80], splitlen, i + byte splitstr[MAXLNLEN+1], splitlen, i if openline(cursrow + 1) if curscol @@ -1175,13 +1215,13 @@ def splitline#0 if curscol < splitlen - 1 splitstr = splitlen - curscol memcpy(@splitstr + 1, txtlinbuf=>[cursrow] + curscol + 1, splitstr) - striplead(@splitstr, $80 | ' ') + striplead(@splitstr, keyspace) for i = 1 to curscol - if ^(txtlinbuf=>[cursrow] + i) <> $80 | ' ' + if ^(txtlinbuf=>[cursrow] + i) <> keyspace break fin memcpy(@splitstr + 2, @splitstr + 1, splitstr) - splitstr[1] = $80 | ' ' + splitstr[1] = keyspace splitstr++ next txtlinbuf=>[cursrow + 1] = newstr(@splitstr) @@ -1193,7 +1233,7 @@ def splitline#0 else if splitlen > 0 for curscol = 1 to splitlen - 1 - if ^(txtlinbuf=>[cursrow] + curscol) <> $80 | ' ' + if ^(txtlinbuf=>[cursrow] + curscol) <> keyspace break fin next @@ -1204,8 +1244,6 @@ def splitline#0 txtlinbuf=>[cursrow + 1] = txtlinbuf=>[cursrow] txtlinbuf=>[cursrow] = @nullstr fin - redraw - cursdown fin end def editkey(key) @@ -1215,12 +1253,13 @@ def editkey(key) return FALSE end def editline(key) - byte editstr[80] + byte editstr[MAXLNLEN+1], localchange, need word undoline + localchange = FALSE if (editkey(key)) - flags = flags | changed - memset(@editstr, $A0A0, 80) + localchange = TRUE + memset(@editstr + 1, $A0A0, MAXLNLEN) strstripcpy(@editstr, txtlinbuf=>[cursrow]) undoline = txtlinbuf=>[cursrow] txtlinbuf=>[cursrow] = @editstr @@ -1232,13 +1271,18 @@ def editline(key) memcpy(@editstr[curscol], @editstr[curscol + 1], editstr - curscol) editstr-- fin - curshpos(curscol - 1) + cursoff + if curshpos(curscol - 1) + drawscrn(scrntop, scrnleft) + else + drawrow(cursy, scrnleft, @editstr) + fin curson fin elsif curscol < MAXLNLEN - curshpos(curscol + 1) + curscol++ if flags & insmode - if editstr < MAXLNLEN or editstr.MAXLNLEN == $A0 + if editstr < MAXLNLEN or editstr.MAXLNLEN == keyspace editstr++ if curscol >= editstr editstr = curscol @@ -1246,7 +1290,7 @@ def editline(key) memcpy(@editstr[curscol + 1], @editstr[curscol], editstr - curscol) fin else - curshpos(curscol - 1) + curscol-- key = editstr[curscol] bell fin @@ -1257,12 +1301,10 @@ def editline(key) fin editstr[curscol] = caseconv(key) cursoff - if cursx <= scrnwidth - drawrow(cursy, scrnleft, @editstr) - else - scrnleft++ - cursx = scrnwidth + if curshpos(curscol) drawscrn(scrntop, scrnleft) + else + drawrow(cursy, scrnleft, @editstr) fin curson else @@ -1282,15 +1324,21 @@ def editline(key) cursoff drawrow(cursy, scrnleft, @editstr) curson + localchange = FALSE fin key = keyin() until not editkey(key) - if editstr - txtlinbuf=>[cursrow] = newstr(@editstr) - else - txtlinbuf=>[cursrow] = @nullstr - fin - delstr(undoline) + if localchange + flags = flags | changed + delstr(undoline) + if editstr + txtlinbuf=>[cursrow] = newstr(@editstr) + else + txtlinbuf=>[cursrow] = @nullstr + fin + else + txtlinbuf=>[cursrow] = undoline + fin fin return key end @@ -1343,6 +1391,11 @@ def editmode#0 cursdown is keyctrlo openline(cursrow) + if cursrow + autoindent(txtlinbuf=>[cursrow - 1]) + else + curshpos(0) + fin redraw break is keyenter @@ -1350,12 +1403,15 @@ def editmode#0 splitline else openline(cursrow + 1) - cursdown - redraw fin + autoindent(txtlinbuf=>[cursrow]) + cursvpos(cursrow + 1) + redraw break is keyctrlt - joinline; break + joinline + redraw + break is keyctrli if flags & selection if flags & insmode