home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_06_07 / v6n7081a.txt < prev    next >
Text File  |  1989-09-28  |  7KB  |  224 lines

  1. Microsoft (R) Macro Assembler Version 5.00                  6/23/88 20:28:00
  2.                                                              Page     1-1
  3.  
  4.  
  5.                 ; C device driver startup 
  6.                  PAGE 75,118 
  7.                 ; Philip J. Erdelsky - June 23, 1988 
  8.                  
  9.                 ; request header structure for INIT command 
  10.                  
  11.                 REQ_HEADER      STRUC 
  12.  0000  ??            REQ_HDR_LENGTH  DB    (?) 
  13.  0001  ??            UNIT_CODE       DB    (?) 
  14.  0002  ??            COMMAND_CODE    DB    (?) 
  15.  0003  ????            STATUS          DW    (?) 
  16.  0005  0008[            RESERVED        DB    8 DUP (?) 
  17.         ??            
  18.              ]    
  19.                 
  20.  000D  ??            NUMBER_OF_UNITS DB    (?) 
  21.  000E  ????????            END_OF_DRIVER   DD    (?) 
  22.  0012                REQ_HEADER      ENDS 
  23.                  
  24.  = 8000                ERROR_STATUS = 8000H 
  25.  = 0200                BUSY_STATUS  = 0200H 
  26.  = 0100                DONE_STATUS  = 0100H 
  27.                  
  28.  = 0000                WRITE_PROTECT_VIOLATION             =  0 
  29.  = 0001                UNKNOWN_UNIT                        =  1 
  30.  = 0002                DRIVE_NOT_READY                     =  2 
  31.  = 0003                UNKNOWN_COMMAND                     =  3 
  32.  = 0004                CRC_ERROR                           =  4 
  33.  = 0005                BAD_DRIVE_REQUEST_STRUCTURE_LENGTH  =  5 
  34.  = 0006                SEEK_ERROR                          =  6 
  35.  = 0007                UNKNOWN_MEDIA                       =  7 
  36.  = 0008                SECTOR_NOT_FOUND                    =  8 
  37.  = 0009                PRINTER_OUT_OF_PAPER                =  9 
  38.  = 000A                WRITE_FAULT                         = 10 
  39.  = 000B                READ_FAULT                          = 11 
  40.  = 000C                GENERAL_FAILURE                     = 12 
  41.                  
  42.                  
  43.                 CGROUP    GROUP    CODE,DDSTACK,STACKTOP 
  44.                 DGROUP    GROUP    DATA,UDATA,TDATA 
  45.                  
  46.  0000                CODE    SEGMENT    BYTE PUBLIC 'CODE' 
  47.                     ASSUME    CS:CGROUP 
  48.                  
  49.                 ; device header 
  50.                  
  51.  0000  FFFF FFFF            DW    -1,-1 
  52.  0004  0000                DW    0 
  53.  0006  0036 R                DW    OFFSET CGROUP:STRATEGY_ENTRY 
  54.  0008  0041 R                DW    OFFSET CGROUP:INTERRUPT_ENTRY 
  55.  000A  20 20 20 20 20 20 20        DB    '        ' 
  56.        20            
  57.                  
  58.                 ; command jump table 
  59.                  
  60.                     EXTRN    INIT:NEAR 
  61.                     EXTRN    MEDIA_CHECK:NEAR 
  62.                     EXTRN    BUILD_BPB:NEAR 
  63.                     EXTRN    IOCTL_INPUT:NEAR 
  64.                     EXTRN    INPUT:NEAR 
  65.                     EXTRN    NONDESTRUCTIVE_INPUT:NEAR 
  66.                     EXTRN    INPUT_STATUS:NEAR 
  67.                     EXTRN    INPUT_FLUSH:NEAR 
  68.                     EXTRN    OUTPUT:NEAR 
  69.                     EXTRN    OUTPUT_WITH_VERIFY:NEAR 
  70.                     EXTRN    OUTPUT_STATUS:NEAR 
  71.                     EXTRN    OUTPUT_FLUSH:NEAR 
  72.                     EXTRN    IOCTL_OUTPUT:NEAR         
  73.                  
  74.  0012                COMMAND_JUMP_TABLE: 
  75.  0012  0000 E                DW    OFFSET CGROUP:INIT 
  76. Microsoft (R) Macro Assembler Version 5.00                  6/23/88 20:28:00
  77.                                                              Page     1-2
  78.  
  79.  
  80.  0014  0000 E                DW    OFFSET CGROUP:MEDIA_CHECK          
  81.  0016  0000 E                DW    OFFSET CGROUP:BUILD_BPB            
  82.  0018  0000 E                DW    OFFSET CGROUP:IOCTL_INPUT          
  83.  001A  0000 E                DW    OFFSET CGROUP:INPUT                
  84.  001C  0000 E                DW    OFFSET CGROUP:NONDESTRUCTIVE_INPUT 
  85.  001E  0000 E                DW    OFFSET CGROUP:INPUT_STATUS           
  86.  0020  0000 E                DW    OFFSET CGROUP:INPUT_FLUSH          
  87.  0022  0000 E                DW    OFFSET CGROUP:OUTPUT               
  88.  0024  0000 E                DW    OFFSET CGROUP:OUTPUT_WITH_VERIFY   
  89.  0026  0000 E                DW    OFFSET CGROUP:OUTPUT_STATUS          
  90.  0028  0000 E                DW    OFFSET CGROUP:OUTPUT_FLUSH         
  91.  002A  0000 E                DW    OFFSET CGROUP:IOCTL_OUTPUT         
  92.                  
  93.                 ; These items must be saved in the CODE segment because the must be 
  94.                 ; accessed before the DS register can be loaded 
  95.                  
  96.  002C  00000000            SAVE_POINTER    DD  0 
  97.  0030  0000            SAVE_SP         DW  0 
  98.  0032  0000            SAVE_SS         DW  0 
  99.  0034  0000            DGROUP_ADDRESS  DW  0 
  100.                  
  101.  0036                STRATEGY_ENTRY PROC FAR 
  102.                  
  103.  0036  2E: 89 1E 002C R            MOV    WORD PTR SAVE_POINTER,BX 
  104.  003B  2E: 8C 06 002E R            MOV    WORD PTR SAVE_POINTER+2,ES 
  105.  0040  CB                RET 
  106.                  
  107.  0041                STRATEGY_ENTRY ENDP 
  108.                  
  109.  0041                INTERRUPT_ENTRY PROC FAR 
  110.                  
  111.  0041  50                PUSH    AX 
  112.  0042  53                PUSH    BX 
  113.  0043  51                PUSH    CX 
  114.  0044  52                PUSH    DX 
  115.  0045  55                PUSH    BP 
  116.  0046  56                PUSH    SI 
  117.  0047  57                PUSH    DI 
  118.  0048  1E                PUSH    DS 
  119.  0049  06                PUSH    ES 
  120.  004A  2E: 89 26 0030 R            MOV    SAVE_SP,SP 
  121.  004F  2E: 8C 16 0032 R            MOV    SAVE_SS,SS 
  122.  0054  FA                CLI 
  123.  0055  8C C8                MOV    AX,CS 
  124.  0057  8E D0                MOV    SS,AX 
  125.  0059  BC 0000 R            MOV    SP,OFFSET CGROUP:STACKTOP 
  126.  005C  FB                STI 
  127.  005D  2E: C4 1E 002C R            LES    BX,SAVE_POINTER 
  128.  0062  26: 8A 47 02            MOV    AL,ES:[BX].COMMAND_CODE 
  129.  0066  3C 0C                CMP    AL,12 
  130.  0068  77 2F                JA    BAD_DEVICE_DRIVER_FUNCTION 
  131.  006A  98                CBW 
  132.  006B  8B F0                MOV    SI,AX 
  133.  006D  03 F0                ADD    SI,AX 
  134.  006F  74 30                JZ    INITIALIZE 
  135.  0071  2E: 8E 1E 0034 R            MOV    DS,DGROUP_ADDRESS 
  136.                     ASSUME    DS:DGROUP 
  137.  0076  89 1E 0000 R        IE2:    MOV    REQUEST_HEADER,BX 
  138.  007A  8C 06 0002 R            MOV    REQUEST_HEADER+2,ES 
  139.  007E  2E: FF 94 0012 R            CALL    WORD PTR COMMAND_JUMP_TABLE[SI] 
  140.                     ASSUME    DS:NOTHING 
  141.                  
  142.                     PUBLIC    EXIT 
  143.  0083                EXIT PROC NEAR 
  144.  0083                EXIT ENDP 
  145.                  
  146.  0083  FA                CLI 
  147.  0084  2E: 8B 26 0030 R            MOV    SP,SAVE_SP 
  148.  0089  2E: 8E 16 0032 R            MOV    SS,SAVE_SS 
  149.  008E  FB                STI 
  150.  008F  07                POP    ES 
  151. Microsoft (R) Macro Assembler Version 5.00                  6/23/88 20:28:00
  152.                                                              Page     1-3
  153.  
  154.  
  155.  0090  1F                POP    DS 
  156.  0091  5F                POP    DI 
  157.  0092  5E                POP    SI 
  158.  0093  5D                POP    BP 
  159.  0094  5A                POP    DX 
  160.  0095  59                POP    CX 
  161.  0096  5B                POP    BX 
  162.  0097  58                POP    AX 
  163.  0098  CB                RET 
  164.                  
  165.  0099                INTERRUPT_ENTRY ENDP 
  166.                  
  167.                     PUBLIC    BAD_DEVICE_DRIVER_FUNCTION 
  168.                  
  169.  0099                BAD_DEVICE_DRIVER_FUNCTION: 
  170.  0099  26: C7 47 03 8103        MOV    WORD PTR ES:[BX].STATUS,ERROR_STATUS+DONE_STATUS+UNKNOWN_COMMAND 
  171.  009F  EB E2                JMP    EXIT 
  172.                  
  173.  00A1                INITIALIZE: 
  174.  00A1  B1 04                MOV    CL,4 
  175.  00A3  B8 0000 R            MOV    AX,OFFSET CGROUP:STACKTOP 
  176.  00A6  D3 E8                SHR    AX,CL 
  177.  00A8  8C CA                MOV    DX,CS 
  178.  00AA  03 D0                ADD    DX,AX 
  179.  00AC  8E DA                MOV    DS,DX 
  180.                     ASSUME    DS:DGROUP 
  181.  00AE  2E: 89 16 0034 R            MOV    DGROUP_ADDRESS,DX 
  182.  00B3  26: C7 47 0E 0000 R        MOV    WORD PTR ES:[BX].END_OF_DRIVER,OFFSET DGROUP:TDATA 
  183.  00B9  26: 8C 5F 10            MOV    WORD PTR ES:[BX].END_OF_DRIVER+2,DS 
  184.  00BD  8C 0E 0006 R            MOV    DEVICE_HEADER+2,CS 
  185.  00C1  EB B3                JMP    IE2 
  186.                     ASSUME    DS:NOTHING 
  187.                  
  188.  00C3                CODE    ENDS 
  189.                  
  190.  0000                DDSTACK    SEGMENT WORD PUBLIC 'CODE' 
  191.  0000  0080[                DW    128 DUP (?) 
  192.        ????            
  193.              ]    
  194.                 
  195.  0100                DDSTACK    ENDS 
  196.                  
  197.  0000                STACKTOP  SEGMENT PARA 'CODE' 
  198.  0000                STACKTOP  ENDS 
  199.                  
  200.  0000                DATA        SEGMENT    PARA PUBLIC 'DATA' 
  201.                         PUBLIC    REQUEST_HEADER, DEVICE_HEADER 
  202.  0000  ????            REQUEST_HEADER    DW    (?) 
  203.  0002  ????                    DW    (?) 
  204.  0004  0000            DEVICE_HEADER    DW    0 
  205.  0006  ????                    DW    (?) 
  206.  0008                DATA        ENDS 
  207.                  
  208.  0000                UDATA    SEGMENT WORD PUBLIC 'DATA' 
  209.  0000                UDATA    ENDS 
  210.                  
  211.  0000                TDATA  SEGMENT WORD PUBLIC 'DATA' 
  212.  0000                TDATA  ENDS 
  213.                  
  214.                     END 
  215.  
  216.     195 Source  Lines
  217.     195 Total   Lines
  218.      60 Symbols
  219.  
  220.   50472 + 208216 Bytes symbol space free
  221.  
  222.       0 Warning Errors
  223.       0 Severe  Errors
  224.