retro1/software/6502_terminal_propeller/VGA_1024v.905.spin

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++])