Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

8. TEKSTOVNI PROGRAMI

===================

8.1. DVA NAČINA ZASLONSKEGA IZHODA

Za tekstovni izhod na sistemu Partner obstajata dva načina, ki sta med seboj nezdružljiva:

  • Terminalski način – izhod poteka prek CP/M BDOS prek standardnega izhoda 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.
  • Neposredni način (conio) – program piše znake in atribute neposredno v pomnilnik zaslona prek knjižnice conio.h, mimo CP/M. Zaslon se posodablja neposredno brez posrednika.
Opozorilo: Obeh načinov ne smemo mešati v istem programu. CP/M vzdržuje notranje stanje zaslona, ki se ob neposrednem pisanju v pomnilnik ne posodablja. Mešanje povzroči nepredvidljivo vedenje zaslona.

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 WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

8.2. TERMINALSKI NAČIN (VT100/ANSI)

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

ZaporedjeOpisPrivzeto
ESC [ Pn AKazalec gor za Pn vrstic (ustavi pri vrhu)1
ESC [ Pn BKazalec dol za Pn vrstic (ustavi pri dnu)1
ESC [ Pn CKazalec desno za Pn stolpcev (ustavi pri robu)1
ESC [ Pn DKazalec levo za Pn stolpcev (ustavi pri robu)1
ESC [ HKazalec na izhodišče (vrstica 1, stolpec 1)
ESC [ Pl ; Pc HKazalec na vrstico Pl, stolpec Pc1;1
ESC [ Pl ; Pc fEnako kot H1;1
ESC 7Shrani položaj kazalca in atribute znakov
ESC 8Obnovi položaj kazalca in atribute znakov
ESC DIndeks: pomik navzgor (kot LF); zaslon se pomakne, če je kazalec pri dnu
ESC MObratni indeks: pomik navzdol; zaslon se pomakne, če je kazalec pri vrhu
ESC ENova vrstica: CR + LF + pomikanje zaslona

Brisanje

ZaporedjeOpisPrivzeto
ESC [ 2 JBriše celoten zaslon
ESC [ JBriše od kazalca do konca zaslona
ESC [ 1 JBriše od začetka zaslona do kazalca
ESC [ 2 KBriše celotno trenutno vrstico
ESC [ KBriše od kazalca do konca vrstice
ESC [ 1 KBriše od začetka vrstice do kazalca
Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

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).

ZaporedjeOpisPrivzeto
ESC [ 0 mIzključi vse atribute (normalni videz)0
ESC [ 1 mKrepko (bold)
ESC [ 4 mPodčrtano
ESC [ 5 mUtripajoče
ESC [ 7 mObratni video (zamenjava barv ospredja in ozadja)

Pomikanje zaslona

ZaporedjeOpisPrivzeto
ESC [ Pt ; Pb rNastavi območje pomikanja; Pt = zgornja vrstica, Pb = spodnja vrstica1;24
ESC [ rObnovi celotno območje pomikanja (vse vrstice)

Tabulatorji

ZaporedjeOpisPrivzeto
ESC HNastavi tabulator na trenutnem stolpcu
ESC [ gOdstrani tabulator na trenutnem stolpcu
ESC [ 3 gOdstrani vse tabultorje

Načini delovanja

ZaporedjeOpisPrivzeto
ESC [ 20 hSamodejni LF: CR povzroči CR + LF
ESC [ 20 lBrez samodejnega LF: CR povzroči samo CR
ESC [ ? 1 hKurzorske tipke v aplikacijskem načinu
ESC [ ? 1 lKurzorske tipke v navadnem načinu
ESC [ ? 3 hNastavi 132 stolpcev na vrstico
ESC [ ? 3 lNastavi 80 stolpcev na vrstico
ESC [ ? 4 hGladko pomikanje zaslona
ESC [ ? 4 lSkokovito pomikanje zaslona
ESC [ ? 5 hSvetlo ozadje
ESC [ ? 5 lTemno ozadje
ESC [ ? 6 hRelativno izhodišče (znotraj območja pomikanja)
ESC [ ? 6 lAbsolutno izhodišče (celoten zaslon)
ESC [ ? 7 hSamodejna vrnitev v novo vrstico na koncu vrstice
ESC [ ? 7 lBrez samodejne vrnitve
ESC [ ? 8 hSamodejno ponavljanje tipke
ESC [ ? 8 lBrez samodejnega ponavljanja
ESC [ ? 2 lVstopi v način VT52
ESC cPonastavitev terminala na začetno stanje
Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

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:

ZaporedjeNaborNiz
ESC ( BASCIIG0
ESC ) BASCIIG1
ESC ( YJugoslovanski *G0
ESC ) YJugoslovanski *G1
ESC ( E / F / G / I / N / SŠpanski / Francoski / Nemški / Italijanski / Norveški / Švedski *G0
ESC ( 0Linijska grafika (risanje okvirov)G0
ESC ) 0Linijska grafika (risanje okvirov)G1

* Razširitev VT100, specifična za Partner.

Atributi vrstic

ZaporedjeOpis
ESC # 3Vrstica z dvojno višino (zgornja polovica), dvojna širina
ESC # 4Vrstica z dvojno višino (spodnja polovica), dvojna širina
ESC # 5Enojna širina, enojni višina (privzeto)
ESC # 6Dvojna širina, enojni višina
ESC # 8Napolni 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.

ZaporedjeOpis
ESC AKazalec gor
ESC BKazalec dol
ESC CKazalec desno
ESC DKazalec levo
ESC HKazalec na izhodišče
ESC E *Kazalec na izhodišče in briše zaslon
ESC IObratni pomik vrstice
ESC JBriše od kazalca do konca zaslona
ESC KBriše od kazalca do konca vrstice
ESC Y r cDirektni naslov kazalca; r in c sta ASCII kodi: vrednost + 0x1F (npr. stolpec 1 = 0x20)
ESC FVstopi v grafični način (linijska grafika)
ESC GIzstopi 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.

Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

8.3. PRIMERI TERMINALSKEGA NAČINA

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 */
Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

8.4. NEPOSREDNI NAČIN (CONIO.H)

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);