home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_02_09 / 2n09030a < prev    next >
Text File  |  1991-05-06  |  4KB  |  145 lines

  1. ; DEVICE.ASM
  2. ; Replaces C Startup code for Turbo C 2.0
  3. ; C++ 1.0 With Device Driver code
  4.  
  5. ; define the standard Turbo C segments 
  6. ; in their correct order
  7. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  8.         EXTRN _MAIN:NEAR
  9.         PUBLIC _REQUEST_OFFSET,_MENU_CTL_END,_LEAVE
  10. _TEXT   ENDS
  11.  
  12. _DATA    SEGMENT WORD PUBLIC 'DATA'
  13. _DATA    ENDS
  14.  
  15. _BSS    SEGMENT WORD PUBLIC 'BSS'
  16. _BSS    ENDS
  17.  
  18. ; Add a "HEAP" segment so that we can cheat and dynamically
  19. ; allocate memory even though we have a driver format.
  20.  
  21. _BSSHEAP SEGMENT PARA PUBLIC 'HEAP'
  22.    public __ENDDATA
  23.    __ENDDATA label byte ;hook for dynamic memory allocation
  24. _BSSHEAP ENDS
  25.  
  26. DGROUP  GROUP   _TEXT, _DATA, _BSS, _BSSHEAP
  27.  
  28. _TEXT    SEGMENT
  29.         ORG     00H
  30.         assume cs:_TEXT
  31.  
  32. BEGIN:
  33.  
  34. ;************* DEVICE_HEADER *************;
  35.  
  36. POINTER        DD      -1        ;No more drivers
  37. ATTRIBUTE      DW      08000H    ;Character type 
  38. DEVICE_STRAG   DW      STRATEGY
  39. DEVICE_INT     DW      INTERRUPT
  40. DEVICE_NAME    DB      "MENUCTL$" ;Name for DOS
  41.  
  42. ;-------------------------;
  43.  
  44. REQUEST_HEADER STRUC
  45.  
  46. HEADER_LENGTH  DB      ?
  47. UNIT_CODE      DB      ?
  48. COMMAND_CODE   DB      ?
  49. STATUS         DW      ?
  50. RESERVED       DQ      ?
  51.  
  52. REQUEST_HEADER ENDS
  53.  
  54. DONE           EQU     0000000100000000B   ;Status codes.
  55. UNKNOWN_CMD    EQU     1000000000000011B
  56.  
  57. ;parameter save area
  58.  
  59. _REQUEST_OFFSET DW      ?
  60. REQUEST_SEG    DW      ?
  61. STACK_SEG      DW      ?
  62. STACK_PTR      DW      ?
  63. FIRST_TIME     DB      -1
  64.  
  65. ;              CODE AREA
  66. ;              ---------
  67.  
  68. ;--------------------------------------------------------;
  69. ; The only task of the strategy procedure is to save the ;
  70. ; pointer to the request header.                         ;
  71. ;--------------------------------------------------------;
  72.  
  73. STRATEGY       PROC    FAR
  74.  
  75.                MOV     CS:_REQUEST_OFFSET,BX    
  76.                MOV     CS:REQUEST_SEG,ES       
  77.                ;Request header address is passed in ES:BX.
  78.                RET
  79.  
  80. STRATEGY       ENDP
  81.  
  82. ;--------------------------------------------------------;
  83. ; The interrupt procedure will be called immediately     ;
  84. ; after the strategy.                                    ;
  85. ;--------------------------------------------------------;
  86.  
  87. INTERRUPT      PROC    FAR
  88.  
  89.   PUSH    AX  ;Responsible for all registers.
  90.   PUSH    BX
  91.   PUSH    CX
  92.   PUSH    DX
  93.   PUSH    DS
  94.   PUSHF
  95.  
  96.   MOV     DS,CS:REQUEST_SEG       
  97.   MOV     BX,CS:_REQUEST_OFFSET
  98.           ;Retrieve request header pointer
  99.   OR      STATUS[BX],DONE     ;Tell DOS we are done.
  100.   CMP     COMMAND_CODE[BX],0  ;Is it INIT command?
  101.   JNZ     WRONG_CMD           ;If not, set error and leave
  102.   CMP     CS:FIRST_TIME,0     ;See if first time through
  103.   JZ      WRONG_CMD           ;No, set bad and leave
  104.   MOV     CS:FIRST_TIME,0     ;Reset first time flag
  105.   JMP     SHORT MAKE_STACK    ;Everything ok, do our stuff
  106.  
  107. WRONG_CMD:     
  108.   OR      STATUS[BX],UNKNOWN_CMD  ;Else, exit with confused
  109.   JMP     SHORT DEVICE_EXIT       ; message to DOS.
  110.  
  111. MAKE_STACK:    
  112.   MOV     AX,CS                   ;get cs
  113.   MOV     DS,AX                   ;put it in ds
  114.   MOV     STACK_SEG,SS            ;Save DOS stack.
  115.   MOV     STACK_PTR,SP
  116.   CLI
  117.   MOV     SS,AX                   ;Make new stack.
  118.   MOV     SP,0FFFEH
  119.   STI
  120.  
  121.   JMP     _MAIN                   ;Go do our stuff.
  122.  
  123. _LEAVE:        
  124.   CLI
  125.   MOV     SS,CS:STACK_SEG          ;restore stack seg
  126.   MOV     SP,CS:STACK_PTR
  127.   STI
  128.  
  129. DEVICE_EXIT:   
  130.   POPF                       ;Restore rest of registers.
  131.   POP     DS
  132.   POP     DX
  133.   POP     CX
  134.   POP     BX
  135.   POP     AX
  136.   RET                        ;Far return back to DOS.
  137.  
  138. INTERRUPT      ENDP
  139.  
  140. _MENU_CTL_END LABEL   WORD 
  141.       ; mark the end of DEVICE.ASM in memory
  142.  
  143. _TEXT   ENDS
  144.  
  145.     END    BEGIN