pascal UpdateAnalog(int brightness,int contrast, long slotbase) { Fg2DacWrite(0x40, 7, 63 - brightness, slotbase); /* Top of RANGE DAC */ Fg2DacWrite(0x40, 6, 63 - contrast, slotbase); /* difference DAC */ } Fg2DacWrite(int addr,int instr,int data, long slotbase) { int regs[4], value, i; regs[3] = 48; regs[3] = regs[3] | 0x10; /* bring up SCL first (if it was off) */ Fg2SetReg(3,regs[3],slotbase); regs[3] = regs[3] | 0x20; /* bring up SDA (if it was off) */ Fg2SetReg(3,regs[3],slotbase); /* start condition */ regs[3] = regs[3] & ~0x20; /* bring down SDA */ Fg2SetReg(3,regs[3],slotbase); /* send the addr byte */ for(i=0; i<8; i++) { regs[3] = regs[3] & ~0x10; /* bring down SCL */ Fg2SetReg(3,regs[3],slotbase); if(addr & 0x80) regs[3] = regs[3] | 0x20; /* bring up SDA */ else regs[3] = regs[3] & ~0x20; /* bring down SDA */ Fg2SetReg(3,regs[3],slotbase); addr <<= 1; /* shift up the address byte */ regs[3] = regs[3] | 0x10; /* bring up SCL */ Fg2SetReg(3,regs[3],slotbase); } /* get addr ack */ regs[3] = regs[3] & ~0x10; /* bring down SCL */ Fg2SetReg(3,regs[3],slotbase); regs[3] = regs[3] | 0x20; /* bring up SDA */ Fg2SetReg(3,regs[3],slotbase); regs[3] = regs[3] | 0x10; /* bring up SCL */ Fg2SetReg(3,regs[3],slotbase); /* send the instr byte */ for(i=0; i<8; i++) { regs[3] = regs[3] & ~0x10; /* bring down SCL */ Fg2SetReg(3,regs[3],slotbase); if(instr & 0x80) regs[3] = regs[3] | 0x20; /* bring up SDA */ else regs[3] = regs[3] & ~0x20; /* bring down SDA */ Fg2SetReg(3,regs[3],slotbase); instr <<= 1; /* shift up the instruction byte */ regs[3] = regs[3] | 0x10; /* bring up SCL */ Fg2SetReg(3,regs[3],slotbase); } /* get instr ack */ regs[3] = regs[3] & ~0x10; /* bring down SCL */ Fg2SetReg(3,regs[3],slotbase); regs[3] = regs[3] | 0x20; /* bring up SDA */ Fg2SetReg(3,regs[3],slotbase); regs[3] = regs[3] | 0x10; /* bring up SCL */ Fg2SetReg(3,regs[3],slotbase); /* send the data byte */ for(i=0; i<8; i++) { regs[3] = regs[3] & ~0x10; /* bring down SCL */ Fg2SetReg(3,regs[3],slotbase); if(data & 0x80) regs[3] = regs[3] | 0x20; /* bring up SDA */ else regs[3] = regs[3] & ~0x20; /* bring down SDA */ Fg2SetReg(3,regs[3],slotbase); data <<= 1; /* shift up the data byte */ regs[3] = regs[3] | 0x10; /* bring up SCL */ Fg2SetReg(3,regs[3],slotbase); } /* get data ack */ regs[3] = regs[3] & ~0x10; /* bring down SCL */ Fg2SetReg(3,regs[3],slotbase); regs[3] = regs[3] | 0x20; /* bring up SDA */ Fg2SetReg(3,regs[3],slotbase); regs[3] = regs[3] | 0x10; /* bring up SCL */ Fg2SetReg(3,regs[3],slotbase); /* stop condition */ regs[3] = regs[3] & ~0x10; /* bring down SCL */ Fg2SetReg(3,regs[3],slotbase); regs[3] = regs[3] | 0x10; /* bring up SCL */ Fg2SetReg(3,regs[3],slotbase); regs[3] = regs[3] | 0x20; /* bring up SDA */ Fg2SetReg(3,regs[3],slotbase); return; } Fg2SetReg(int index,int value, long slotbase) { char *reg; reg = (char*) (0xF5FE0 + slotbase + index * 4); *reg = value; }