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

📄 fload.c

📁 mips架构的bootloader,99左右的版本 但源代码现在没人更新了
💻 C
字号:
/************************************************************* * File: mon/fload.c * Purpose: fast-format file loader * Author: Phil Bunce (pjb@carmel.com) * Revision History: *	970303	Start of revision history *	980404	Added DL_MFLAG */#include <mon.h>/* * Useful fast-records for testing purposes: *	/ACgAgAA	- addr = a0020000 *	/ZAI		- clear 24 bytes *	/E		- define entry at 'addr' and exit *	AAABAAAC	- 00 00 01 00 00 02 *	/Sfred,X	- symbol = 'addr' *	/BAB		- byte of 01 */#define MSK 0xffUchar exta = ',';Uchar extb = '.';Uchar extc = '/';extern int chksum;extern Ulong nextaddr;extern int blksz;extern int blkinx;/**************************************************************  fload(rec,offset,plen,pFlags)*	load a fast-mode record*/fload(rec,offset,plen,pFlags)Uchar *rec;Ulong offset;int *plen,*pFlags;{int n,i,c,len,s,flags;Uchar adat[8],name[LINESZ];Uchar buf[3];Ulong addr,zcnt,bdat,j;flags = *pFlags;*plen = 0;s = 1;for (len=0;;) {	if (!getrec(adat,rec)) break;	if (flags&DL_MFLAG && !(adat[0] == 'A' || adat[0] == 'S')) 		continue; /* don't load memory */	if (adat[0] == '/') {		switch (adat[1]) {		    case 'D' :  /* this is a driver */			flags |= DL_DFLAG;			break;		    case 'K' :  /* klear checksum (sic) */			chksum = 0;			break;		    case 'C' :  /* compare checksum */			if (!getb64(&zcnt,&adat[2],-2)) return(-1);			chksum &= 0xfff;			if (!(flags&DL_IFLAG) && zcnt != chksum) return(-4);			chksum = 0;			break;		    case 'Z' :  /* zero fill */			if (!getb64(&zcnt,&adat[2],2)) return(-1);			buf[0] = buf[1] = buf[2] = 0;			for (i=0;i<zcnt;i++) {				memwrite(buf,3,flags);				len += 3;				}			break;		    case 'B' :  /* byte */			if (!getb64(&j,&adat[2],2)) return(-1);			buf[0] = j;			memwrite(buf,1,flags);			len++;			break;		    case 'A' :  /* address */			if (!getrec(&adat[4],rec)) return(-2);			if (!getb64(&addr,&adat[2],6)) return(-1);#if 0			if (flags&DL_TFLAG && getGpr(7) == 0) {				topClientMem -= addr;				putGpr(29,clienttos());				nextaddr = topClientMem;				putGpr(7,topClientMem);				}			else nextaddr = addr+offset;#else			nextaddr = addr+offset;#endif			break;		    case 'E' :  /* end */			s = 0;			if (flags&DL_DFLAG) break;			putPc(nextaddr);			break;		    case 'S' :  /* symbol */			i = 2;			for (j=0;;) {				c = adat[i++];				/* chksum += c; */				if (c == ',') break;				name[j++] = c;				if (i >= 4) {					if (!getrec(adat,rec)) return(-2);					i = 0;					}				}			name[j] = 0;			if (!(flags&DL_DFLAG)) /* ignore syms if driver */				if (!newsym(name,nextaddr)) return(-5);			break;		    default : 			return(-3);		    	}		}	else {  /* data */		if (!getb64(&bdat,&adat[0],4)) return(-1);		for (i=2;i>=0;i--) {			buf[i] = bdat&MSK;			bdat>>= 8;			}		memwrite(buf,3,flags);		len += 3;		}	}*plen = len;*pFlags = flags;return(s);}/**************************************************************  getrec(p,curblk)*	get the next 4-byte record (if there are any left)*/getrec(p,curblk)Uchar *p,*curblk;{int i;if (blkinx >= blksz) return(0);for (i=0;i<4;i++) p[i] = curblk[blkinx++];return(1);}/**************************************************************  memwrite(dat,n,flags)*	write the data to memory*/memwrite(dat,n,flags)Uchar *dat;int n,flags;{int i;for (i=0;i<n;i++) {	if (flags&DL_DFLAG) store_byte(nextaddr++,dat[i]);	else write_target(XT_MEM,nextaddr++,dat[i],1);	}}/**************************************************************  getb64(vp,p,n)*	get a number of base-64 digits*	if n < 0 then don't add value to chksum.*/getb64(vp,p,n)Ulong *vp;Uchar *p;int n;{Ulong v;int c,i;v = 0; *vp = 0;for (i=0;i<((n<0)?0-n:n);i++) {	v <<= 6;	c = *p++;	if (c >= 'A' && c <= 'Z') v |= c-'A';	else if (c >= 'a' && c <= 'z') v |= c-'a'+26;	else if (c >= '0' && c <= '9') v |= c-'0'+52;	else if (c == exta) v |= 62; 	else if (c == extb) v |= 63; 	else return(0);	}switch (n) {	case 6 : chksum += (v>>24)&0xfff;	case 4 : chksum += (v>>12)&0xfff;	case 2 : chksum += v&0xfff;	}*vp = v;return(1);}

⌨️ 快捷键说明

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