59 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <Gigatron.h>
 | 
						|
 | 
						|
void PutChar(int c)
 | 
						|
{
 | 
						|
  byte *bitmap;
 | 
						|
  int i;
 | 
						|
 | 
						|
  // Accept newlines
 | 
						|
  if (c == '\n') {
 | 
						|
    Newline();
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  // Automatic line wrapping
 | 
						|
  if (((byte*)&ScreenPos)[0] > 160-6)
 | 
						|
    Newline();
 | 
						|
 | 
						|
  // Avoid writing outside screen memory
 | 
						|
  // This also forces a newline if ScreenPos is still 0 after startup
 | 
						|
  i = ((byte*)&ScreenPos)[1]; // ScreenPos high byte
 | 
						|
  if (((i-8) & 255) > 120-8)
 | 
						|
    Newline();
 | 
						|
 | 
						|
  // Ignore non-printable characters
 | 
						|
  // XXX This still can print rubish?
 | 
						|
  i = c - 32;
 | 
						|
  if ((unsigned)i >= 128-32)
 | 
						|
    return;
 | 
						|
 | 
						|
  // Select bitmap for character from built-in font
 | 
						|
  if (i < 82-32)
 | 
						|
    bitmap = font32up; // char 32..81
 | 
						|
  else {
 | 
						|
    i -= 82-32;
 | 
						|
    bitmap = font82up; // char 82..127
 | 
						|
  }
 | 
						|
  bitmap = &bitmap[(i << 2) + i];
 | 
						|
 | 
						|
  // Prepare SYS call
 | 
						|
  sysFn = SYS_VDrawBits_134;
 | 
						|
  sysArgs[0] = BgColor;
 | 
						|
  sysArgs[1] = Color;
 | 
						|
  *(int*)(sysArgs+4) = ScreenPos;
 | 
						|
 | 
						|
  // Draw bitmap to screen as 5 vertical slices
 | 
						|
  for (i=5; i>0; --i, bitmap++) {
 | 
						|
    sysArgs[2] = __lookup(0, bitmap);
 | 
						|
    __syscall(134);
 | 
						|
    sysArgs[4]++;
 | 
						|
  }
 | 
						|
 | 
						|
  // Clear 6th slice
 | 
						|
  sysArgs[2] = 0;
 | 
						|
  __syscall(134);
 | 
						|
 | 
						|
  // Advance position
 | 
						|
  ScreenPos += 6;
 | 
						|
}
 |