⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 load.c

📁 microwindows移植到S3C44B0的源码
💻 C
字号:
/* control character used for download */#define ETX	CNTRL('c')#define ACK	CNTRL('f')#define NAK	CNTRL('u')#define XON	CNTRL('q')#define XOFF	CNTRL('s')unsigned int csum;unsigned int dl_entry;static const unsigned char hextab[256] = {	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,	    255, 255, 255,	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,	    255, 255, 255,	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,	    255, 255, 255,	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255, 255, 255, 255,	255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255,	    255, 255,	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,	    255, 255, 255,	255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255,	    255, 255,	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,	    255, 255, 255,	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,	    255, 255, 255,	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,	    255, 255, 255,	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,	    255, 255, 255,	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,	    255, 255, 255,	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,	    255, 255, 255,	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,	    255, 255, 255,	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,	    255, 255, 255,	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,	    255, 255, 255,};unsigned char ascii_to_bin(unsigned char c){	return hextab[c];}unsigned char read_char_direct(void){	unsigned char c, *cp;	cp = (unsigned char *) 0xbd000020;	while (1) {		if (*(cp + 0x14) & 0x01) {			c = (volatile unsigned char) *cp;			return c;		}		cp++;		cp--;	}}unsigned char get_pair(void){	unsigned char byte;	byte = ascii_to_bin(read_char_direct()) << 4;	byte |= ascii_to_bin(read_char_direct());	csum += byte;	return (byte);}void serial_putc(int ch){	unsigned long temp;	for (temp = 0; temp < 1000; temp++) {	}	*(char *) 0xbd000020 = (char) ch;}int inline serial_getc(void){	return read_char_direct();}int serial_ischar(void){	unsigned char c, *cp;	unsigned count;	cp = (unsigned char *) 0xbd000020;	count = 0;	while (count != 100) {		if (*(cp + 0x14) & 0x01) {			c = (volatile unsigned char) *cp;			return c;		}		cp++;		cp--;		count++;	}	return 0;}int serial_init(void){	return 0;}int galileo_dl(void){#define display_char '.'#define display_error 'E'#define display_error_bad_7 '7'#define display_error_unknown 'U'#define display_error_length 'L'	register int length, address, save_csum;	int i, first, done, eof, reccount, type, client_pc;	int src, dbl_length;	unsigned char *buffptr, databuff[258], tempo;	register int display_counter, chunks, leftovers, putter,	    bytes_per_chunk;	display_counter = 0;	bytes_per_chunk = 16;	csum = 0;	reccount = 1;	for (first = 1, done = 0; !done; first = 0, reccount++) {		while (read_char_direct() != 'S')			continue;		csum = 0;		type = read_char_direct();		length = get_pair();		if (length < 0 || length >= 256) {			*(char *) 0xbd000020 = display_error_length;			//      *(char*)0xbd00000c = display_error_length;			return 0;		}		length--;		switch (type) {		case '0':			while (length-- > 0)				get_pair();			break;		case '3':			address = 0;			for (i = 0; i < 4; i++) {				address <<= 8;				address |= get_pair();				length--;			}			if (address == -1) {				eof = 1;				continue;			}			buffptr = &databuff[0];			dbl_length = length << 1;			chunks = dbl_length / bytes_per_chunk;			leftovers = dbl_length % bytes_per_chunk;			putter = bytes_per_chunk >> 1;			while (chunks--) {				for (i = 0; i < bytes_per_chunk; i++)					databuff[i] = read_char_direct();				src = i = 0;				while (i++ < putter) {					tempo =					    (ascii_to_bin(databuff[src++])					     << 4) |					    ascii_to_bin(databuff[src++]);					csum += tempo;					*(char *) address++ = tempo;				}			}			if (leftovers) {				putter = leftovers / 2;				for (i = 0; i < leftovers; i++)					databuff[i] = read_char_direct();				src = i = 0;				while (i++ < putter) {					tempo =					    (ascii_to_bin(databuff[src++])					     << 4) |					    ascii_to_bin(databuff[src++]);					csum += tempo;					*(char *) address++ = tempo;				}			}			break;		case '7':			address = 0;			for (i = 0; i < 4; i++) {				address <<= 8;				address |= get_pair();				length--;			}			if (address == -1) {				eof = 1;				continue;			}			client_pc = address;			if (length) {				*(char *) 0xbd000020 = display_error_bad_7;				//                      *(char*)0xbd00000c = display_error_bad_7;			}			done = 1;			break;		default:			*(char *) 0xbd000020 = display_error_unknown;			//              *(char*)0xbd00000c = display_error_unknown;			break;		}		save_csum = (~csum) & 0xff;		if ((csum = get_pair()) < 0) {			eof = 1;			continue;		}		if (csum != save_csum) {			*(char *) 0xbd000020 = display_error;			//                *(char*)0xbd00000c = display_error;		} else {			if (display_counter % 50 == 0) {				*(char *) 0xbd000020 = display_char;				display_counter = 0;			}			display_counter++;		}	}	--reccount;	dl_entry = client_pc;	return dl_entry;	/* Success */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -