X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=16%2Ftweak16%2FSCREEN.CPP;fp=16%2Ftweak16%2FSCREEN.CPP;h=c232bdde4fc9960d10efc144f610df242849b3bf;hb=2b78082f0e0c4dae86463aed269aa121fdd2d449;hp=0000000000000000000000000000000000000000;hpb=3e4e5b099fc885a8a483d8afebb558d6479346c7;p=16.git diff --git a/16/tweak16/SCREEN.CPP b/16/tweak16/SCREEN.CPP new file mode 100755 index 00000000..c232bdde --- /dev/null +++ b/16/tweak16/SCREEN.CPP @@ -0,0 +1,138 @@ +/* + Screen.CPP version 1.0 + by Robert Schmidt of Ztiff Zox Softwear 1993 + + Defines some primitives for handling the screen, some screen + buffer pointers, and the functions that handle the single + temporary screen used in TWEAK. + +*/ + +#include +#include +#include +#include +#include +#include "Screen.HPP" + +char palette16[16]; +char palette256[768]; + +// editHeight and editWidth hold the dimensions of the editing screen. +// Not everything is formatted according to those horizontally, but +// vertically it should work fine. + +unsigned editMode, editHeight, editWidth, editSize; + +// Now for the screens used in TWEAK. + +// This one points to the standard VGA text screen buffer. textscr[80] +// addresses the first character/attribute pair on the second line +// if the current mode is an 80-column one, for example. + +unsigned *textScr = (unsigned far *)MK_FP(0xb800,0); + +// graphScr points to the standard VGA graphics buffer, being 64Kb. + +char *graphScr = (char far *)MK_FP(0xa000,0); + +// setBiosMode() sets the given standard BIOS mode. + +void setBiosMode(int modeno) + { + _AX = modeno; + geninterrupt(0x10); + } + +// getBiosMode() returns the current BIOS mode. + +int getBiosMode(void) + { + _AH = 0x0f; + geninterrupt(0x10); + return _AL; + } + +// The following two functions saves and restores the temporary screen. +// The tempScr buffer is allocated and destroyed each time. + +void tempBuffer::save(void) + { + if (temp) + delete[] temp; + if (!(temp = new unsigned[editSize])) + { + cout << "Out of memory for swap screen!" << endl; + exit(1); + } + memcpy(temp, link, sizeof(unsigned)*editSize); + } + +void tempBuffer::restore(void) + { + setBiosMode(3); + textmode(editMode); + if (temp) + { + memcpy(link, temp, sizeof(unsigned)*editSize); + delete[] temp; + temp = NULL; + } + } + +void getPalette16() + { + for (int c=0; c<16; c++) + { + outp(0x3c0, 0x20 | c); + palette16[c] = inp(0x3c0); + } + } + +void setEgaPalette(char *p) + { + inp(0x3da); + for (int c=0; c<16; c++) + { + outp(0x3c0, c); + outp(0x3c0, p[c]); + } + outp(0x3c0, 0x20); + } + +void setPalette16() + { + char egaPal[] = {0,1,2,3,4,5,0x14,7,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f}; + setEgaPalette(egaPal); + for (int c=0; c<16; c++) + { + outp(0x3c0, 0x20 | c); + outp(0x3c0, palette16[c]); + } + } + +void getPalette256() + { + outp(0x3c7, 0); + for (int c=0; c<768; c++) + palette256[c] = inp(0x3c9); + } + +void setPalette256() + { + char egaPal[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; + setEgaPalette(egaPal); + outp(0x3c8, 0); + for (int c=0; c<768; c++) + outp(0x3c9, palette256[c]); + } + +void preparePalettes() + { + int m=getBiosMode(); + setBiosMode(0x13); + getPalette256(); + setBiosMode(0x12); + getPalette16(); + setBiosMode(m); + } \ No newline at end of file