home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / msdos / sysutl / history.arc / SETUP.ASM < prev   
Assembly Source File  |  1988-03-21  |  2KB  |  117 lines

  1.     INCLUDE RULES.ASI
  2.  
  3. Header@
  4.  
  5. DSeg@
  6. pgmstack dw    ?
  7. their_21 dd    ?
  8. ExtSym@ __brklvl, WORD,    __CDECL__
  9. ExtSym@ lineoff, WORD,    __CDECL__
  10. ExtSym@ lineseg, WORD,    __CDECL__
  11. DSegEnd@
  12.  
  13. ExtProc@    getline, __CDECL__
  14.  
  15. CSeg@
  16.  
  17. PubProc@    setup, __CDECL__
  18.  
  19.   ifdef DEBUG
  20.     mov    lineseg@,cs
  21.     mov    lineoff@,offset line_buffer
  22.     call    getline@
  23.     int    20h
  24. line_buffer    db    128,0,128 dup(?)
  25.   else
  26.     mov    ax,3521h
  27.     int    21h
  28.     mov    word ptr their_21,bx
  29.     mov    word ptr their_21+2,es
  30.  
  31.     mov    dx,offset our_21@
  32.     mov    ax,2521h
  33.     int    21h
  34.  
  35.     mov    dx,__brklvl@
  36.     add    dx,1024            ;stack size.
  37.     mov    pgmstack,dx
  38.     add    dx,15
  39.     shr    dx,1
  40.     shr    dx,1
  41.     shr    dx,1
  42.     shr    dx,1
  43.     mov    ah,31h
  44.     int    21h
  45.  
  46.   endif
  47.  
  48. EndProc@    setup, __CDECL__
  49.  
  50. holdax    dw    ?
  51. holdss    dw    ?
  52. holdsp    dw    ?
  53. holdds    dw    ?
  54.  
  55. ; We could do this in Turbo C, but then we would add the overhead of saving the
  56. ; entire machine state on *every* int 21h.  By doing it ourselves, we can save
  57. ; the state only when our function comes along.
  58.  
  59. PubProc@    our_21, __CDECL__
  60.     pushf
  61.     cmp    ah,0ah            ;buffered input?
  62.     jz    our_21_1
  63.     popf
  64.     jmp    cs:their_21
  65.  
  66. our_21_1:
  67.     mov    cs:holdax,ax
  68.     mov    cs:holdss,ss
  69.     mov    cs:holdsp,sp
  70.     mov    cs:holdds,ds
  71.  
  72.     mov    ax,cs            ;set up ds
  73.     mov    ds,ax
  74.  
  75.     cli                ;no ints while messing with stack
  76.     mov    ss,ax
  77.     mov    sp,pgmstack
  78.     sti                ;ok, now you can interrupt
  79.  
  80.     push    bx            ;save regs
  81.     push    cx
  82.     push    dx
  83.     push    si
  84.     push    di
  85.     push    bp
  86.     push    es
  87.  
  88.     mov    ax,holdds        ;set up for getline
  89.     mov    lineseg@,ax
  90.     mov    lineoff@,dx
  91.     call    getline@
  92.  
  93.     pop    es
  94.     pop    bp
  95.     pop    di
  96.     pop    si
  97.     pop    dx
  98.     pop    cx
  99.     pop    bx
  100.  
  101.     cli                ;no interruptions please
  102.     mov    ss,cs:holdss
  103.     mov    sp,cs:holdsp
  104.     sti                ;ok to interrupt again
  105.  
  106.     mov    ds,cs:holdds
  107.     mov    ax,cs:holdax
  108.     popf
  109.  
  110.     iret
  111.  
  112. EndProc@    our_21, __CDECL__
  113.  
  114. CSegEnd@
  115.  
  116.     end
  117.