1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-01-08 22:30:48 +00:00

Fix some editor redraw issues

This commit is contained in:
David Schmenk 2019-12-15 13:24:26 -08:00
parent 72ddf025e3
commit bc45a9263c
4 changed files with 175 additions and 118 deletions

View File

@ -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

Binary file not shown.

Binary file not shown.

View File

@ -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