view arch/cons.c @ 40:40af39d064fa

Refactor the arch code Note: the code, as it is now, does not run even though it compiles
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Thu, 07 Apr 2011 22:07:20 -0400
parents
children c75be274ce23
line wrap: on
line source

#include "channel.h"
#include "ebcdic.h"

#include <die.h>

static u32 consch;

int putline(char *buf, int len)
{
	char data[CON_LEN];
	struct orb orb;
	struct ccw ccw;

	if ((len <= 0) || (len > CON_LEN))
		return -1;

	__builtin_memcpy(data, buf, len);
	ascii2ebcdic((u8*) data, len);

	ccw.cmd   = 0x01;
	ccw.flags = 0;
	ccw.count = len;
	ccw.addr  = (u32) (u64) data;

	__builtin_memset(&orb, 0, sizeof(struct orb));
	orb.lpm   = 0xff;
	orb.addr  = (u32) (u64) &ccw;
	orb.f     = 1;

	if (start_sch(consch, &orb))
		die();

	wait_for_io_int();

	return len;
}

int getline(char *buf, int len)
{
	struct orb orb;
	struct ccw ccw;
	int i;

	if ((len <= 0) || (len > CON_LEN))
		return -1;

	wait_for_io_int();

	__builtin_memset(buf, 0, len);
	ccw.cmd   = 0x0a;
	ccw.flags = 0x20;
	ccw.count = len;
	ccw.addr  = (u32) (u64) buf;

	__builtin_memset(&orb, 0, sizeof(struct orb));
	orb.lpm   = 0xff;
	orb.addr  = (u32) (u64) &ccw;
	orb.f     = 1;

	if (start_sch(consch, &orb))
		die();

	wait_for_io_int();

	for(i=0; i<len; i++)
		if (!buf[i])
			break;

	if (i)
		ebcdic2ascii((u8*) buf, i);

	return i;
}