/* test8259.c Stewart, August 16, 1982 4:05 PM */
/* 8259 is set up except that all interrupts are masked
*/
#include "Lark.h"
#include "Env.h"
extern int AlAInt;
extern int AlBInt;
extern int AlCInt;
extern int AlDInt;
extern int SIOInt;
extern int EncInt;
extern int SLRInt;
extern int SLTInt;
extern mySIOInt();
#define SLRMask 0x0001
#define SLTMask 0x0002
#define EncMask 0x0004
#define SIOMask 0x0008
#define AlAMask 0x0010
#define AlBMask 0x0020
#define AlCMask 0x0040
#define AlDMask 0x0080
int imask;
char leftover;
int any;
int count[8];
int bprint;
main()
{
char c;
bprint = false;
ZeroCount();
IntOff();
IntInit();
InitHandlers();
Init8274();
wf("\r8259 test, ? for help.\r");
IntMask(0);
for (;;) {
c = getchar() & 0177;
switch (c) {
case '0': DoSLRI(); break;
case '1': DoSLTI(); break;
case '2': DoEncI(); break;
case '3': DoSIOI(); break;
case '4': DoAlAI(); break;
case '5': DoAlBI(); break;
case '6': DoAlCI(); break;
case '7': DoAlDI(); break;
case '?': help(); break;
case 'a': clearalog(); break;
case 'e': echo(); break;
case 'b': togbp(); break;
case 'i': lion(); break;
case 'o': lioff(); break;
case 'm': gmask(); break;
case 'p': pcounts(); break;
case 'q': IntOff(); wf("\rQuit!\r"); return;
case 'r': readregs(); break;
case 's': Init8274(); break;
case 'z': ZeroCount(); break;
default: wf("\r unknown command");
};
wfcr();
}; /* end of forever loop */
};
togbp()
{
if (bprint) bprint = false;
else bprint = true;
wf1("bprint = %d\r", bprint);
};
ZeroCount()
{
int i;
wf("zero\r");
for (i=0;i<8;i+=1) count[i] = 0;
};
pcounts()
{
int i;
for (i=0;i<8;i+=1) wf1(" %3d", count[i]);
wfcr();
};
clearalog()
{
outbyte(pioa, 0);
outbyte(pioa, 0x0081);
};
lion()
{
wf("\rinterrupts on");
IntOn();
};
lioff()
{
wf("\rinterrupts off");
IntOff();
};
help()
{
wf("[0..7] software interrupt\r");
wf("a: clear alog, b: toggle printout\r");
wf("e: echo\r");
wf("i: int on, o: int off\r");
wf("m: mask, p: print counts\r");
wf("q: quit, r: 8259 regs, s: Init8274, z: zerocounts\r");
wf("?: help\r");
};
echo()
{
char c;
int i;
IntMask(SIOMask);
for(;;) {
if (avc(1)) {
c = getc(1) & 0177;
putchar(c);
};
if (chav()) {
c = getchar() & 0177;
if (c == 'q') break;
if (uc(c)) { for (i=0;i<9;i+=1) putc(1, c); };
putc(1, c);
};
};
IntMask(0);
};
readregs()
{
wf3("Mask: %02x, IRR: %02x, ISR: %02x\r", ReadIMask(), ReadIRR(), ReadISR());
};
gmask()
{
wf("IMask: ");
imask = gethex();
wf1(" = %02x\r", imask);
IntMask(imask);
};
myAlAInt()
{
count[4] += 1;
if (imask & AlAMask) {
if (bprint) putchar('4');
imask &= not(AlAMask);
IntMask(imask);
};
};
myAlBInt()
{
count[5] += 1;
if (imask & AlBMask) {
if (bprint) putchar('5');
imask &= not(AlBMask);
IntMask(imask);
};
};
myAlCInt()
{
count[6] += 1;
if (imask & AlCMask) {
if (bprint) putchar('6');
imask &= not(AlCMask);
IntMask(imask);
};
};
myAlDInt()
{
count[7] += 1;
if (imask & AlDMask) {
if (bprint) putchar('7');
imask &= not(AlDMask);
IntMask(imask);
};
};
/*
mySIOInt()
{
count[3] += 1;
if (bprint) putchar('3');
imask &= not(SIOMask);
IntMask(imask);
};
*/
myEncInt()
{
count[2] += 1;
if (bprint) putchar('2');
imask &= not(EncMask);
IntMask(imask);
};
mySLTInt()
{
count[1] += 1;
if (bprint) putchar('1');
imask &= not(SLTMask);
IntMask(imask);
};
mySLRInt()
{
count[0] += 1;
if (bprint) putchar('0');
imask &= not(SLRMask);
IntMask(imask);
};
int not(x)
int x;
{
return(x ↑ 0xff);
};
int egetchar() /* getchar with echo */
{
leftover = getchar() & 0177;
putcrchar(leftover);
return(leftover);
};
int gethex()
{
int v;
v = 0;
any = 0;
for (;;) {
egetchar();
if (isdigit(leftover)) {
v = (v<<4);
v += (leftover-'0');
any = 1;
continue;
};
leftover = lc(leftover);
if (leftover>='a' && leftover<='f') {
v = (v<<4);
v += (leftover-'a'+10);
any = 1;
continue;
};
break;
};
return(v);
};
InitHandlers()
{
AlAInt = (int) &myAlAInt;
AlBInt = (int) &myAlBInt;
AlCInt = (int) &myAlCInt;
AlDInt = (int) &myAlDInt;
SIOInt = (int) &mySIOInt;
EncInt = (int) &myEncInt;
SLRInt = (int) &mySLRInt;
SLTInt = (int) &mySLTInt;
};