home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <bench.h>
- #include <dos.h>
-
- #define GET_SEG(p) (*((unsigned *)&(p) + 1))
- #define GET_OFF(p) (*((unsigned *)&(p)))
-
- int com_id;
- char far *embuf = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
-
- #ifdef MSC
- void handle24(unsigned, unsigned, unsigned far *);
- #else
- int handle24(unsigned, unsigned, unsigned far *);
- #endif
-
- void bios_errmsg(char *, ...);
- int bios_warning(char *, ...);
- unsigned char get_dpage(void);
- void bios_pos(int, int);
- void bios_poke(int, int, unsigned char, unsigned char, int);
- void get_dregion(int, int, int, int);
- void mk_bioswin(int, int, int, int);
- void put_msg(int, int, char *, int);
- int get_key(void);
- void put_dregion(int, int, int, int);
-
- #ifdef MSC
- void handle24(deverr, errcode, devhdr)
- #else
- int handle24(deverr, errcode, devhdr)
- #endif
- unsigned deverr;
- unsigned errcode;
- unsigned far * devhdr;
- {
- union REGS r;
- char *locus;
- int cts = 0;
-
- r.h.ah = 0x59;
- r.x.bx = 0x00;
-
- int86(0x21, &r, &r);
-
- switch(r.h.ch)
- {
- case 2:
- locus = "Block device";
- break;
- case 3:
- locus = "Network";
- break;
- case 4:
- locus = "Serial device";
- break;
- case 5:
- locus = "Memory related";
- break;
- default:
- locus = "Unknown";
- break;
- }
-
- switch(r.x.ax)
- {
- case 0x0F: /* invalid drive */
- bios_errmsg("Invalid Drive.");
- break;
- case 0x13: /* disk write-protected */
- bios_errmsg("Disk Is Write-Protected.");
- break;
- case 0x15: /* drive not ready */
- case 0x19: /* seek error */
- case 0x1A: /* unknown media type */
- case 0x1B: /* sector not found */
- if (r.h.ch == 2)
- bios_errmsg("Drive Not Ready.");
- else
- {
- bios_errmsg("Write error.");
- #ifdef HMMMMMMM
- #ifdef MSC
- _hardretn(_HARDERR_ABORT);
- #else
- # ifdef __TURBOC__
- hardretn(2);
- # else
- return(2);
- # endif
- #endif
- #endif
- }
- break;
- case 0x1C: /* out of paper */
- bios_errmsg("Printer Out Of Paper.");
- break;
- case 0x1D: /* write fault */
- if (r.h.ch == 4)
- {
- r.h.ah = 0x03;
- r.x.dx = com_id;
- int86(0x14, &r, &r); /* get status of COM port */
-
- if (!(r.h.al & 0x20)) /* no DSR - printer offline */
- {
- bios_errmsg("Printer Offline...");
- #ifdef MSC
- _hardresume(_HARDERR_RETRY);
- #else
- # ifdef __TURBOC__
- hardresume(1);
- # else
- return(1);
- # endif
- #endif
- }
- else if (!(cts = (r.h.al & 0x10))) /* no CTS - retry after cts restored */
- {
- while(!cts) /* loop until cts is restored */
- {
- r.h.ah = 0x03;
- r.x.dx = com_id;
- int86(0x14, &r, &r);
- cts = r.h.al & 0x10;
- }
- #ifdef MSC
- _hardresume(_HARDERR_RETRY);
- #else
- # ifdef __TURBOC__
- hardresume(1);
- # else
- return(1);
- # endif
- #endif
- }
- else
- {
- bios_errmsg("Error writing to COM%d:", com_id + 1);
- #ifdef MSC
- _hardresume(_HARDERR_FAIL);
- #else
- # ifdef __TURBOC__
- hardresume(2);
- # else
- return(2);
- # endif
- #endif
- }
- }
- else
- bios_errmsg("Write Fault (%s).", locus);
- break;
- case 0x1E: /* read fault */
- bios_errmsg("Read Fault (%s).", locus);
- break;
- case 0x1F: /* general failure */
- bios_errmsg("General Failure (%s).", locus);
- break;
- default:
- printf("UNRECOGNIZED EXTENDED ERROR CODE !!!\n");
- printf("Extended Error Code = %2X\n", r.x.ax);
- printf("Error Class Code = %2X\n", r.h.bh);
- printf("Error Locus Code = %d (%s)\n", r.h.ch, locus);
- #ifdef MSC
- _hardresume(_HARDERR_FAIL); /* Fail back to MSDOS */
- #else
- # ifdef __TURBOC__
- hardresume(2);
- # else
- return(2);
- # endif
- #endif
- break;
- }
- #ifdef MSC
- _hardretn(r.x.ax);
- #else
- # ifdef __TURBOC__
- hardretn(r.x.ax);
- # else
- return(r.x.ax);
- # endif
- #endif
- }
-
- void take24()
- {
- #ifdef MSC
- void (*h24)();
- #else
- #ifdef __TURBOC__
- int (*h24)();
- #else
- union REGS r;
- struct SREGS sr;
- #endif
- #endif
-
- h24 = handle24;
-
- #ifdef MSC
- _harderr(h24);
- #else
- # ifdef __TURBOC__
- harderr(h24);
- # else
- r.h.ah = 0x25;
- r.h.al = 0x24;
- sr.ds = GET_SEG(h24);
- r.x.dx = GET_OFF(h24);
- int86x(0x21, &r, &r, &sr);
- # endif
- #endif
- }
-
- unsigned char saveattr[5][40];
- unsigned char savechar[5][40];
-
- unsigned char get_dpage()
- {
- unsigned char dpage;
- union REGS r;
-
- r.h.ah = 0x0f;
- int86(0x10, &r, &r);
- dpage = r.h.bh;
-
- return(dpage);
- }
-
- void bios_pos(row, col)
- int row, col;
- {
- unsigned char dpage;
- union REGS r;
-
- dpage = get_dpage();
-
- r.h.ah = 0x02;
- r.h.bh = dpage;
- r.h.dh = row - 1;
- r.h.dl = col - 1;
- int86(0x10, &r, &r);
- }
-
- void bios_poke(row, col, ch, attr, rep)
- int row, col;
- unsigned char ch, attr;
- int rep;
- {
- unsigned char dpage;
- union REGS r;
-
- dpage = get_dpage();
-
- bios_pos(row, col);
-
- r.h.ah = 0x09;
- r.h.al = ch;
- r.h.bh = dpage;
- r.h.bl = attr;
- r.x.cx = rep;
- int86(0x10, &r, &r);
- }
-
- void get_dregion(row, col, h, w)
- int row;
- int col;
- int h;
- int w;
- {
- int rctr, cctr;
- union REGS r;
- unsigned char dpage;
-
- dpage = get_dpage();
-
- for (rctr = 0; rctr < h; rctr++)
- {
- for (cctr = 0; cctr < w; cctr++)
- {
- bios_pos(row + rctr, col + cctr);
- r.h.ah = 0x08;
- r.h.bh = dpage;
- int86(0x10, &r, &r);
- saveattr[rctr][cctr] = r.h.ah;
- savechar[rctr][cctr] = r.h.al;
- }
- }
- }
-
- void put_dregion(row, col, h, w)
- int row, col, h, w;
- {
- int rctr, cctr;
-
- for (rctr = 0; rctr < h; rctr++)
- for (cctr = 0; cctr < w; cctr++)
- bios_poke(row + rctr, col + cctr, savechar[rctr][cctr], saveattr[rctr][cctr], 1);
- }
-
- void mk_bioswin(row, col, h, w)
- int row, col, h, w;
- {
- int ctr;
-
- bios_poke(row, col, 0xda, colour[REVVID], 1);
- bios_poke(row, col + 1, 0xc4, colour[REVVID], w - 2);
- bios_poke(row, col + w - 1, 0xbf, colour[REVVID], 1);
- for(ctr = 1; ctr < h - 1; ctr++)
- {
- bios_poke(row + ctr, col, 0xb3, colour[REVVID], 1);
- bios_poke(row + ctr, col + 1, 0x20, colour[REVVID], w - 2);
- bios_poke(row + ctr, col + w - 1, 0xb3, colour[REVVID], 1);
- }
- bios_poke(row + h - 1, col, 0xc0, colour[REVVID], 1);
- bios_poke(row + h - 1, col + 1, 0xc4, colour[REVVID], w - 2);
- bios_poke(row + h - 1, col + w - 1, 0xd9, colour[REVVID], 1);
- }
-
- int get_key()
- {
- union REGS r;
- r.h.ah = 0x00;
- int86(0x16, &r, &r);
- return(r.h.al);
- }
-
- void put_msg(row, col, msgtxt, attr)
- int row, col;
- char *msgtxt;
- int attr;
- {
- while(*msgtxt)
- bios_poke(row, col++, *msgtxt++, attr, 1);
- }
-
- void bios_errmsg(char *va_alist, ...)
- {
- va_list ap;
- char *fmt;
- char dispbuff[512];
-
- /*
- * Vararg section for status box
- */
- va_start(ap, va_alist);
- fmt = va_alist;
- vsprintf(dispbuff, fmt, ap);
- get_dregion(10, 21, 5, 40);
- mk_bioswin(10, 21, 5, 40);
- put_msg(11, 21 + (40 - strlen(dispbuff))/2, dispbuff, colour[REVVID]);
- put_msg(13, 34, "Press ENTER...", colour[REVVID]);
- while (get_key() != '\r')
- ;
- put_dregion(10, 21, 5, 40);
- }
-
- int bios_warning(char *va_alist, ...)
- {
- va_list ap;
- char *fmt;
- char dispbuff[512];
- int k;
-
- /*
- * Vararg section for status box
- */
- va_start(ap, va_alist);
- fmt = va_alist;
- vsprintf(dispbuff, fmt, ap);
- get_dregion(10, 21, 5, 40);
- mk_bioswin(10, 21, 5, 40);
- put_msg(11, 21 + (40 - strlen(dispbuff))/2, dispbuff, colour[REVVID]);
- put_msg(13, 32, "Abort or Retry ?", colour[REVVID]);
- bios_poke(13, 32, 'A', colour[NORMAL], 1);
- bios_poke(13, 41, 'R', colour[NORMAL], 1);
- do
- {
- k = get_key();
- } while (k != 'y' && k!= 'Y' && k != 'n' && k != 'N');
-
- put_dregion(10, 21, 5, 40);
- if (k == 'y' || k == 'Y')
- return(1);
- else
- return(0);
- }
-
- #ifdef MAIN24
- main()
- {
- init_w(24, 80);
- std_scr("Hello there!");
- inchar();
- bios_errmsg("Hello again!");
- inchar();
- end_w(TRUE);
- }
- #endif
-