void SetV86(void (*f)()) { #ifdef __MSC__ _heapmin(); #endif SetTSS( (TSS *)&v86tss, seg.cs, seg.ds, f, 0x23002L, (unsigned char *) sbrk(0)+2048, seg.ss, stack+STACKSIZE, 0x10); v86tss.tss.iobase = v86tss.iomap -(unsigned char *)&v86tss; memset(v86tss.iomap, 0, sizeof(v86tss.iomap)); v86tss.iomap[8192]=0xff; ProtoTssSel = AllocSel(); SetSegDesc(ProtoTssSel, SegToLinier(seg.ds, (unsigned short) &tss), (long) sizeof(TSS), TypeTSS, SmallSeg, 0); V86TssSel = AllocSel(); SetSegDesc(V86TssSel, SegToLinier(seg.ds, (unsigned short) &v86tss), (long) sizeof(TSS_IO), TypeTSS, SmallSeg, 0); IntHandler = v86int; }
void main(int argc, char *argv[]) { unsigned long i,m,snum; unsigned long bh, addr; unsigned short sel, csel, codesize; struct SREGS seg; void (__far *sieveFunc)(); int (__far *isprimeFunc)(); void sieve(unsigned short tblsel, unsigned long num); int isprime(unsigned short tblsel, unsigned long num); if (argc>1) m = atol(argv[1]); else m = NUM; segread(&seg); codesize=(seg.ds-seg.cs)*16; DPMIRealToProto(); csel = DPMIAllocLDT(); DPMISetRights(csel, TypeCode+0x60, Code386); DPMISetBaseAddr(csel, SegToLinier(seg.cs, 0)); DPMISetLimit(csel, codesize); sieveFunc = (void (__far *)() ) (((unsigned long)csel<<16) + (unsigned short) sieve); isprimeFunc = (int (__far *)() ) (((unsigned long)csel<<16) + (unsigned short) isprime); sel = DPMIAllocLDT(); bh = DPMIAllocBlock(m+1, &addr); DPMISetRights(sel, TypeData+0x60, BigSeg); DPMISetBaseAddr(sel, addr); DPMISetLimit(sel, m+1); sieveFunc(sel, m); snum=0; for (i=2;i<=m;i++) { if (isprimeFunc(sel, i)) { snum++; printf("%lu ", i); } } putchar('\n'); printf("%lu prime numbers in 2..%lu\n",snum,m); DPMIFreeBlock(bh); DPMIFreeLDT(sel); DPMIFreeLDT(csel); ExitToDos(); }