mirror of
https://github.com/jonthomasson/retro1.git
synced 2024-06-10 05:29:33 +00:00
647 lines
17 KiB
Plaintext
647 lines
17 KiB
Plaintext
|
'' VGA_1024.spin
|
||
|
''
|
||
|
'' MODIFIED BY VINCE BRIEL FOR POCKETERM FEATURES
|
||
|
'' MODIIFED BY JEFF LEDGER / AKA OLDBITCOLLECTOR
|
||
|
''
|
||
|
|
||
|
CON
|
||
|
cols = 128 '128 ' number of screen columns
|
||
|
rows = 64 '64 ' number of screen rows
|
||
|
chars = rows*cols ' number of screen characters
|
||
|
esc = $CB ' keyboard esc char
|
||
|
rowsnow = 36 ' adjusted for split screen effect
|
||
|
chars1 = rowsnow*cols ' adjusted value for split screen effect
|
||
|
cols1 = 81 ' adjusted value for 80th character
|
||
|
TURQUOISE = $29
|
||
|
|
||
|
OBJ
|
||
|
vga : "vga_Hires_Text"
|
||
|
|
||
|
VAR
|
||
|
byte screen[chars] ' screen character buffer
|
||
|
word colors[rows] ' color specs for each screen row (see ColorPtr description above)
|
||
|
byte cursor[6] ' cursor info array (see CursorPtr description above)
|
||
|
long sync, loc, xloc, yloc ' sync used by VGA routine, others are local screen pointers
|
||
|
long kbdreq ' global val of kbdflag
|
||
|
long BR[8]
|
||
|
long Brate
|
||
|
byte inverse
|
||
|
byte invs
|
||
|
PUB start(BasePin) | i, char
|
||
|
|
||
|
|
||
|
''start vga
|
||
|
vga.start(BasePin, @screen, @colors, @cursor, @sync)
|
||
|
waitcnt(clkfreq * 1 + cnt) 'wait 1 second for cogs to start
|
||
|
|
||
|
''init screen colors to gold on blue
|
||
|
repeat i from 0 to rows - 1
|
||
|
colors[i] := $08F0 '$2804 (if you want cyan on blue)
|
||
|
|
||
|
''init cursor attributes
|
||
|
cursor[2] := %110 ' init cursor to underscore with slow blink
|
||
|
BR[0]:=300
|
||
|
BR[1]:=1200
|
||
|
BR[2]:=2400
|
||
|
BR[3]:=4800
|
||
|
BR[4]:=9600
|
||
|
BR[5]:=19200
|
||
|
BR[6]:=38400
|
||
|
BR[7]:=57600
|
||
|
BR[8]:=115200
|
||
|
xloc := cursor[0] := 0
|
||
|
yloc := cursor[1] := 0
|
||
|
loc := xloc + yloc*cols
|
||
|
|
||
|
PUB inv(c)
|
||
|
inverse:=c
|
||
|
PUB cursorset(c) | i
|
||
|
i:=%000
|
||
|
if c == 1
|
||
|
i:= %001
|
||
|
if c == 2
|
||
|
i:= %010
|
||
|
if c == 3
|
||
|
i:= %011
|
||
|
if c == 4
|
||
|
i:= %101
|
||
|
if c == 5
|
||
|
i:= %110
|
||
|
if c == 6
|
||
|
i:= %111
|
||
|
if c == 7
|
||
|
i:= %000
|
||
|
cursor[2] := i
|
||
|
PUB bin(value, digits)
|
||
|
|
||
|
'' Print a binary number, specify number of digits
|
||
|
|
||
|
repeat while digits > 32
|
||
|
out("0")
|
||
|
digits--
|
||
|
|
||
|
value <<= 32 - digits
|
||
|
|
||
|
repeat digits
|
||
|
out((value <-= 1) & 1 + "0")
|
||
|
|
||
|
'PUB binFP(value) | bitnum, bit, bitval
|
||
|
'' Prints FP long in special Binary format: sign, exp, mantissa
|
||
|
|
||
|
' repeat bitnum from 31 to 0
|
||
|
' bit := 1 << bitnum ' create mask bit
|
||
|
' bitval := (bit & value) >> bitnum ' extract bit and shift back to bit 0
|
||
|
|
||
|
' bin(bitval, 1) ' display one bit
|
||
|
|
||
|
' case bitnum
|
||
|
' 27,20,16,12,8,4: out($20) ' space after every 4 in group
|
||
|
' 31,23: str(string(" ")) ' two after sign and exponent
|
||
|
|
||
|
PUB insertat(amount) | i,j,len
|
||
|
len := (cols - xloc) - amount
|
||
|
i := @screen 'starting location
|
||
|
i := i + loc
|
||
|
j := i + amount 'new location which is plus 1?
|
||
|
bytemove(j,i, len) ' move chars over one
|
||
|
bytefill(i, $20,amount)
|
||
|
|
||
|
PUB delp(amount) | i,j,len
|
||
|
|
||
|
len := (cols - xloc) - amount
|
||
|
i := @screen 'starting location
|
||
|
i := i + loc
|
||
|
j := i + amount 'new location which is plus 1?
|
||
|
bytemove(i,j, len) ' move chars over one
|
||
|
'bytefill(j, $20,amount)
|
||
|
|
||
|
PUB cls(c,screencolor,pcport,ascii,CR) | i,x,y
|
||
|
|
||
|
|
||
|
x :=xloc
|
||
|
y := yloc
|
||
|
invs := inverse
|
||
|
clrbtm(TURQUOISE)
|
||
|
longfill(@screen, $20202020, chars/4)
|
||
|
xloc := 0
|
||
|
yloc :=0
|
||
|
loc := xloc + yloc*cols
|
||
|
repeat 80
|
||
|
out(32)
|
||
|
xloc := 0
|
||
|
yloc :=36
|
||
|
loc := xloc + yloc*cols
|
||
|
inverse := 1
|
||
|
str(string(" 6502 SATCOM V1.2 "))
|
||
|
inverse := 0
|
||
|
str(string("Baud Rate: "))
|
||
|
i:= BR[c]
|
||
|
dec(i)
|
||
|
str(string(" "))
|
||
|
xloc := 18
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("Color "))
|
||
|
str(string("PC Port: "))
|
||
|
if pcport == 1
|
||
|
str(string("OFF "))
|
||
|
if pcport == 0
|
||
|
str(string("ON "))
|
||
|
str(string(" Force 7 bit: "))
|
||
|
if ascii == 0
|
||
|
str(string("NO "))
|
||
|
if ascii == 1
|
||
|
str(string("YES "))
|
||
|
str(string(" Cursor CR W/LF: "))
|
||
|
if CR == 1
|
||
|
str(string("YES"))
|
||
|
if CR == 0
|
||
|
str(string("NO "))
|
||
|
out(13)
|
||
|
out(10)
|
||
|
|
||
|
inverse:=1
|
||
|
xloc := 6
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("F1"))
|
||
|
xloc := 19
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("F2"))
|
||
|
xloc := 30
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("F3"))
|
||
|
xloc := 46
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("F4"))
|
||
|
xloc := 58
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("F5"))
|
||
|
xloc := 70
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("F6"))
|
||
|
inverse := invs
|
||
|
xloc := cursor[0] := x 'right & left was 0
|
||
|
yloc := cursor[1] := y 'from top was 1
|
||
|
loc := xloc + yloc*cols
|
||
|
|
||
|
PUB clsupdate(c,screencolor,PCPORT,ascii,CR) | i,x,y,locold
|
||
|
|
||
|
invs := inverse
|
||
|
locold := loc
|
||
|
x := xloc
|
||
|
y := yloc
|
||
|
clrbtm(TURQUOISE)
|
||
|
xloc := 0
|
||
|
yloc :=36
|
||
|
loc := xloc + yloc*cols
|
||
|
inverse := 1
|
||
|
str(string(" PockeTerm V.905 "))
|
||
|
inverse := 0
|
||
|
xloc := 0
|
||
|
yloc :=37
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("Baud Rate: "))
|
||
|
i:= BR[c]
|
||
|
dec(i)
|
||
|
str(string(" "))
|
||
|
xloc := 18
|
||
|
loc := xloc + yloc*cols
|
||
|
|
||
|
str(string("Color "))
|
||
|
str(string("PC Port: "))
|
||
|
if pcport == 1
|
||
|
str(string("OFF "))
|
||
|
if pcport == 0
|
||
|
str(string("ON "))
|
||
|
str(string(" Force 7 bit: "))
|
||
|
if ascii == 0
|
||
|
str(string("NO "))
|
||
|
if ascii == 1
|
||
|
str(string("YES "))
|
||
|
str(string(" Cursor CR W/LF: "))
|
||
|
if CR == 1
|
||
|
str(string("YES"))
|
||
|
if CR == 0
|
||
|
str(string("NO "))
|
||
|
xloc := 0
|
||
|
yloc :=38
|
||
|
loc := xloc + yloc*cols
|
||
|
inverse:=1
|
||
|
xloc := 6
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("F1"))
|
||
|
xloc := 19
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("F2"))
|
||
|
xloc := 30
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("F3"))
|
||
|
xloc := 46
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("F4"))
|
||
|
xloc := 58
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("F5"))
|
||
|
xloc := 70
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string("F6"))
|
||
|
inverse := invs
|
||
|
xloc := cursor[0] := x
|
||
|
yloc := cursor[1] := y
|
||
|
' loc := xloc + yloc*cols
|
||
|
loc := locold
|
||
|
|
||
|
PUB clearlinefromcursor | x,xx,y, loop
|
||
|
|
||
|
y := cursor[1] 'yloc
|
||
|
x := cursor[0] 'xloc
|
||
|
xx := cursor[0] 'xloc
|
||
|
|
||
|
repeat until xx == 80
|
||
|
out(32)
|
||
|
xx++
|
||
|
|
||
|
yloc := cursor[1] := y
|
||
|
xloc := cursor[0] := x
|
||
|
loc := xloc + yloc*cols
|
||
|
|
||
|
PUB clearlinetocursor | x,y,loop
|
||
|
|
||
|
x := xloc
|
||
|
xloc := loop := 0
|
||
|
loc := xloc + yloc*cols
|
||
|
repeat until loop == x
|
||
|
out(32)
|
||
|
loop++
|
||
|
xloc := x
|
||
|
loc := xloc + yloc*cols
|
||
|
|
||
|
PUB clearline | x,y
|
||
|
|
||
|
x := xloc
|
||
|
xloc := 0
|
||
|
loc := xloc + yloc*cols
|
||
|
repeat 80
|
||
|
out(32)
|
||
|
xloc := x
|
||
|
loc := xloc + yloc*cols
|
||
|
|
||
|
PUB clsfromcursordown | x,y,loop,i
|
||
|
x:=xloc
|
||
|
y:=yloc
|
||
|
|
||
|
i := rowsnow - y
|
||
|
i--
|
||
|
'xloc :=0
|
||
|
loop := 0
|
||
|
'loc := xloc + yloc*cols
|
||
|
repeat until xloc == 80
|
||
|
out(32)
|
||
|
xloc := 0
|
||
|
yloc++
|
||
|
loc := xloc + yloc*cols
|
||
|
loop := yloc
|
||
|
repeat until loop == rowsnow
|
||
|
str(string(" "))
|
||
|
loop++
|
||
|
xloc := cursor[0] := x
|
||
|
yloc := cursor[1] := y
|
||
|
loc := xloc + yloc*cols
|
||
|
|
||
|
PUB clstocursor | x,y,z,loop 'working correctly now
|
||
|
y := yloc
|
||
|
x := xloc
|
||
|
xloc :=0
|
||
|
loc := xloc + yloc*cols
|
||
|
repeat until xloc == x
|
||
|
out(32)
|
||
|
yloc := 0
|
||
|
z:=0
|
||
|
'repeat until z == y-1
|
||
|
repeat until z == y
|
||
|
yloc := z
|
||
|
xloc :=0
|
||
|
loc := xloc + yloc*cols
|
||
|
str(string(" "))
|
||
|
z:= z + 1
|
||
|
' yloc--
|
||
|
' repeat until yloc <= 0
|
||
|
' xloc :=0
|
||
|
' loc := xloc + yloc*cols
|
||
|
' repeat 80
|
||
|
' out(65)
|
||
|
' yloc--
|
||
|
' xloc := 0
|
||
|
' loc := xloc + yloc*cols
|
||
|
' repeat 80
|
||
|
' out(32)
|
||
|
xloc := cursor[0] := x
|
||
|
yloc := cursor[1] := y
|
||
|
loc := xloc + yloc*cols
|
||
|
|
||
|
PUB home
|
||
|
|
||
|
xloc := cursor[0] := 0 'right & left
|
||
|
yloc := cursor[1] := 0 'from top 'was 1
|
||
|
loc := xloc + yloc*cols
|
||
|
|
||
|
PUB color(ColorVal) | i
|
||
|
''reset screen colors
|
||
|
repeat i from 0 to rowsnow - 1
|
||
|
colors[i] := $0000 + ColorVal
|
||
|
|
||
|
PUB clrbtm(ColorVal) | i
|
||
|
repeat i from 36 to rows - 1 'was 35
|
||
|
colors[i] := $0000 + ColorVal
|
||
|
PUB rowcolor(ColorVal, row)
|
||
|
'' reset row color to colorval
|
||
|
if row > rows-1
|
||
|
row := rows-1
|
||
|
|
||
|
colors[row] := $0000 + ColorVal
|
||
|
|
||
|
|
||
|
PUB cursloc(x, y)
|
||
|
|
||
|
'' move cursor to x, y position
|
||
|
|
||
|
'my code fix for y axis 1 is actually 0
|
||
|
' y--
|
||
|
|
||
|
|
||
|
xloc := cursor[0] := x
|
||
|
yloc := cursor[1] := y
|
||
|
loc := xloc + yloc*cols
|
||
|
PUB cursrow(y)
|
||
|
|
||
|
'' move cursor to y position
|
||
|
|
||
|
' xloc := cursor[0] := x
|
||
|
yloc := cursor[1] := y
|
||
|
loc := xloc + yloc*cols
|
||
|
PUB dec(value) | i
|
||
|
|
||
|
'' Print a decimal number
|
||
|
|
||
|
if value < 0
|
||
|
-value
|
||
|
out("-")
|
||
|
|
||
|
i := 1_000_000_000
|
||
|
|
||
|
repeat 10
|
||
|
if value => i
|
||
|
out(value/i + "0")
|
||
|
value //= i
|
||
|
result~~
|
||
|
elseif result or i == 1
|
||
|
out("0")
|
||
|
i /= 10
|
||
|
|
||
|
PUB hex(value, digits)
|
||
|
|
||
|
'' Print a hexadecimal number, specify number of digits
|
||
|
|
||
|
repeat while digits > 8
|
||
|
out("0")
|
||
|
digits--
|
||
|
|
||
|
value <<= (8 - digits) << 2
|
||
|
|
||
|
repeat digits
|
||
|
out(lookupz((value <-= 4) & $f : "0".."9", "A".."F"))
|
||
|
|
||
|
PUB scrollD | i,len,y,dest,source
|
||
|
|
||
|
y := yloc * cols
|
||
|
i := @screen
|
||
|
dest := i + y
|
||
|
source := dest + cols
|
||
|
len := (chars1-y-80)/4
|
||
|
longmove(source, dest, len)
|
||
|
longfill(dest,$20202020, cols/4)
|
||
|
|
||
|
|
||
|
|
||
|
PUB scrollM | i,y,dest,source,len
|
||
|
'longmove(dest,source,length)
|
||
|
y := yloc * cols
|
||
|
i := @screen
|
||
|
dest := i + y
|
||
|
'len := (chars1-y)/4
|
||
|
len := (chars1-y-80)/4
|
||
|
source := dest + cols
|
||
|
longmove(dest,source,len)
|
||
|
|
||
|
|
||
|
PRI newline | i, j, len
|
||
|
if ++yloc == rowsnow ' if last line on screen, shift all up was just rows now says rowsnow
|
||
|
yloc-- ' reset yloc it at bottom of screen
|
||
|
i := @screen
|
||
|
i += cols
|
||
|
len := (chars1 - cols)/4 'was chars now rowsnow*cols (rowsnow*cols)
|
||
|
longmove(@screen, i, len) ' shift screen up one line
|
||
|
|
||
|
i := @screen
|
||
|
i += ((rowsnow*cols) - cols) ' set "i" for use below WAS CHARS NOW ROWSNOW*COLS
|
||
|
|
||
|
else ' if not last line, shift lines down
|
||
|
i := @screen
|
||
|
i += (rowsnow - 2)*cols ' init ptr to start of next-to-last line was -2 now -1
|
||
|
|
||
|
'if yloc < rows - 1
|
||
|
' repeat j from rows - 2 to yloc
|
||
|
' longmove(i + cols, i, cols/4) ' shift one line down
|
||
|
' i -= cols ' move i up one line
|
||
|
|
||
|
i += cols ' point to start of last line moved
|
||
|
|
||
|
longfill(i, $20202020, cols/4) ' clear the last line moved
|
||
|
|
||
|
|
||
|
j := i - cols + xloc ' point to original cursor location
|
||
|
bytemove(i, j, cols - xloc) ' move chars from cursor pos down to start of next line
|
||
|
|
||
|
bytefill(j, $20, cols - xloc) ' clear original part of line that was moved
|
||
|
|
||
|
xloc := cursor[0] := 0 ' reset xloc, loc and cursor position
|
||
|
cursor[1] := yloc
|
||
|
loc := yloc*cols
|
||
|
PRI linefeed | i, j, len
|
||
|
if ++yloc == rowsnow ' if last line on screen, shift all up was just rows now says rowsnow
|
||
|
yloc-- ' reset yloc it at bottom of screen
|
||
|
i := @screen
|
||
|
|
||
|
|
||
|
i += cols
|
||
|
|
||
|
len := (chars1 - cols)/4 'was chars now rowsnow*cols (rowsnow*cols)
|
||
|
longmove(@screen, i, len) ' shift screen up one line
|
||
|
|
||
|
i := @screen
|
||
|
i += ((rowsnow*cols) - cols) ' set "i" for use below WAS CHARS NOW ROWSNOW*COLS
|
||
|
|
||
|
else ' if not last line, shift lines down
|
||
|
i := @screen
|
||
|
i += (rowsnow - 2)*cols ' init ptr to start of next-to-last line was -2 now -1
|
||
|
i += cols ' point to start of last line moved
|
||
|
longfill(i, $20202020, cols/4) ' clear the last line moved
|
||
|
'j := i - cols + xloc ' point to original cursor location
|
||
|
j := i + xloc
|
||
|
bytemove(i, j, cols - xloc) ' move chars from cursor pos down to start of next line
|
||
|
|
||
|
bytefill(j, $20, cols - xloc) ' clear original part of line that was moved
|
||
|
|
||
|
cursor[1] := yloc
|
||
|
cursor[0] := xloc
|
||
|
loc := xloc + (yloc*cols)
|
||
|
PUB out(c) | i, j
|
||
|
'' Print a character
|
||
|
''
|
||
|
'' $09 = tab
|
||
|
'' $0A = Linefeed
|
||
|
'' $0D = return -> CR
|
||
|
'' $20..$7E = display character
|
||
|
'' $7F = skip
|
||
|
'' $C0 left arrow
|
||
|
'' $C1 = right arrow
|
||
|
'' $C2 = up arrow
|
||
|
'' $C3 = down arrow
|
||
|
'' $C4 = home key - go to beginning of line
|
||
|
'' $C5 = end key - go past last char on line
|
||
|
'' $C6 = page up key - skip this key
|
||
|
'' $C7 = page down key - skip this key
|
||
|
'' $C8 = backspace key
|
||
|
'' $C9 = delete key
|
||
|
'' $CA = insert key - skip this key
|
||
|
'' $CB = esc - skip this key
|
||
|
'' $CC = left arrow don't scroll up
|
||
|
case c
|
||
|
$09: ' tab command
|
||
|
repeat
|
||
|
out($C1) ' recursive call to out( )
|
||
|
while xloc & 7 ' tab to multiples of 8
|
||
|
'while xloc & 3 ' tab to multiples of 4
|
||
|
$0A:
|
||
|
linefeed
|
||
|
$0D: ' CR, return to start of line
|
||
|
if xloc
|
||
|
repeat
|
||
|
out($C0) ' recursive call to shift left until at leftmost edge
|
||
|
while xloc
|
||
|
$20..$7E: ' character
|
||
|
|
||
|
if inverse==1 'check for inverse character mode
|
||
|
c:=c + $80 'add for inverse
|
||
|
if ++xloc == cols1
|
||
|
xloc := xloc - 1
|
||
|
newline
|
||
|
xloc := cursor[0] := 1
|
||
|
screen[loc++] := c ' output the character
|
||
|
cursor[0] := xloc
|
||
|
cursor[1] := yloc
|
||
|
|
||
|
|
||
|
|
||
|
$C0: ' left arrow
|
||
|
if loc ' skip this if at upper left screen
|
||
|
loc--
|
||
|
if xloc
|
||
|
xloc--
|
||
|
else
|
||
|
xloc := cols - 1
|
||
|
yloc--
|
||
|
cursor[0] := xloc
|
||
|
cursor[1] := yloc
|
||
|
|
||
|
|
||
|
|
||
|
$C1: ' right arrow
|
||
|
if loc <> chars1 - 1 ' skip if at lower right of screen
|
||
|
loc++
|
||
|
if xloc <> cols - 1
|
||
|
xloc++
|
||
|
else
|
||
|
xloc := 0
|
||
|
yloc++
|
||
|
cursor[0] := xloc
|
||
|
cursor[1] := yloc
|
||
|
|
||
|
$C2: ' up arrow
|
||
|
if yloc ' skip if yloc at top of screen
|
||
|
yloc-- ' move yloc up one row
|
||
|
loc -= cols ' move loc var back one row
|
||
|
cursor[1] := yloc ' reset 'y' cursor position
|
||
|
|
||
|
$C3: ' down arrow
|
||
|
if yloc <> rowsnow - 1 ' skip if at bottom of screen
|
||
|
yloc++ ' move yloc dowm one row
|
||
|
loc += cols ' move loc var down one row
|
||
|
cursor[1] := yloc
|
||
|
|
||
|
$C4: ' home key - move to 1st char of line
|
||
|
xloc := cursor[0] := 0
|
||
|
loc := xloc + yloc*cols
|
||
|
|
||
|
$C5: ' end key - move to last char of line
|
||
|
if xloc <> cols - 1
|
||
|
repeat xloc from cols - 1 to 0
|
||
|
loc := xloc + yloc*cols
|
||
|
if screen[loc] <> $20 ' continue until first non-space char
|
||
|
if xloc <> cols - 1
|
||
|
xloc++ ' move past non-blank char
|
||
|
loc++
|
||
|
quit
|
||
|
|
||
|
cursor[0] := xloc ' loc is already reset from above
|
||
|
|
||
|
$C8: ' backspace
|
||
|
if loc ' skip if at upper left of screen
|
||
|
if xloc ' do 'else' if at start of line
|
||
|
xloc-- ' xloc left one space
|
||
|
loc--
|
||
|
|
||
|
i := @screen ' calculate
|
||
|
i += xloc + yloc*cols ' destination for shift left one
|
||
|
bytemove(i, i+1, cols - xloc - 1)
|
||
|
screen[cols - 1 + yloc*cols] := $20
|
||
|
|
||
|
else ' here if xloc == 0
|
||
|
if screen[loc-1] == $20 ' last char on prev line
|
||
|
yloc--
|
||
|
|
||
|
i := @screen ' calculate
|
||
|
i += loc - 1 ' destination for shift left one
|
||
|
|
||
|
repeat while screen[--loc] == $20
|
||
|
bytemove(i, i+1, cols) ' move one row's worth of chars
|
||
|
i-- ' dec "i" to correspond to --loc
|
||
|
|
||
|
screen[loc + cols] := $20 ' clear old char
|
||
|
|
||
|
if ++xloc == cols ' use xloc as counter here, 0..., don't move > 1 row
|
||
|
loc-- ' make as if loc had been bumped above B4 we quit
|
||
|
quit
|
||
|
|
||
|
loc++ ' bump loc to space char
|
||
|
xloc := loc - yloc*cols ' re-calculate xloc from loc and yloc
|
||
|
|
||
|
cursor[0] := xloc ' reset cursor loc
|
||
|
cursor[1] := yloc
|
||
|
|
||
|
$C9: ' delete
|
||
|
if xloc == cols - 1
|
||
|
screen[loc] := $20 ' if at last char on line, clear it and exit
|
||
|
|
||
|
else
|
||
|
repeat i from xloc to cols - 2
|
||
|
j := i + yloc*cols
|
||
|
screen[j] := screen[j+1]
|
||
|
|
||
|
screen[j+1] := $20 ' clear last char on line after shift left
|
||
|
|
||
|
PUB str(string_ptr)
|
||
|
|
||
|
'' Print a zero terminated string
|
||
|
|
||
|
repeat strsize(string_ptr)
|
||
|
out(byte[string_ptr++])
|