ftp.nice.ch/pub/next/developer/languages/c/djgpp-NS.s.tar.gz#/djgpp/go32/mono.c

This is mono.c in view mode; [Download] [Up]

#include <stdio.h>
#include <dos.h>
#include <io.h>
#include <string.h>

#include "mono.h"

extern int use_mono;

int screen_seg = 0xb800;
int mono_attr = 0x07;

static int row=-1,col=-1;

static void mono_putc(char c)
{
  int i;
  switch (c)
  {
    case 13:
      col = 0;
      break;
    case 10:
      col = 0;
      row ++;
      if (row == 25)
      {
        for (i=160; i<24*160; i++)
          pokeb(0xb000, i, peekb(0xb000, i+160));
        for (; i<25*160; i+=2)
          poke(0xb000, i, 0x0720);
        row--;
      }
      break;
    case 9:
      do {
        col++;
      } while (col % 8);
      break;
    case 8:
      if (col > 0)
        col--;
      break;
    case 7:
      write(1, "\a", 1);
      break;
    case 12:
      for (i=0; i<25*160;)
      {
        pokeb(0xb000, i++, 0x20);
        pokeb(0xb000, i++, 0x07);
      }
      row = 6;
      col = 0;
      break;
    default:
      pokeb(0xb000, row*160+col*2, c);
      pokeb(0xb000, row*160+col*2+1, mono_attr);
      col++;
      if (col == 80)
      {
        mono_putc(10);
      }
      break;
  }
}

int printf(const char *fmt, ...)
{
  char buf[200];
  int i;
  int n = vsprintf(buf, fmt, ...);
  if (use_mono)
  {
    if (col == -1)
      mono_putc(12);

    for (i=0; buf[i]; i++)
      mono_putc(buf[i]);

    outportb(0x3b4, 15);
    outportb(0x3b5, row*80+col);
    outportb(0x3b4, 14);
    outportb(0x3b5, (row*80+col)/256);
  }
  else
    write(1, buf, strlen(buf));
  return n;
}

void mputchar(char c)
{
  if (use_mono)
  {
    mono_putc(c);
    outportb(0x3b4, 15);
    outportb(0x3b5, row*80+col);
    outportb(0x3b4, 14);
    outportb(0x3b5, (row*80+col)/256);
  }
  else
    write(1, &c, 1);
}

int mono_write(char *buf, int len)
{
  int i;
  if (col == -1)
    mono_putc(12);

  for (i=0; i<len; i++)
    mono_putc(buf[i]);

  outportb(0x3b4, 15);
  outportb(0x3b5, row*80+col);
  outportb(0x3b4, 14);
  outportb(0x3b5, (row*80+col)/256);
  return len;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.