home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 210_01 / rxb.c < prev    next >
Text File  |  1979-12-31  |  2KB  |  88 lines

  1. /* rxb.c--removes most recently loaded xbios module.
  2.    Copyright 7/85 N.T.Carnevale.
  3.    Permission granted for nonprofit use only.
  4.    See my article in the July/August 1986 issue of 
  5.    Micro/Systems Journal pp.72-85.
  6. */
  7.  
  8. #include "printf.h"
  9.  
  10. /* vital definitions */
  11. #include "xb.h"
  12.  
  13. #define VERSION "v.1.2 7/16/85\n\n"
  14.  
  15.  
  16. char *idstring=SIG;
  17.  
  18.  
  19. main()
  20. {
  21.     struct xbhdr *xbintro;
  22.     char *vers,*descr;
  23.  
  24.     printf(VERSION);
  25.     /* find start of suspected module */
  26.     cpmintro=0;
  27.     xbintro=(struct xbhdr *)cpmintro->bdosloc;
  28.     /* now see if the signature is where it should be */
  29.     if (compare(idstring,xbintro->signature,SIGLNTH)) {
  30.         printf("removing xbios from %x\n",(int)xbintro);
  31.         vers = &xbintro->vstart;
  32.         descr = &vers[strlen(vers)+1];
  33.         printf("%s\n%s\n\n",vers,descr);
  34.         interrupt(FALSE); /* disable interrupts */
  35.         remove(xbintro);
  36.         interrupt(TRUE); /* reinstate interrupts */
  37.     }
  38.     else printf("no xbios to remove\n");
  39. }
  40.  
  41.  
  42. boolean compare(s1,s2,num)
  43. /* compare num bytes pointed to by s1 and s2
  44.    return TRUE if identical, otherwise return FALSE */
  45. char s1[],s2[];
  46. int num;
  47. {
  48.     int i;
  49.     boolean equal;
  50.  
  51.     for (i=0,equal=TRUE; (i<num) && equal; i++) 
  52.         equal = s1[i]==s2[i];
  53.     return (equal);
  54. }
  55.  
  56.  
  57. interrupt(choice)
  58. /* if choice TRUE, enables interrupts
  59.    else disables them */
  60. boolean choice;
  61. {
  62.     /* not implemented in this version, 
  63.        since my bios doesn't use interrupts.
  64.        --use inline code if needed */
  65. }
  66.  
  67.  
  68. remove(xbmod)
  69. struct xbhdr *xbmod;
  70. {
  71.     int i;
  72.     struct jumpinstr {
  73.         char jump,    /* the 0xc3 itself */
  74.              *dest;    /* the target address */
  75.     } *xbjmptbl,*biosjmptbl;
  76.  
  77.     /* pick up the start of the next xbios module
  78.        from the one about to be removed */
  79.     printf("new bdos entry will be %x\n",(int)xbmod->oldbdos);
  80.     cpmintro->bdosloc=(char *)xbmod->oldbdos;    /* fix jmp bdos at 5 */
  81.     /* next copy the "old jump table" from the module into the bios */
  82.     xbjmptbl= (struct jumpinstr *)(&xbmod->vstart + 
  83.         (0x00FF & xbmod->otbloffset));    /* mask out hi bits of offset */
  84.     biosjmptbl=(struct jumpinstr *)(cpmintro->wboot);
  85.     for (i=0; i<xbmod->jmpnum; i++)
  86.         (biosjmptbl++)->dest=(xbjmptbl++)->dest;
  87. }
  88.