home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #26 / NN_1992_26.iso / spool / alt / msdos / programm / 2709 < prev    next >
Encoding:
Text File  |  1992-11-06  |  2.2 KB  |  112 lines

  1. Xref: sparky alt.msdos.programmer:2709 comp.os.msdos.programmer:10502
  2. Path: sparky!uunet!europa.asd.contel.com!darwin.sura.net!spool.mu.edu!yale.edu!ira.uka.de!datmuc!vincent
  3. From: vincent@datmuc.UUCP (vincent)
  4. Newsgroups: alt.msdos.programmer,comp.os.msdos.programmer
  5. Subject: my_tsr
  6. Message-ID: <1347@datmuc.UUCP>
  7. Date: 11 Nov 92 10:43:00 GMT
  8. Followup-To: alt.msdos.programmer,comp.os.msdos.programmer
  9. Lines: 101
  10.  
  11.  
  12. This is a repost I never got any replys, The Org. Q. was why this code
  13. doesn't work?
  14.  
  15. ---------------------  snip snip -------------------------- makefile
  16.  
  17. CFLAGS = /Fc /Zi /f /Od /Gs /AS /W4 /nologo
  18.  
  19. main.exe : main.obj
  20.     cl /Zi /Fm main.obj
  21.  
  22. .c.obj:
  23.     cl /c $(CFLAGS) $(@B).c
  24.  
  25. ---------------------  snip snip --------------------------- main.c
  26.  
  27. #include    <stdlib.h>
  28. #include    <dos.h>
  29. #include    <bios.h>
  30.  
  31. #define    CODESEG            _based(_segname("_CODE"))
  32. #define MK_FP(seg,ofs)        ((void _far *) ((((long)seg)<<16) + (long)ofs))
  33. #define PARAGRAPHS(x)        ((FP_OFF(x) + 15) >> 4)
  34.  
  35. typedef            void    (interrupt _far *INTVECT) ();
  36.  
  37. struct {
  38.     INTVECT    old_timer;
  39.  
  40.     unsigned char _far * CODESEG tsrstack;
  41.  
  42.     int    oldSP,
  43.         oldSS,
  44.         oldDS,
  45.         ds_save,
  46.         seg_stack,
  47.         off_stack,
  48.         retadd,
  49.         tick_me;
  50. } CODESEG data;
  51.  
  52. void ctimer (void)
  53. {
  54.     data. tick_me++;
  55. }
  56.  
  57. void _interrupt _far new_timer (void)
  58. {
  59.     _asm {
  60.         mov    cs:data. oldSS, ss
  61.         mov    cs:data. oldSP, sp
  62.         mov    cs:data. oldDS, ds
  63.                           ; Load new stack
  64.         mov    ss, cs:data. seg_stack
  65.         mov    sp, cs:data. off_stack
  66.         mov    ds, cs:data. ds_save
  67.  
  68.         mov    bp, sp
  69.  
  70.         call    ctimer
  71.  
  72.         mov    ss, cs:data. oldSS
  73.         mov    sp, cs:data. oldSP
  74.         mov    ds, cs:data. oldDS
  75.  
  76.         mov    bp, sp
  77.     }
  78.     _chain_intr (data. old_timer);
  79. }
  80.  
  81. void main ()
  82. {
  83.     unsigned int memtop, dumy = 0;
  84.  
  85.     data. tick_me = 0;
  86.  
  87.     _dos_freemem (*(short _far *) MK_FP (_psp, 0x2c));
  88.  
  89.     data. tsrstack = malloc (1024);
  90.     data. tsrstack += 1024;
  91.  
  92.     data. seg_stack = FP_SEG (data. tsrstack);
  93.     data. off_stack = FP_OFF (data. tsrstack);
  94.  
  95.     _asm mov cs:data. ds_save, ds
  96.  
  97.     memtop = data. ds_save + PARAGRAPHS (data. tsrstack) - _psp;
  98.  
  99.     _dos_setblock (memtop, _psp, &dumy);
  100.  
  101.     data. old_timer = _dos_getvect (0x08);
  102.     _dos_setvect (0x08, new_timer);
  103.  
  104.     _dos_keep (0, memtop);
  105. }
  106.  
  107. ---------------------------------------------------------------------
  108.  
  109. vincent@datmuc.dat.de
  110.  
  111.  
  112.