Za tekstovni izhod na sistemu Partner obstajata dva načina, ki sta med seboj nezdružljiva:
stdout. Zaslon se obnaša kot terminal VT100/ANSI (ali VT52). Upravljamo ga z ubežnimi zaporedji (escape sequences), ki jih pišemo s funkcijami printf(), putchar() in sorodnimi iz stdio.h.conio.h, mimo CP/M. Zaslon se posodablja neposredno brez posrednika.Terminalski način je primernejši za programe, ki morajo delovati na različnih terminalih ali preusmeriti izhod v datoteko. Neposredni način je hitrejši in daje natančnejši nadzor nad zaslonom – primeren je za interaktivne programe s specifičnim videzom.
Partner v terminalskem načinu emulira terminal VT100/ANSI. Zaslonom pošiljamo ubežna zaporedja – posebne nize, ki se začnejo z znakom ESC (ASCII 27, \033). Večina ukazov za nadzor zaslona se začne z nizo CSI (Control Sequence Introducer): ESC [.
V jeziku C pišemo ESC kot \033 ali \x1b. Zaporedja pošiljamo z printf():
#include <stdio.h>
/* Briše zaslon in postavi kazalec na (1,1) */
printf("\033[2J\033[H");
Premikanje kazalca
| Zaporedje | Opis | Privzeto |
|---|---|---|
| ESC [ Pn A | Kazalec gor za Pn vrstic (ustavi pri vrhu) | 1 |
| ESC [ Pn B | Kazalec dol za Pn vrstic (ustavi pri dnu) | 1 |
| ESC [ Pn C | Kazalec desno za Pn stolpcev (ustavi pri robu) | 1 |
| ESC [ Pn D | Kazalec levo za Pn stolpcev (ustavi pri robu) | 1 |
| ESC [ H | Kazalec na izhodišče (vrstica 1, stolpec 1) | |
| ESC [ Pl ; Pc H | Kazalec na vrstico Pl, stolpec Pc | 1;1 |
| ESC [ Pl ; Pc f | Enako kot H | 1;1 |
| ESC 7 | Shrani položaj kazalca in atribute znakov | |
| ESC 8 | Obnovi položaj kazalca in atribute znakov | |
| ESC D | Indeks: pomik navzgor (kot LF); zaslon se pomakne, če je kazalec pri dnu | |
| ESC M | Obratni indeks: pomik navzdol; zaslon se pomakne, če je kazalec pri vrhu | |
| ESC E | Nova vrstica: CR + LF + pomikanje zaslona |
Brisanje
| Zaporedje | Opis | Privzeto |
|---|---|---|
| ESC [ 2 J | Briše celoten zaslon | |
| ESC [ J | Briše od kazalca do konca zaslona | |
| ESC [ 1 J | Briše od začetka zaslona do kazalca | |
| ESC [ 2 K | Briše celotno trenutno vrstico | |
| ESC [ K | Briše od kazalca do konca vrstice | |
| ESC [ 1 K | Briše od začetka vrstice do kazalca |
Atributi znakov (SGR – Select Graphic Rendition)
Zaporedje ESC [ Ps ; ... Ps m nastavi atribute za vse znake, ki sledijo. Parametri so kumulativni in ločeni s podpičjem. Privzeta vrednost je 0 (brez atributov).
| Zaporedje | Opis | Privzeto |
|---|---|---|
| ESC [ 0 m | Izključi vse atribute (normalni videz) | 0 |
| ESC [ 1 m | Krepko (bold) | |
| ESC [ 4 m | Podčrtano | |
| ESC [ 5 m | Utripajoče | |
| ESC [ 7 m | Obratni video (zamenjava barv ospredja in ozadja) |
Pomikanje zaslona
| Zaporedje | Opis | Privzeto |
|---|---|---|
| ESC [ Pt ; Pb r | Nastavi območje pomikanja; Pt = zgornja vrstica, Pb = spodnja vrstica | 1;24 |
| ESC [ r | Obnovi celotno območje pomikanja (vse vrstice) |
Tabulatorji
| Zaporedje | Opis | Privzeto |
|---|---|---|
| ESC H | Nastavi tabulator na trenutnem stolpcu | |
| ESC [ g | Odstrani tabulator na trenutnem stolpcu | |
| ESC [ 3 g | Odstrani vse tabultorje |
Načini delovanja
| Zaporedje | Opis | Privzeto |
|---|---|---|
| ESC [ 20 h | Samodejni LF: CR povzroči CR + LF | |
| ESC [ 20 l | Brez samodejnega LF: CR povzroči samo CR | |
| ESC [ ? 1 h | Kurzorske tipke v aplikacijskem načinu | |
| ESC [ ? 1 l | Kurzorske tipke v navadnem načinu | |
| ESC [ ? 3 h | Nastavi 132 stolpcev na vrstico | |
| ESC [ ? 3 l | Nastavi 80 stolpcev na vrstico | |
| ESC [ ? 4 h | Gladko pomikanje zaslona | |
| ESC [ ? 4 l | Skokovito pomikanje zaslona | |
| ESC [ ? 5 h | Svetlo ozadje | |
| ESC [ ? 5 l | Temno ozadje | |
| ESC [ ? 6 h | Relativno izhodišče (znotraj območja pomikanja) | |
| ESC [ ? 6 l | Absolutno izhodišče (celoten zaslon) | |
| ESC [ ? 7 h | Samodejna vrnitev v novo vrstico na koncu vrstice | |
| ESC [ ? 7 l | Brez samodejne vrnitve | |
| ESC [ ? 8 h | Samodejno ponavljanje tipke | |
| ESC [ ? 8 l | Brez samodejnega ponavljanja | |
| ESC [ ? 2 l | Vstopi v način VT52 | |
| ESC c | Ponastavitev terminala na začetno stanje |
Nabori znakov
Partner podpira dva niza znakov G0 in G1. Niz G0 aktiviramo s kodo SI (0x0F), niz G1 s kodo SO (0x0E). Dodelitev naborov:
| Zaporedje | Nabor | Niz |
|---|---|---|
| ESC ( B | ASCII | G0 |
| ESC ) B | ASCII | G1 |
| ESC ( Y | Jugoslovanski * | G0 |
| ESC ) Y | Jugoslovanski * | G1 |
| ESC ( E / F / G / I / N / S | Španski / Francoski / Nemški / Italijanski / Norveški / Švedski * | G0 |
| ESC ( 0 | Linijska grafika (risanje okvirov) | G0 |
| ESC ) 0 | Linijska grafika (risanje okvirov) | G1 |
* Razširitev VT100, specifična za Partner.
Atributi vrstic
| Zaporedje | Opis |
|---|---|
| ESC # 3 | Vrstica z dvojno višino (zgornja polovica), dvojna širina |
| ESC # 4 | Vrstica z dvojno višino (spodnja polovica), dvojna širina |
| ESC # 5 | Enojna širina, enojni višina (privzeto) |
| ESC # 6 | Dvojna širina, enojni višina |
| ESC # 8 | Napolni zaslon z znaki E (diagnostika) |
Način VT52
V način VT52 vstopimo z ESC [ ? 2 l, nazaj v ANSI z ESC <. VT52 ne pozna CSI – ukazi so krajši.
| Zaporedje | Opis |
|---|---|
| ESC A | Kazalec gor |
| ESC B | Kazalec dol |
| ESC C | Kazalec desno |
| ESC D | Kazalec levo |
| ESC H | Kazalec na izhodišče |
| ESC E * | Kazalec na izhodišče in briše zaslon |
| ESC I | Obratni pomik vrstice |
| ESC J | Briše od kazalca do konca zaslona |
| ESC K | Briše od kazalca do konca vrstice |
| ESC Y r c | Direktni naslov kazalca; r in c sta ASCII kodi: vrednost + 0x1F (npr. stolpec 1 = 0x20) |
| ESC F | Vstopi v grafični način (linijska grafika) |
| ESC G | Izstopi iz grafičnega načina |
| ESC 3 * | Obratni video vklopljen |
| ESC 4 * | Obratni video izklopljen |
| ESC = | Pomožna tipkovnica v aplikacijskem načinu |
| ESC > | Pomožna tipkovnica v numeričnem načinu |
| ESC < | Vstop v ANSI način |
* Razširitev, specifična za Partner.
Primer 1 – brisanje zaslona in premikanje kazalca:
#include <stdio.h>
/* Brisanje zaslona in premik kazalca na (1,1) */
printf("\033[2J\033[H");
/* Premik kazalca na vrstico 5, stolpec 10 (1-osnovano) */
printf("\033[5;10H");
/* Premik kazalca 3 vrstice navzgor */
printf("\033[3A");
/* Shrani položaj, izpiši, obnovi */
printf("\033[7"); /* shrani */
printf("Začasen izpis");
printf("\033[8"); /* obnovi */
Primer 2 – atributi znakov:
#include <stdio.h>
printf("Navadno besedilo\n");
/* Krepko */
printf("\033[1mKrepko besedilo\033[0m\n");
/* Obratni video */
printf("\033[7mObratni video\033[0m\n");
/* Podčrtano in utripajoče */
printf("\033[4;5mPodcrtano in utripajoco\033[0m\n");
Primer 3 – podajanje parametrov v naprednejše klice:
Kadar koordinate ali atribute ne poznamo vnaprej, sestavimo zaporedje s printf():
#include <stdio.h>
/* Premik na poljubno pozicijo (1-osnovano) */
void goto_rc(int row, int col) {
printf("\033[%d;%dH", row, col);
}
/* Nastavi SGR atribut */
void set_attr(int attr) {
printf("\033[%dm", attr);
}
/* Nastavi območje pomikanja */
void set_scroll(int top, int bot) {
printf("\033[%d;%dr", top, bot);
}
/* Primer: izpiši naslov na vrstici 1, vrstico 2-23 pomika */
goto_rc(1, 1);
set_attr(7); /* obratni video */
printf("%-80s", "NASLOV PROGRAMA");
set_attr(0);
set_scroll(2, 23); /* pomikanje samo od vrstice 2 do 23 */
Knjižnica <partner/conio.h> omogoča neposredno pisanje v pomnilnik zaslona, mimo CP/M. Zaslon Partner ima 80 stolpcev in 24 vrstic. Koordinate so 0-osnovane: gotoxy(0, 0) pomeni zgornji levi kot.
Primer 1 – osnoven izpis:
#include <partner/conio.h>
clrscr(); /* Počisti zaslon, kazalec na (0,0) */
gotoxy(0, 0);
cputs("Pozdravljen, Partner!\r\n");
cprintf("Vrednost: %d\r\n", 42);
Primer 2 – atributi znakov:
#include <partner/conio.h>
clrscr();
gotoxy(0, 0);
setattr(AT_NORMAL);
cputs("Navadno ");
setattr(AT_HIGHLIGHT);
cputs("Poudarjeno ");
setattr(AT_REVERSE);
cputs("Obratni video ");
setattr(AT_UNDERLINE);
cputs("Podcrtano ");
setattr(AT_BLINK);
cputs("Utripajoco");
setattr(AT_NORMAL); /* Ponastavi atribute */
Primer 3 – centriran izpis besedila:
#include <partner/conio.h>
#include <string.h>
#define SCREEN_COLS 80
#define SCREEN_ROWS 24
void center(int row, const char *text) {
int col = (SCREEN_COLS - (int)strlen(text)) / 2;
if (col < 0) col = 0;
gotoxy(col, row);
cputs(text);
}
clrscr();
center(SCREEN_ROWS / 2, "Pozdravljen, svet!");
Primer 4 – branje znaka z zaslona:
#include <partner/conio.h>
char ch;
unsigned char attr;
/* Preberi znak in atribut na položaju (10, 5) */
gotoxy(10, 5);
rdchat(&ch, &attr);
cprintf("Znak: %c Atribut: %02X\r\n", ch, attr);