prog8/compiler/res/prog8lib/virtual/textio.p8

168 lines
3.6 KiB
Plaintext
Raw Normal View History

2022-03-23 00:52:01 +00:00
; Prog8 definitions for the Text I/O console routines for the Virtual Machine
%import conv
%option ignore_unused
txt {
sub width() -> ubyte {
return 80 ; just some chosen value for the 'width' of the console
}
sub height() -> ubyte {
return 30 ; just some chosen value for the 'height' of the console
}
sub clear_screen() {
str @shared sequence = "\x1b[2J\x1B[H"
%ir {{
load.w r65535,txt.clear_screen.sequence
syscall 3 (r65535.w)
}}
}
sub nl() {
chrout('\n')
}
sub spc() {
chrout(' ')
}
2022-03-27 15:46:15 +00:00
sub lowercase() {
; not supported
}
sub uppercase() {
; not supported
}
sub chrout(ubyte char) {
%ir {{
loadm.b r65535,txt.chrout.char
syscall 2 (r65535.b)
}}
}
sub bell() {
chrout(7)
}
sub print (str text) {
%ir {{
loadm.w r65535,txt.print.text
syscall 3 (r65535.w)
}}
}
sub print_ub0 (ubyte value) {
2022-03-23 00:52:01 +00:00
; ---- print the ubyte in A in decimal form, with left padding 0s (3 positions total)
conv.str_ub0(value)
print(conv.string_out)
}
sub print_ub (ubyte value) {
2022-03-23 00:52:01 +00:00
; ---- print the ubyte in decimal form, without left padding 0s
conv.str_ub(value)
print(conv.string_out)
}
sub print_b (byte value) {
2022-03-23 00:52:01 +00:00
; ---- print the byte in decimal form, without left padding 0s
conv.str_b(value)
print(conv.string_out)
}
sub print_ubhex (ubyte value, ubyte prefix) {
2022-03-23 00:52:01 +00:00
; ---- print the ubyte in hex form
if prefix
chrout('$')
conv.str_ubhex(value)
print(conv.string_out)
}
sub print_ubbin (ubyte value, ubyte prefix) {
2022-03-23 00:52:01 +00:00
; ---- print the ubyte in binary form
2022-04-08 22:49:23 +00:00
if prefix
chrout('%')
conv.str_ubbin(value)
print(conv.string_out)
}
sub print_uwbin (uword value, ubyte prefix) {
2022-03-23 00:52:01 +00:00
; ---- print the uword in binary form
2022-04-08 22:49:23 +00:00
if prefix
chrout('%')
conv.str_uwbin(value)
print(conv.string_out)
}
sub print_uwhex (uword value, ubyte prefix) {
2022-03-23 00:52:01 +00:00
; ---- print the uword in hexadecimal form (4 digits)
if prefix
chrout('$')
conv.str_uwhex(value)
print(conv.string_out)
}
sub print_uw0 (uword value) {
2022-03-23 00:52:01 +00:00
; ---- print the uword value in decimal form, with left padding 0s (5 positions total)
conv.str_uw0(value)
print(conv.string_out)
}
sub print_uw (uword value) {
2022-03-23 00:52:01 +00:00
; ---- print the uword in decimal form, without left padding 0s
conv.str_uw(value)
print(conv.string_out)
}
sub print_w (word value) {
2022-03-23 00:52:01 +00:00
; ---- print the (signed) word in decimal form, without left padding 0's
conv.str_w(value)
print(conv.string_out)
}
sub input_chars (uword buffer) -> ubyte {
2022-03-23 00:52:01 +00:00
; ---- Input a string (max. 80 chars) from the keyboard. Returns length of input. (string is terminated with a 0 byte as well)
; It assumes the keyboard is selected as I/O channel!
%ir {{
loadm.w r65534,txt.input_chars.buffer
load.b r65535,80
syscall 6 (r65534.w, r65535.b): r0.b
2023-04-11 20:28:19 +00:00
returnr.b r0
}}
}
sub plot (ubyte col, ubyte row) {
; use ANSI escape sequence to position the cursor
txt.chrout(27)
txt.chrout('[')
txt.print_ub(row)
txt.chrout(';')
txt.print_ub(col)
txt.chrout('H')
}
sub setchr (ubyte col, ubyte row, ubyte char) {
plot(col, row)
txt.chrout(char)
}
sub petscii2scr(ubyte petscii_char) -> ubyte {
; -- convert petscii character to screencode
byte[8] offsets = [128, 0, 64, 32, 64, 192, 128, 128]
return petscii_char ^ offsets[petscii_char>>5]
}
sub petscii2scr_str(str petscii_string) {
; -- convert petscii string to screencodes string
cx16.r0 = petscii_string
while @(cx16.r0)!=0 {
@(cx16.r0) = petscii2scr(@(cx16.r0))
cx16.r0++
}
}
}